Back to BlogArchitecture & Engineering

Stripe Connect for Marketplaces: Express vs Custom, Fees and Payouts

Rupak Amin

Founder & Lead Engineer, RAITHub

10 min read

For most marketplaces, use Stripe-hosted onboarding with Express-style accounts and destination charges. Stripe verifies each seller, you keep your commission as an application fee, and Stripe pays sellers out. Use separate charges and transfers only when one order pays several sellers. If you set your own pricing, Connect adds $2 per active account a month and 0.25% + 25¢ per payout.

This guide is for founders and engineers choosing a Connect setup before the first line of payment code. Every fact below is from Stripe's own documentation and pricing pages, checked on 29 September 2026. One thing has changed that many older tutorials miss: Stripe now calls Standard, Express and Custom legacy account types, and recommends configuring accounts by their properties instead. The old names are still the clearest way to explain the choices, so this guide uses both.

What are Standard, Express and Custom accounts in Stripe Connect?

They are three bundles of the same four decisions: who onboards and verifies the seller, which dashboard the seller gets, who pays Stripe's fees, and who carries losses when a seller's balance goes negative. Stripe's comparison, summarised (Stripe: connected account types):

StandardExpressCustom
Integration effortLowestLowSignificantly higher
Onboarding and identity checks (KYC)StripeStripePlatform or Stripe
Seller's dashboardFull Stripe DashboardExpress DashboardNone; you build it
Dispute liabilitySeller on direct charges; platform on destination chargesPlatformPlatform
Charge typesDirectDestination, separate charges and transfersDestination, separate charges and transfers
New compliance requirements handled automaticallyYesYesNo
Typical fitSellers who already run online businessesMost marketplacesFully white-labelled platforms with engineering to spare

Stripe's own examples: Express suits home-rental and ride-hailing marketplaces; Standard suits store builders and SaaS tools whose users are established businesses. An account's type cannot be changed after it is created, so this choice is worth getting right first.

What replaces the account types?

Controller properties on the Accounts API, and the newer Accounts v2 API. Each legacy type maps to four settings (Stripe: migrate to controller properties):

Legacy typelosses.paymentsfees.payerrequirement_collectionstripe_dashboard.type
Standardstripeaccountstripefull
Expressapplicationapplicationstripeexpress
Customapplicationapplicationapplicationnone

Read requirement_collection as "who does KYC". With stripe, Stripe collects and re-collects identity information as rules change. With application, your platform does, and Stripe warns that collecting government IDs and tax numbers yourself brings extra regulatory and security requirements. For a marketplace without a compliance team, that one setting is the strongest argument for Express-style accounts.

Which charge type should a marketplace use?

Destination charges when each order has one seller; separate charges and transfers when an order has several sellers, or when you take payment before you know who will deliver. Direct charges suit SaaS platforms whose users sell to their own customers (Stripe: charges in Connect).

Charge typeWhere the payment landsWho pays Stripe feesRefunds and disputes debitUse it when
DirectSeller's balanceConfigurableSeller's balanceCustomers buy from the seller, often unaware of your platform
DestinationPlatform, then transferred to one seller at oncePlatformPlatform's balanceOne seller per order: rentals, services, lessons
Separate charges and transfersPlatform; you create transfers laterPlatformPlatform's balanceA multi-seller cart, or the seller is not known at payment time

With both indirect types, Stripe debits your platform for refunds and disputes. You can reverse the transfer to recover the seller's share, but if the seller's balance is empty, the loss is yours until you collect it. Price that risk into your commission.

How do you set up Connect for a marketplace in code?

Three calls cover the common path: create the seller's account, send them to Stripe-hosted onboarding, and charge with a destination. A minimal TypeScript sketch using the official stripe Node library; parameter names are from Stripe's docs linked above.

import Stripe from 'stripe'

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!)

// 1. A seller account with Express-style behaviour: Stripe does KYC,
//    the platform pays fees and carries losses, seller gets the Express Dashboard.
export async function createSeller(country: string) {
  return stripe.accounts.create({
    country,
    controller: {
      fees: { payer: 'application' },
      losses: { payments: 'application' },
      stripe_dashboard: { type: 'express' },
    },
    capabilities: { transfers: { requested: true } },
  })
}

// 2. Stripe-hosted onboarding: Stripe collects identity and bank details.
export async function onboardingLink(accountId: string) {
  const link = await stripe.accountLinks.create({
    account: accountId,
    type: 'account_onboarding',
    refresh_url: 'https://example.com/sellers/onboarding/retry',
    return_url: 'https://example.com/sellers/onboarding/done',
  })
  return link.url
}

// 3. A destination charge: $100.00 order, 15% commission kept by the platform.
export async function chargeOrder(orderId: string, sellerAccountId: string) {
  return stripe.paymentIntents.create(
    {
      amount: 10000, // smallest currency unit: cents
      currency: 'usd',
      automatic_payment_methods: { enabled: true },
      application_fee_amount: 1500,
      transfer_data: { destination: sellerAccountId },
      metadata: { orderId },
    },
    { idempotencyKey: 'order-' + orderId },
  )
}

For a multi-seller cart, charge the full amount on the platform with a transfer_group, then create one transfer per seller. Setting source_transaction to the charge ID makes each transfer wait until that charge's funds are available, instead of failing when your balance is short (Stripe: separate charges and transfers):

// After payment_intent.succeeded: pay each seller their share of order 1042.
export async function paySellers(chargeId: string, shares: { accountId: string; amount: number }[]) {
  for (const share of shares) {
    await stripe.transfers.create(
      {
        amount: share.amount,
        currency: 'usd',
        destination: share.accountId,
        transfer_group: 'ORDER_1042',
        source_transaction: chargeId,
      },
      { idempotencyKey: 'transfer-1042-' + share.accountId },
    )
  }
}

The idempotency keys matter. Webhooks are retried, and a handler that runs twice must not pay a seller twice. The pattern is explained in idempotency in API design.

What does Stripe Connect cost?

It depends on who sets the pricing. If Stripe handles pricing for your sellers, the platform pays no Connect fees and Stripe charges sellers directly. If you handle pricing, you pay per active account and per payout (Stripe Connect pricing). Card processing is separate: 2.9% + 30¢ for a domestic US card, with 1.5% more for international cards and 1% if currency conversion is needed (Stripe pricing).

Connect fee (you handle pricing)Price
Monthly active account (one that receives a payout that month)$2 per account
Payout sent0.25% + 25¢
Instant Payouts1% of payout volume
Cross-border payoutsFrom 0.25% of payout volume
Account debits1.5% of debit volume

A worked example with those rates: a $100 order by a US card, a destination charge with a $15 application fee. The platform receives $100, Stripe debits $3.20 in processing, and $85 goes to the seller, so the platform nets $11.80. If that seller is paid out once a week and sells ten such orders, the $850 payout costs 0.25% + 25¢, about $2.38, plus $2 for the month the account is active. Weekly payouts over a month add up; a monthly schedule costs less in payout fees but makes sellers wait.

How do payouts to sellers work?

By default, a connected account's balance is paid out on a daily rolling basis. With Express-style accounts, your platform can set the schedule, make manual payouts, offer instant payouts, or hold funds in the platform balance when you use destination charges or separate transfers (Stripe: payouts to connected accounts). Standard payouts typically arrive 1–2 business days after submission; instant payouts usually within 30 minutes.

Track payouts with webhooks: payout.paid and payout.failed. When a payout fails, Stripe disables that bank account until it is updated, so a failed payout needs a message to the seller, not only a log line. If those events never reach your server, start with why a Stripe webhook is not firing; if they arrive but your database does not change, see webhook returns 200 but nothing updates.

What about sellers in countries Stripe does not support?

Check first. Connect accounts are available in a long but finite list of countries, some only through cross-border payouts, and an account's country cannot be changed. Stripe does not list Bangladesh, for example (Stripe global availability). If many of your buyers or sellers are outside that list, you need other gateways beside Stripe, and a ledger of your own that treats each gateway as one source of money movements.

Why RAITHub for marketplace payments

RAITHub has shipped payment integrations in production, and this guide is honest about which ones. PropDesk, a property management platform, collects rent through Stripe. TheSkinProof, the founder's own marketplace venture rather than a client project, runs bKash, Nagad, SSLCommerz and cash on delivery with per-seller commission. PadhAI, an AI tutoring platform RAITHub built, supports 9 payment gateways. This post's Connect guidance is drawn from Stripe's documentation, not from a Connect marketplace RAITHub has shipped.

  • Money paths are tested. Charges, refunds, transfers and webhook handlers get automated tests gated in CI, including the "runs twice" case.
  • Backend work at fixed scope. A free 15-minute technical audit, then a written fixed quote. You own the code; an NDA is standard.

When you don't need us

  • Your marketplace runs on a hosted platform that already integrates Connect. Configure it there instead of building your own.
  • You have one seller per order and Stripe handles pricing. Stripe's Connect onboarding guides and a competent in-house developer may be all you need.
  • You need licensing or tax advice about holding customer funds. That is for a payments lawyer or tax adviser; this post is general information, so confirm with your adviser.

For payment-heavy backends, the API and backend development service sets out how RAITHub works, and the payments engineering guide covers ledgers and reconciliation. To plan yours, book the free 15-minute technical audit with your order model, your sellers' countries and your commission rules.

Last reviewed: 29 September 2026. Stripe docs and pricing checked on 29 September 2026.

Frequently asked questions

What is the difference between Stripe Connect Express and Custom?

With Express, Stripe onboards and verifies sellers and gives them a light Express Dashboard. With Custom, the seller has no Stripe dashboard and your platform handles all communication, and it can take on identity collection too. Custom takes significantly more integration work.

Are Stripe Connect account types deprecated?

Stripe now calls Standard, Express and Custom legacy account types and recommends controller properties or the Accounts v2 API for new platforms. Existing accounts keep working, and each legacy type maps to a set of controller properties.

How much does Stripe Connect cost?

If Stripe handles pricing, there are no platform fees. If you handle pricing, it is $2 per monthly active account and 0.25% + 25¢ per payout, with instant payouts at 1%. Card processing, such as 2.9% + 30¢ for a domestic US card, is separate.

Should a marketplace use destination charges or separate charges and transfers?

Destination charges when each order has one seller. Separate charges and transfers when one order pays several sellers, or when you take payment before you know who will fulfil it.

Who handles KYC in Stripe Connect?

Stripe does when requirement_collection is stripe, as with Express and Standard accounts, and it re-collects information when rules change. With Custom accounts, or requirement_collection set to application, your platform is responsible.

Who pays for refunds and chargebacks on a marketplace?

With destination charges and separate charges and transfers, Stripe debits the platform's balance. You can reverse the transfer to recover the seller's share, but if their balance is empty, the loss sits with you until recovered.

stripe connectstripe connect express vs customstripe connect feesmarketplace paymentsdestination chargesseparate charges and transfersseller payouts

Ready to discuss your project?

Book a free 15-minute technical audit with our engineering team.