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
This guide is part of the Paystack split payments guide.
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