A creator payout system aggregates revenue from multiple sources (tips, subscriptions, product sales), tracks each creator running balance, applies a minimum payout threshold, and disburses to their bank account or mobile wallet via Paystack transfers. The key difference from vendor payouts is revenue diversity: creators earn from many small transactions rather than discrete orders.
Creator platforms differ from marketplaces in how revenue accumulates. A marketplace vendor gets paid per order. A creator earns from a mix of sources, often many small amounts that add up over time.
Common creator revenue streams:
async function aggregateCreatorEarnings(creatorId, periodStart, periodEnd) {
var tips = await db.tips.sumByCreator(creatorId, periodStart, periodEnd);
var subscriptions = await db.subscriptions.sumByCreator(creatorId, periodStart, periodEnd);
var sales = await db.sales.sumByCreator(creatorId, periodStart, periodEnd);
var adRevenue = await db.adShares.sumByCreator(creatorId, periodStart, periodEnd);
var gross = tips + subscriptions + sales + adRevenue;
var platformCommission = Math.round(gross * 0.15); // 15% platform take
var net = gross - platformCommission;
return {
tips: tips,
subscriptions: subscriptions,
sales: sales,
adRevenue: adRevenue,
gross: gross,
platformCommission: platformCommission,
net: net,
};
}
Without a minimum threshold, you end up sending hundreds of 50 KES payouts, each incurring a transfer fee. The fee might be a significant percentage of the payout amount. Thresholds protect both you and the creator.
var MINIMUM_PAYOUT = {
NGN: 500000, // 5,000 NGN
KES: 100000, // 1,000 KES
GHS: 50000, // 500 GHS
};
async function isEligibleForPayout(creatorId, currency) {
var balance = await getCreatorBalance(creatorId);
var minimum = MINIMUM_PAYOUT[currency] || 500000;
return {
eligible: balance >= minimum,
currentBalance: balance,
minimum: minimum,
shortfall: Math.max(0, minimum - balance),
};
}
Show the minimum threshold on the creator dashboard. "You need 1,000 KES to request a withdrawal. Current balance: 750 KES." This sets expectations and reduces support tickets from creators wondering why they cannot withdraw.
Some platforms use tiered thresholds: new creators have a higher minimum (to prevent fraud), while established creators with a track record have lower minimums or no minimum at all.
Get weekly developer tips
Join 25,000+ developers. Practical guides, job tips, and new content — straight to your inbox.
No spam. Unsubscribe anytime.
// Ledger entries for creator balance tracking
// Each earning event and each payout creates a ledger entry
async function recordEarning(creatorId, amount, source, sourceId) {
await db.creatorLedger.create({
creatorId: creatorId,
type: 'credit',
amount: amount,
source: source, // 'tip', 'subscription', 'sale', 'ad_revenue'
sourceId: sourceId,
timestamp: new Date(),
});
}
async function recordPayout(creatorId, amount, reference) {
await db.creatorLedger.create({
creatorId: creatorId,
type: 'debit',
amount: amount,
source: 'payout',
sourceId: reference,
timestamp: new Date(),
});
}
async function getCreatorBalance(creatorId) {
var credits = await db.creatorLedger.sumByType(creatorId, 'credit');
var debits = await db.creatorLedger.sumByType(creatorId, 'debit');
return credits - debits;
}
A ledger-based approach gives you a complete audit trail of every earning and every payout for each creator. If a creator disputes their balance, you can show them every transaction that contributed to it. This transparency is critical for creator trust.
// Scheduled: run biweekly for all eligible creators
async function processScheduledCreatorPayouts() {
var creators = await db.creators.findActive();
var payouts = [];
for (var i = 0; i < creators.length; i++) {
var creator = creators[i];
var balance = await getCreatorBalance(creator.id);
var minimum = MINIMUM_PAYOUT[creator.currency] || 500000;
if (balance >= minimum && creator.paystackRecipientCode) {
payouts.push({
creatorId: creator.id,
amount: balance,
recipient: creator.paystackRecipientCode,
reason: 'Creator earnings payout',
reference: 'creator_' + creator.id + '_' + formatDate(new Date()),
});
}
}
if (payouts.length > 0) {
await executeBulkTransfers(payouts, payouts[0].currency || 'NGN');
for (var j = 0; j < payouts.length; j++) {
await recordPayout(payouts[j].creatorId, payouts[j].amount, payouts[j].reference);
}
}
}
// On-demand: creator requests withdrawal from their dashboard
async function creatorWithdrawal(creatorId, amount) {
var balance = await getCreatorBalance(creatorId);
var minimum = MINIMUM_PAYOUT[creator.currency] || 500000;
if (amount > balance) {
throw new Error('Amount exceeds available balance');
}
if (amount < minimum) {
throw new Error('Amount below minimum payout threshold');
}
var creator = await db.creators.findById(creatorId);
var reference = 'withdrawal_' + creatorId + '_' + Date.now();
await initiateTransfer(
creator.paystackRecipientCode,
amount,
'Creator withdrawal',
reference
);
await recordPayout(creatorId, amount, reference);
}
Offering both scheduled and on-demand payouts is the best creator experience. Scheduled payouts ensure creators get paid regularly without having to think about it. On-demand withdrawals give them control when they need money quickly. For the vendor portal design, see building a vendor payout portal on Paystack.
Creators want to see their money growing. A good dashboard shows earnings by stream, the platform commission, the net balance, and payout history. Break down earnings by source so creators can see which content or products generate the most revenue.
Key metrics to show: total earnings this month, earnings by stream (tips vs subscriptions vs sales), platform commission, net available for withdrawal, next scheduled payout date and estimated amount, and recent payout history with statuses.
Real-time updates matter. When a fan sends a tip, the creator should see their balance increase immediately on their dashboard. This creates a direct feedback loop between audience engagement and earnings, which motivates creators to keep producing content.
In many African jurisdictions, platforms that pay creators are required to withhold tax on earnings above certain thresholds. The specific rules vary by country and the nature of the creator relationship (independent contractor vs employee).
Common considerations:
The Paystack transfer amount should be the net amount after withholding. Your platform handles the tax calculation and remittance separately. Consult a tax advisor for the specific requirements in your jurisdiction.
KES 2,999
The definitive guide to building payment systems with Paystack — from your first transaction to production-grade payment infrastructure across Africa. 9 modules, 47 lessons. Free preview available.
Start Paystack Course