E-commerce12 min read

Stripe Connect multi-vendor marketplace: architecture + 2026 deployment

Mohamed Bah·Fondateur, Kolonell
May 13, 2026
Share:
Stripe Connect multi-vendor marketplace: architecture + 2026 deployment

Stripe Connect multi-vendor marketplace: architecture + 2026 deployment

E-commerce

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

ModeVendor onboardingKYCOwn Stripe accountCases
ExpressStripe-hosted formStripe handlesYes but limitedRecommended 90%
StandardFull StripeVendor autonomousYes completeExpert vendors
CustomYou code everythingYou handleCustomVery 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

ItemCost
Stripe EU card payment1.4% + €0.25
Stripe non-EU card2.9% + €0.25
Marketplace surcharge0.25%
EUR payout to EU IBANFree
USD/other currency payout$1 + fx spread
Express vendor accountFree

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.

MetricValue
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.

Tags:#Stripe Connect#Marketplace#Multi-Vendor#Architecture#API#Africa
Share:

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.