A marketplace (place aggregating third-party vendors — think Jumia, Glovo Marketplace, Etsy model) brings legal and technical complexities that classic gateways don't solve: vendor KYC, automatic commission, payouts, PSD2 compliance. Stripe Connect solves 95% of these — here's the 2026 implementation.
TL;DR
- Stripe Connect = Stripe's product for multi-vendor marketplaces.
- 3 modes: Express (recommended), Standard, Custom.
- Cost: standard Stripe + 0.25% marketplace surcharge.
- Works for EU, US, UK vendors + Africa extension via Paystack Connect.
Stripe Connect modes
| Mode | Vendor onboarding | KYC | Own Stripe account | Cases |
|---|---|---|---|---|
| Express | Stripe-hosted form | Stripe handles | Yes but limited | Recommended 90% |
| Standard | Full Stripe | Vendor autonomous | Yes complete | Expert vendors |
| Custom | You code everything | You handle | Custom | Very large marketplaces |
Marketplace Connect architecture
`
[Buyer pays €100]
↓
[Stripe charges €100 on platform account]
↓
[€15 application_fee for platform]
↓
[€85 transferred to connected vendor account]
↓
[T+2 payout to vendor bank account]
`
Step 1 — Express vendor onboarding
`ts
import Stripe from 'stripe';
const stripe = new Stripe(process.env.STRIPE_SECRET!);
export async function POST(req: Request) {
const { sellerEmail, sellerCountry } = await req.json();
const account = await stripe.accounts.create({
type: 'express',
country: sellerCountry,
email: sellerEmail,
capabilities: {
card_payments: { requested: true },
transfers: { requested: true },
},
business_type: 'individual',
});
await prisma.seller.update({
where: { email: sellerEmail },
data: { stripeAccountId: account.id },
});
const accountLink = await stripe.accountLinks.create({
account: account.id,
refresh_url: 'https://kolonell.com/seller/onboard?status=refresh',
return_url: 'https://kolonell.com/seller/dashboard',
type: 'account_onboarding',
});
return Response.json({ onboardingUrl: accountLink.url });
}
`
Vendor clicks → Stripe onboarding → enters ID, IBAN, etc. Stripe validates in 1-3 business days.
Step 2 — payment with destination
`ts
export async function POST(req: Request) {
const { items, totalCents, sellerStripeAccountId } = await req.json();
const APPLICATION_FEE_PERCENT = 15;
const applicationFee = Math.round(totalCents * APPLICATION_FEE_PERCENT / 100);
const intent = await stripe.paymentIntents.create({
amount: totalCents,
currency: 'eur',
application_fee_amount: applicationFee,
transfer_data: { destination: sellerStripeAccountId },
payment_method_types: ['card'],
metadata: {
order_id: 'ord_abc123',
seller_id: sellerStripeAccountId,
},
});
return Response.json({ clientSecret: intent.client_secret });
}
`
application_fee_amount = what platform keeps. destination = vendor receives the rest.
Step 3 — multi-vendor in 1 cart
If buyer purchases from 3 vendors in 1 cart, you MUST create 3 separate payments (Stripe doesn't support multi-destination PaymentIntent natively).
`ts
async function checkoutMultiSeller(cart: CartItem[]) {
Need a professional website?
Kolonell builds websites that attract clients, optimized for the Sénégalese market. Free quote in 2 minutes.
const bySellerMap = cart.reduce((acc, item) => {
if (!acc[item.sellerId]) acc[item.sellerId] = [];
acc[item.sellerId].push(item);
return acc;
}, {} as Record
const intents = await Promise.all(
Object.entries(bySellerMap).map(async ([sellerId, items]) => {
const total = items.reduce((s, i) => s + i.unitPriceCents * i.quantity, 0);
const fee = Math.round(total * 0.15);
const seller = await prisma.seller.findUnique({ where: { id: sellerId } });
return stripe.paymentIntents.create({
amount: total,
currency: 'eur',
application_fee_amount: fee,
transfer_data: { destination: seller!.stripeAccountId },
metadata: { sellerId, items: JSON.stringify(items.map(i => i.id)) },
});
})
);
return intents;
}
`
UX: show "Your order will be processed by X vendors" to clarify.
Step 4 — Connect webhooks
`ts
export async function POST(req: Request) {
const body = await req.text();
const sig = (await headers()).get('stripe-signature')!;
const event = stripe.webhooks.constructEvent(body, sig, process.env.STRIPE_CONNECT_WEBHOOK!);
switch (event.type) {
case 'account.updated':
const account = event.data.object as Stripe.Account;
await prisma.seller.update({
where: { stripeAccountId: account.id },
data: {
chargesEnabled: account.charges_enabled,
payoutsEnabled: account.payouts_enabled,
onboardingComplete: account.details_submitted,
},
});
break;
case 'payout.paid':
await notifySellerPayout(event.data.object);
break;
case 'payment_intent.succeeded':
const intent = event.data.object as Stripe.PaymentIntent;
await markOrderPaid(intent.metadata.order_id);
break;
}
return Response.json({ received: true });
}
`
Step 5 — Stripe Connect costs
| Item | Cost |
|---|---|
| Stripe EU card payment | 1.4% + €0.25 |
| Stripe non-EU card | 2.9% + €0.25 |
| Marketplace surcharge | 0.25% |
| EUR payout to EU IBAN | Free |
| USD/other currency payout | $1 + fx spread |
| Express vendor account | Free |
On €100 EU transaction:
- Stripe: €1.65
- Marketplace: €15 (your app fee)
- Vendor receives: €83.35
Real case — Senegal-Diaspora artisans marketplace
Profile: 80 SN/CI artisans selling to EU/US diaspora, 1,200 orders/month, €75 avg ticket.
| Metric | Value |
|---|---|
| Monthly GMV | €90,000 |
| Marketplace fees 12% | €10,800 |
| Stripe fees (~2%) | €1,800 |
| Platform net | €9,000 |
| Vendor payouts (T+2) | €79,200 |
Stripe Express onboarding: ~95% completion. Vendors get first payout <7 days.
Common pitfalls
- Custom mode prematurely — Custom requires complex internal KYC. Express suffices for 90%.
- Underestimating compliance — marketplace has KYC + AML obligations. Stripe handles but read the docs.
- No payout SLA — anxious vendors. Always show "T+2 standard, T+7 startup".
- Currency mismatch — vendor in USD vs EUR payment generates conversions and losses. Align currencies.
- Disputes — under Connect, merchant of record is generally the vendor. Clarify in T&C.
FAQ
Q: Can SN vendors be onboarded Stripe Express?
A: Not in May 2026 directly. Workarounds: go via Paystack Africa (Stripe acquisition) supporting SN, NG, GH, KE. Or have vendor incorporate in CI / Mauritius if volume justifies.
Q: Marketplace = MoR (Merchant of Record)?
A: With Connect Express, the connected account (vendor) is MoR. With Custom, you are (more tax complexity).
Q: Max Stripe commission?
A: No explicit cap. But Stripe can suspend a marketplace if app_fee > 30-50% systematically (perceived abusive).
Conclusion
Stripe Connect is the reference marketplace infra in 2026. Express mode is enough for 95% of African marketplaces with CI / Mauritius / EU / US vendors. Initial dev is 3-6 weeks but allows scaling without re-architecting for the first years. For purely African vendors outside CI: combine with Paystack Connect.
Mohamed Bah
Fondateur, Kolonell
Passionate about digital and entrepreneurship in Africa, Mohamed has been helping Sénégalese businesses with their digital transformation since 2020. Founder of Kolonell, he believes every SME deserves a professional and accessible online présence.

