Lewati ke konten utama

Money Flow

Where every rupiah goes. SEKEN earns from three sources per transaction. Sellers pay zero commission. Buyers pay item price plus fees that fund protection, shipping, and payment processing.

The full flow (sankey)

Checkout breakdown, IDR 120,000 item example

ComponentAmountGoes to
Item priceIDR 120,000Escrow → seller on completion
Forward shippingIDR 22,000Biteship 20k + SEKEN markup 2k
Buyer Protection FeeIDR 6,500SEKEN revenue (flat fee)
AsuransiIDR 1,000Biteship insurance
Biaya pembayaranIDR 2,500Xendit 1.5k + SEKEN markup 1k
Total checkoutIDR 152,000,

SEKEN revenue per transaction

Net ~IDR 10,065 per completed transaction, from three markup streams (gross ~IDR 11,000 before Xendit/Biteship processing costs):

StreamAmountSource
Buyer Protection FeeIDR 6,500Flat fee on every order
Shipping markupIDR 2,000Added to Biteship rate
Payment fee markupIDR 2,500Added to Xendit fee
Net SEKEN revenue~IDR 10,065per transaction (gross ~IDR 11,000)

The buyer-facing Buyer Protection Fee is a flat IDR 10,000 (proteksi 6,500 + pembayaran 2,500 + asuransi 1,000), live in production, not a temporary state.

Three principles

1. Sellers pay zero commission, forever

Permanent business decision, type-enforced at the database layer via BUG-1 and BUG-2 regression tests. Reintroducing total_commission is a TypeScript compile error. This is non-negotiable.

2. Every party pays for what they used

  • Buyers pay for the item, shipping, and protection
  • Sellers receive 100% of listing price
  • Biteship gets paid for shipping
  • Xendit gets paid for processing
  • SEKEN earns service fees

3. Protection fee is service revenue, not insurance

The IDR 6,500 BPF is the price of dispute resolution and platform safety. It's earned whether or not a dispute occurs, like a credit card processing fee, not an insurance premium.

Escrow logic

Item price held in fin_seller_balances from payment confirmation until completion:

Disbursement to seller

When order reaches COMPLETED:

  1. fin_disbursement row created with status pending
  2. Maker-checker review on amounts ≥ IDR 500,000
  3. Finance admin approves via cuan portal
  4. Funds transferred to seller's bank via Xendit
  5. Status updated to disbursed
  6. Seller receives notification

Maker-checker rule: Disbursements ≥ IDR 500,000 require approval from a different finance admin than the one who initiated. Prevents single-actor fraud.

Boost pricing

Separate revenue stream from per-transaction fees. Sellers pay per-day for visibility.

ProductPrice/dayPrice/week (7d)
Homepage SpotlightIDR 25,000IDR 175,000
Search BoostIDR 15,000IDR 105,000
Email RecommendationIDR 50,000IDR 350,000

Pricing to refine: These are launch prices. Will be A/B tested and adjusted based on uptake and ROI for sellers.

Cost structure

What SEKEN doesn't keep:

Pass-throughGoes to
Item priceSeller
Biteship base shipping rateBiteship
AsuransiBiteship insurance product
Xendit base payment feeXendit

Cuan portal, financial command center

All money flow is visible in cuan.pasarseken.id:

  • Today's GMV, MTD Revenue, Active Sellers, Orders Today
  • Platform Revenue Breakdown (Commission, Boost, Premium)
  • Total Platform Revenue
  • Disbursement Queue with maker-checker
  • Fraud Alerts
  • Net Revenue Reconciliation
  • Xero Sync (🟡 placeholder)
  • Audit Log

See Cuan Portal for full module map.

Future financial separation

Currently cuan is bundled in the main pasarseken repo. Future state separates the finance module entirely:

See Cuan Portal for migration plan.

Where to look in the codebase

What you wantWhere it lives
Fee calculationdomain/finance/CalculateOrderFees.ts
Escrow managementdomain/finance/EscrowManager.ts
Disbursement creationdomain/finance/CreateDisbursement.ts
Maker-checkerdomain/finance/MakerCheckerPolicy.ts
Boost pricingdomain/promotions/BoostPricing.ts
Cuan dashboardsrc/app/pages/cuan/FinancesDashboard.tsx

Next: Database Schema →