Subchapter 1.4
references/compatibility-matrix.mdMarkdown16 KBView on GitHub
This document encodes known Connect integration incompatibilities — combinations of account controller properties and charge types that cause serious issues for platforms. Use this as a validation checklist when recommending or reviewing any Connect configuration.
Significant compatibility issues arise when account controller properties (dashboard, fees_collector, losses_collector) are paired with incompatible charge types. Each combination below is rated:
For GA configurations with
losses_collector: "stripe", ONLY direct charges are safe.For destination charges and separate charges and transfers, use
losses_collector: "application"so responsibility aligns with dispute and transfer-reversal flows. In this guide, combinations that pair these charge patterns withlosses_collector: "stripe"are marked BLOCKED.Exception: Express dashboard with
losses_collector: "stripe"(regardless of fees_collector) is blocked for ALL charge types including direct — these configs are still in beta. Don’t recommend them.
Note:
on_behalf_ofconfigurations aren’t supported by this guide.on_behalf_ofcolumns are retained in the matrix for compatibility detection only — if the assistant encounterson_behalf_ofrequirements, it should redirect to Stripe docs or sales.
| Dashboard | Fees Collector | Losses Collector | Direct | Destination | Destination on_behalf_of | Separate charges and transfers | Separate charges and transfers on_behalf_of |
|---|---|---|---|---|---|---|---|
full | stripe | stripe | ALLOWED | BLOCKED | OUT OF SCOPE | BLOCKED | OUT OF SCOPE |
full | stripe | application | BLOCKED | BLOCKED | OUT OF SCOPE | BLOCKED | OUT OF SCOPE |
full | application | application | SALES-GATED | SALES-GATED | OUT OF SCOPE | SALES-GATED | OUT OF SCOPE |
full | application | stripe | SALES-GATED | SALES-GATED | OUT OF SCOPE | SALES-GATED | OUT OF SCOPE |
express | application | application | ALLOWED | CAUTION | OUT OF SCOPE | CAUTION | OUT OF SCOPE |
express | stripe | stripe | BLOCKED* | BLOCKED | OUT OF SCOPE | BLOCKED | OUT OF SCOPE |
express | stripe | application | BLOCKED | BLOCKED | OUT OF SCOPE | BLOCKED | OUT OF SCOPE |
express | application | stripe | BLOCKED* | BLOCKED | OUT OF SCOPE | BLOCKED | OUT OF SCOPE |
none | stripe | stripe | BLOCKED | BLOCKED | OUT OF SCOPE | BLOCKED | OUT OF SCOPE |
none | stripe | application | BLOCKED | BLOCKED | OUT OF SCOPE | BLOCKED | OUT OF SCOPE |
none | application | stripe | BLOCKED | BLOCKED | OUT OF SCOPE | BLOCKED | OUT OF SCOPE |
none | application | application | ALLOWED | ALLOWED | OUT OF SCOPE | ALLOWED | OUT OF SCOPE |
*Express dashboard with losses_collector: "stripe" configs are still in beta. Even when GA, destination charges and separate charges and transfers still require platform-run dispute or refund recovery (including transfer reversals), which aligns with losses_collector: "application" instead.
express + application + application + destination charges (without on_behalf_of) and separate charges and transfers:
losses_collector: "application") and runs webhook-driven refund or dispute recovery workflowson_behalf_of is out of scope for this guide. Redirect to Stripe docs or sales instead of recommending it.| Business Model | Dashboard | Fees | Losses | Charge Type | Rating | Notes |
|---|---|---|---|---|---|---|
| Marketplace | express | application | application | Destination | CAUTION | Recommended path — CAUTION applies: connected accounts have limited dispute or refund visibility from their Express dashboard; platform must run webhook-driven recovery workflows. Always include the Express dispute-visibility warning. |
| SaaS | full | stripe | stripe | Direct | ALLOWED | Stripe-managed fee and loss defaults; connected accounts are independent merchants |
| Enterprise or White-label | none | application | application | Destination or Direct | ALLOWED | Full platform control |
When losses_collector: "stripe" is combined with non-direct charges (destination or separate charges and transfers), this guide marks the combination as BLOCKED for three documented reasons:
Liability settings should align with where disputes are debited. For destination charges and separate charges and transfers, disputes are debited from the platform balance. Use losses_collector: "application" so the liability model matches this funds flow.
Payment fees for these charge types are assessed on the platform. For destination charges or separate charges and transfers, Stripe collects payment fees from the platform account regardless of fees_collector. (Rates vary by region — see stripe.com/pricing (opens in a new tab).) Note: Legacy types behave differently, see Fee behavior (opens in a new tab).
Recovery from connected accounts requires explicit transfer-reversal handling. For destination and separate disputes, Stripe debits the platform first; the platform then recovers funds by reversing transfers through the API or Dashboard. Refunds can auto-reverse transfers when reverse_transfer: true, but dispute recovery isn’t automatic and requires explicit logic.
Whoever provides the good or service at the transaction level should be the merchant of record. The charge type dictates who the merchant of record is:
on_behalf_of variants → Connected account is merchant of record (despite charge living on platform account)CRITICAL: Platforms declare their intended merchant-of-record setup during platform onboarding, but can then create charges with any pattern regardless. Stripe will NOT enforce this selection at the API level. The recommendation must ensure the charge type matches the user’s actual business relationship (who provides the goods and services).
Risk level: OUT OF SCOPE
Connecting existing Stripe accounts through OAuth is a v1-only pattern primarily used in sales-assisted integrations. This guide doesn’t support OAuth-based onboarding.
Why OAuth is problematic:
If the user mentions OAuth, “connect existing Stripe accounts,” or “link existing accounts”: Direct them to the Connect documentation (opens in a new tab) and recommend contacting Stripe sales (opens in a new tab). This guidance only supports creating new connected accounts with embedded onboarding.
Risk level: CAUTION
Platforms that choose dashboard: "none" and build custom onboarding underestimate the ongoing burden:
Recommendation: Use embedded onboarding components or Stripe-hosted onboarding unless the platform has dedicated compliance engineering resources AND a specific branding requirement that embedded components can’t meet. This reduces compliance and maintenance burden (see Onboard your connected account (opens in a new tab)).
Risk level: CAUTION
Platforms that build their own connected-account dashboard (dashboard: "none") commonly build earnings and payout views but neglect refund and dispute management flows. Without these:
Recommendation: If building a custom dashboard, day-one scope should include refund initiation, dispute response, and KYC requirement status and remediation with country-aware requirement handling. Strongly recommend using embedded components for these. If the platform can’t commit to this, use dashboard: "express" instead.
Risk level: INFORMATIONAL (long-term gap)
Not all Stripe products work with all Connect integration configurations.
Recommendation: If the platform plans to use Billing, Invoicing, or Payment Links, recommend direct charges.
For other charge types, when encountering Billing (Subscriptions, Invoicing), Tax, Payment Links, or Checkout Sessions, proceed with caution and look things up in the Stripe docs or recommend contacting sales.
Risk level: INFORMATIONAL (long-term gap)
Certain integration paths have geographic restrictions:
Recommendation: If the user mentions international expansion plans, their charge pattern and account configuration may need adjustment for new countries. Recommend checking Stripe’s country availability documentation.
Risk level: CAUTION
Platforms that choose fees_collector: "application" (platform owns pricing) should model Stripe processing fees explicitly, because unmodeled fees can reduce margins.
Recommendation: This is already well-covered by the skill’s mandatory fee economics breakdowns. Reinforce during discovery: if the platform doesn’t have dedicated pricing expertise, recommend fees_collector: "stripe" and use application_fee_amount for platform revenue.
Risk level: CAUTION
When a dispute occurs on a destination charge:
transfer_dataThe platform’s balance is reduced but the connected account still has the funds. A common implementation issue: platforms fail to initiate a transfer reversal to recover the disputed amount from the connected account.
What should happen:
charge.dispute.created webhooklosses_collector: "application")What commonly goes wrong:
reverse_transfer defaults to false on both refunds and disputes)losses_collector: "application", there’s no mechanism to recoverRecommendation:
charge.dispute.created webhook handler that automatically reverses the associated transferreverse_transfer: true on refunds to make transfer reversal automatic for voluntary refundslosses_collector: "application" is set so the connected account balance can go negative, enabling recoveryWhen generating a recommendation in the discovery flow, validate the final configuration against this checklist:
(dashboard, fees_collector, losses_collector) + chargePattern in the matrix above. If BLOCKED, don’t present. Explain why and recommend the nearest allowed alternative.dashboard: "none" and the user plans custom onboarding, warn about ongoing KYC collection and remediation burden and country-specific requirement drift.dashboard: "none", confirm the platform plans to build refund or dispute operations, not just earnings views.fees_collector: "application", ensure the fee economics section includes explicit breakeven analysis.