Most first-version marketplaces I review track money with a vendor_balance column and UPDATE ... SET balance = balance + ? . It works until a partial refund lands after a payout, a chargeback arrives weeks later, or a webhook is delivered twice. Then nobody can explain why a vendor was paid more than they earned.
At Loop Origin we build marketplace and e-commerce platforms on Laravel, Vue and Node, and the payment side is where I spend the most review time. This is the architecture I use: split payments, a double-entry commission ledger, payouts with holds, refunds and chargebacks, idempotency and daily reconciliation.
How should a multi-vendor marketplace handle split payments and payouts?
Direct answer: Charge the buyer once, record every movement as balanced double-entry ledger lines (buyer funds, vendor payable, platform commission, processor fees), and pay vendors from their ledger balance after a hold period.…