Subchapter 1.1
references/account-types.mdMarkdown15 KBView on GitHub
IMPORTANT: Use Accounts v2 API
Do NOT use the legacy
typeparameter (standard,express,custom) when creating connected accounts. These are v1 terms and are no longer the recommended path. Instead, use the Accounts v2 API () and configure each account along three independent dimensions: , , and . This gives platforms precise control without being locked into a rigid archetype.
stripe.v2.core.accountsAccounts v2 replaces the three fixed account types with three independent configuration dimensions. Each dimension is set separately, so platforms can mix and match to fit their exact business model.
Controls what connected accounts see when they log in.
| Value | Dashboard access | Use when |
|---|---|---|
express | Lightweight dashboard showing earnings, payouts, and basic tax information. Stripe-branded with platform name. | Marketplace sellers, gig workers, or any connected account that needs visibility but not full Stripe control. |
full | Full, independent Stripe Dashboard. Connected accounts can manage their own settings, view all transactions, and install apps. | SaaS platforms where connected accounts are established businesses that want to operate independently. |
none | No Stripe dashboard. The platform owns the connected-account UI — use Embedded Components (opens in a new tab) (@stripe/connect-js) for pre-built widgets (account management, payouts, tax forms, and more) or build fully custom. | White-label platforms where connected accounts must never see Stripe branding. Use embedded components for pre-built functionality with white-label feel. Fully custom (no embedded components) adds significant complexity — the platform must build and maintain all connected account UX including onboarding remediation, refund and dispute flows, and ongoing requirement collection. |
Determines who is responsible for collecting Stripe processing fees from connected accounts.
| Value | Behavior | Use when |
|---|---|---|
stripe | Stripe bills connected accounts directly for processing fees. The platform doesn’t need to handle fee logistics. | Most platforms. Simpler to operate. Connected accounts see Stripe fees on their own statements. |
application | The platform is responsible for collecting fees from connected accounts and remitting them to Stripe. The platform receives a single invoice from Stripe. | Enterprise or white-label platforms that want full control over billing relationships, or that bundle Stripe fees into their own pricing. |
Fee collection behavior depends on charge type. The
fees_collectorsetting interacts with the charge pattern:
- Direct charges:
fees_collectordetermines who pays Stripe processing fees. Withfees_collector: "stripe", the connected account pays fees directly. Thefee_payerparameter can further control this — see direct charges fee payer behavior (opens in a new tab).- Destination charges and separate charges and transfers: The platform always pays Stripe processing fees regardless of the
fees_collectorsetting, because the charge lives on the platform account. Thefees_collectorsetting in these cases governs the platform-level billing relationship with Stripe (single invoice vs per-account), not per-transaction fee deduction.
Determines who bears financial responsibility for negative balances, disputes, and refunds on connected account activity.
| Value | Behavior | Use when |
|---|---|---|
stripe | Stripe bears financial responsibility for negative balances on connected accounts that remain unresolved (for example, from disputes or fraud). | Most platforms. Reduces financial risk from unrecoverable negative balances. |
application | The platform bears losses from unresolved negative balances, and is responsible for managing disputes. | Platforms with sophisticated risk management, high-risk verticals, or those that want to internalize loss economics for better unit economics. |
| Business Shape | Dashboard | Fees Collector | Losses Collector | Notes |
|---|---|---|---|---|
| Marketplace | express | application | application | Platform owns fees and losses. Sellers get a lightweight dashboard. Required for Express dashboard + destination charges. Common for two-sided marketplace models. |
| SaaS enabling payments | full | stripe | stripe | Connected accounts are independent businesses with their own full Stripe Dashboard. Platform collects revenue through application fees. Use direct charges only — other charge types with losses_collector: 'stripe' cause the platform to silently carry negative balance liabilities. |
| White-label / enterprise | none | application | application | Platform owns the entire connected-account UI. No Stripe branding. Platform manages all billing and risk. Full control with higher operational responsibility. Compatible with all charge types. |
| Managed marketplace | express | application | application | Platform wants seller-facing dashboard and also owns risk. Express dashboard requires platform to own both fees and losses. Compatible with all charge types — destination and separate charges require webhook-driven recovery flows for refunds and disputes (CAUTION: connected accounts have limited dispute and refund visibility from their dashboard). |
CRITICAL:
losses_collector: 'stripe'restricts you to direct charges only — but only whendashboard: "full".For
dashboard: "none", the only allowed path isfees_collector: 'application'+losses_collector: 'application'. All other responsibility combinations withnoneare BLOCKED, including direct charges with Stripe-owned responsibilities.When Stripe owns loss liability but the platform uses destination charges, separate charges and transfers, or
on_behalf_ofvariants, the liability model doesn’t align with how these charge flows are debited and recovered. Seecompatibility-matrix.mdfor the full compatibility matrix.
Key rules:
fees_collector: 'application' AND losses_collector: 'application'losses_collector: 'stripe' + destination charges or separate charges and transfers = BLOCKED. Platform silently inherits negative balance liability, fees are misattributed, and connected accounts can’t manage refunds or disputes from their dashboard.losses_collector: 'application' is compatible with all charge types when fees_collector is also 'application', with one exception: full dashboard + application/application is SALES-GATED (redirect to Stripe sales (opens in a new tab)). With fees_collector: 'stripe' (full or none dashboard), all charge types are BLOCKED.dashboard: "full" + fees_collector: "application" = SALES-GATED. Do NOT recommend for self-serve paths. Redirect to Stripe sales (opens in a new tab).Create a connected account using Accounts v2:
Marketplace connected account (destination charges or separate charges and transfers):
const account = await stripe.v2.core.accounts.create({
contact_email: 'seller@example.com',
display_name: 'Seller Name',
dashboard: 'express',
identity: { country: 'us', entity_type: 'individual' },
configuration: {
recipient: {
capabilities: {
stripe_balance: { stripe_transfers: { requested: true } },
},
},
},
defaults: {
currency: 'usd',
responsibilities: {
fees_collector: 'application',
losses_collector: 'application',
},
},
});SaaS connected account (direct charges):
const account = await stripe.v2.core.accounts.create({
contact_email: 'merchant@example.com',
display_name: 'Merchant Name',
dashboard: 'full',
identity: { country: 'us', entity_type: 'individual' },
configuration: {
merchant: {
capabilities: {
card_payments: { requested: true },
},
},
},
defaults: {
currency: 'usd',
responsibilities: {
fees_collector: 'stripe',
losses_collector: 'stripe',
},
},
});Key points about this API:
dashboard is set at the top level, not inside configuration.identity.country and identity.entity_type replace the old country and business_type fields.configuration.recipient with stripe_balance.stripe_transfers — do NOT request configuration.merchant or card_payments (unnecessary and causes longer onboarding).configuration.merchant with card_payments — the connected account is merchant of record (that is, direct charges where the connected account’s name appears on customer bank statements).defaults.responsibilities is where you set fee and loss liability. These are the v2 replacements for what was previously implied by account type.defaults.currency sets the default settlement currency.For SaaS or direct charges only. Marketplace connected accounts should use
configuration.recipientinstead — see example above.
In Accounts v2, the configuration.merchant block is what makes a connected account capable of accepting payments as the merchant of record. This is required when using direct charges (where the charge is created on the connected account and their business name appears on customer bank statements).
Without the Merchant configuration, the connected account can’t process payments directly — it can only receive transfers from the platform.
configuration: {
merchant: {
capabilities: {
card_payments: { requested: true },
},
},
},When to include Merchant configuration:
configuration.recipient with stripe_transfers instead. Requesting configuration.merchant or card_payments for marketplace accounts is unnecessary and causes longer onboarding.configuration.recipient with stripe_transfers instead.Choose dashboard: 'express' when…
Choose dashboard: 'full' when…
Choose dashboard: 'none' when…
Choose losses_collector: 'stripe' when…
Choose losses_collector: 'application' when…
Choose fees_collector: 'stripe' when…
Choose fees_collector: 'application' when…
The terms Standard, Express, and Custom refer to the v1 Accounts API and its type parameter. They are no longer the recommended way to create connected accounts. Here is how they roughly map to v2 dimensions:
| Legacy v1 Type | Approximate v2 Equivalent |
|---|---|
| Standard | dashboard: 'full', fees_collector: 'stripe', losses_collector: 'stripe' |
| Express | dashboard: 'express', fees_collector: 'application', losses_collector: 'application' |
| Custom | dashboard: 'none', fees_collector: 'application', losses_collector: 'application' |
The mapping is approximate — v2 allows combinations that were impossible in v1, and legacy types have behavioral nuances that don’t carry over to their v2 “equivalents.” For example, the fee payer behavior in the approximate v2 config equivalent is different from what the legacy type provided.
Stripe docs also expose legacy fee-payer variants for direct charges:
| Legacy fee-payer value (docs) | Meaning |
|---|---|
application_express | Historical billing behavior for legacy Express accounts |
application_custom | Historical billing behavior for legacy Custom accounts |
These are external Stripe-doc terms tied to legacy account behavior. For new integrations, use Accounts v2 responsibilities (fees_collector, losses_collector) instead.
Don’t treat this table as “these are the same thing.” It is a rough conceptual guide. Legacy accounts retain their original behaviors; v1 and v2 coexist. All new integrations should use v2.