nes-agency.com
Contact

← All notes · Engineering · April 10, 2026 · 4 min read

Stripe Connect for marketplaces: the four things we wish we knew on day one

We have shipped four marketplaces on Stripe Connect over the last two years. Each one started with the same week of confusion about which account type to pick, how fees actually flow, and what to do about KYC. The Stripe docs are good. The docs are also enormous. This post is the short version of what we wish someone had told us at the start.

1. Pick the account type with eyes open

Connect has three flavors: Standard, Express, and Custom. The choice has consequences you cannot easily reverse, so think hard before you commit.

Standard gives the seller a full Stripe account. They see the Stripe dashboard, they can issue refunds, they get Stripe email notifications. This is great if your sellers are sophisticated and you want minimal liability. It is bad if your sellers expect a clean white-label experience.

Express hides most of Stripe behind your branding, but still leaks "powered by Stripe" in a few places (onboarding flow, statement descriptor). For most B2B marketplaces this is the sweet spot. We default to this unless there is a reason not to.

Custom is full white-label. You own the entire seller experience, including dispute responses, payout management, and the legal complexity of being closer to a payment facilitator. We have only recommended Custom once, for a client with a dedicated payments team. The maintenance cost is real.

2. Application fees are simpler than they look, until they aren't

Stripe gives you two ways to take a platform cut: application_fee_amount on the charge, or a separate transfer reversal. For 95% of marketplaces, application_fee_amount is correct. It's atomic, it shows up cleanly in reporting, and the money lands in your platform balance automatically.

The edge case where you need transfer reversals: marketplaces where the platform fee can change after the fact (refunds, partial refunds, disputes that flip the merchant's share). If you have any chance of doing that, structure your fee logic around it from day one. Retrofitting later is painful.

One pitfall we keep seeing: teams forget that Stripe's processing fee is taken out of the charge before the application fee. If you charge $100 with a $5 platform fee, Stripe takes its 2.9% + $0.30 first, then your $5, and the seller gets the remainder. Get the math right in your seller-facing dashboard or you will eat support tickets forever.

3. Webhooks: expect five times the volume you think

Connect generates a lot of webhooks per transaction. A single successful charge can produce charge.succeeded, application_fee.created, balance.available (eventually), transfer.created, and a handful of account.updated events for the connected seller.

Two things matter here. First, your webhook handler has to be idempotent. Stripe will deliver the same event more than once during their normal retry behavior. Use the event ID as a dedup key in your database and have the handler short-circuit on repeats.

Second, plan capacity. We have seen handlers that worked fine in dev fall over at 50 transactions per minute because they were doing synchronous external API calls inside the webhook receiver. Push anything slow into a queue, ack the webhook fast.

4. KYC failures are the silent killer

This is the single biggest thing we wish we had instrumented on day one. When a seller fails KYC (missing documents, address mismatch, sanctioned country), they don't get a popup. They just can't accept payouts. They will show up in your dashboard as "active" but money flows nowhere.

The fix is to listen for account.updated events and check the requirements field. If currently_due or past_due is non-empty, that seller needs to do something. We surface this in our internal admin as a red banner: "12 sellers blocked on KYC, oldest is 23 days." Without that view, sellers drift, you lose them, and they don't tell you why.

We also send a single email at 7 days and another at 14, with a deep link into Stripe's hosted re-verification page. Conversion on the second email is about 40%, which is significantly more revenue saved than the engineering cost of building it.

Closing

Stripe Connect is the right answer for almost every marketplace we have seen. It is also the most opinion-loaded product in the Stripe lineup. The four choices above will save you a quarter of engineering time if you make them deliberately. The Stripe team is also genuinely responsive: if your case is unusual, email support@stripe.com with detail, not "help me build a marketplace." You usually get a thoughtful reply within a day.

Got a topic or a build? Tell us.

Book an intro call