Bonaventure OgetoBy Bonaventure Ogeto|

Commission Models on Paystack Splits

For percentage commission: set percentage_charge on the subaccount to the vendor's share (e.g., 80%) — your platform keeps the 20% residual. For flat service fee: pass transaction_charge in kobo in the transaction initialize call. For tiered commission: calculate the vendor share dynamically in your backend before initializing. Use bearer: "account" so the Paystack processing fee comes from your platform share.

Percentage Commission

The standard model for most marketplaces. Vendor gets a percentage share; your platform keeps the rest.

// Vendor gets 80%, platform keeps 20%
// Set percentage_charge = 80 on the subaccount when creating it

app.post('/api/checkout', async (req, res) => {
  var { vendorSubaccountCode, amount, email } = req.body;
  var response = await fetch('https://api.paystack.co/transaction/initialize', {
    method: 'POST',
    headers: { Authorization: 'Bearer ' + process.env.PAYSTACK_SECRET_KEY, 'Content-Type': 'application/json' },
    body: JSON.stringify({
      email,
      amount: amount * 100,
      subaccount: vendorSubaccountCode,
      bearer: 'account', // Platform absorbs Paystack processing fee
      reference: 'order_' + Date.now(),
    }),
  });
  var data = await response.json();
  res.json({ authorization_url: data.data.authorization_url });
});

On NGN 10,000 with 20% commission: vendor gets NGN 8,000 — platform earns NGN 2,000 minus Paystack fee.

Flat Service Fee

Best for delivery apps and bookings where a fixed platform fee makes more sense than a percentage.

var SERVICE_FEE_KOBO = 20000; // NGN 200

body: JSON.stringify({
  email,
  amount: amount * 100,
  subaccount: vendorSubaccountCode,
  transaction_charge: SERVICE_FEE_KOBO, // Your flat fee
  bearer: 'account',
  reference: 'order_' + Date.now(),
})

Tiered Commission by Vendor Volume

function getVendorShare(vendor) {
  var monthly = vendor.monthly_sales_ngn;
  if (monthly >= 5000000) return 92; // Top sellers: 8% commission
  if (monthly >= 1000000) return 88; // Mid-tier: 12% commission
  return 85;                          // New sellers: 15% commission
}

// Pass calculated share per transaction
body: JSON.stringify({
  email,
  amount: amount * 100,
  subaccount: vendor.subaccount_code,
  percentage_charge: getVendorShare(vendor), // Override subaccount default
  bearer: 'account',
  reference: 'order_' + Date.now(),
})

Learn More

Key Takeaways

  • Percentage commission: set subaccount percentage_charge to vendor share (e.g., 85%). Your platform earns the 15% residual.
  • Flat service fee: pass transaction_charge (in kobo) — your platform earns that fixed amount regardless of order size.
  • Tiered commission: calculate vendor percentage dynamically in your backend based on sales volume, then pass it per transaction.
  • Set bearer: "account" so the Paystack processing fee comes from your commission, not the vendor's share.
  • Store commission rates in a database tiers table — never hardcode them into transaction logic.
  • For multi-vendor carts, use a Transaction Split group (split_code) to handle multiple vendor shares in one transaction.

Frequently Asked Questions

Can I override the default commission rate per transaction?
Yes. Pass percentage_charge or transaction_charge directly in the transaction initialize call. This overrides the default set on the subaccount for that specific transaction only.
How do I account for Paystack processing fees in my commission?
With bearer: "account", Paystack fees come from your platform residual. At 20% commission and 1.5% Paystack fee, your net platform revenue is roughly 18.5% of the transaction, not exactly 20%.
Can I charge vendors a monthly subscription fee on top of per-transaction commission?
Yes, but handle this separately. Use charge_authorization on the vendor's stored card for the monthly fee — this is a separate transaction from the per-order split.
What if I set both percentage_charge and transaction_charge?
Paystack treats them differently. percentage_charge gives the subaccount a percentage (your platform keeps the rest). transaction_charge gives your platform a fixed amount (the subaccount gets the rest). Use only one per transaction.

Ready to build real-world apps?

Join the McTaba Labs full-stack marathon (4 months full-time · 6 months part-time). Learn M-Pesa, USSD, and WhatsApp engineering while shipping 8 production apps.

Apply to the McTaba Marathon