Skip to content
← Back to notes

Stripe Connect for multi-tenant SaaS: why we picked Standard

Three flavors of Connect, three different regulatory profiles. Why CombatScore runs on Standard, what it costs us in onboarding polish, and the application-fee detail nobody documents clearly.

StripeSaaSEngineering

CombatScore is a multi-tenant SaaS for combat-sports gyms. Each gym has its own branded subdomain, its own students, its own pricing. The platform takes a small fee on every membership the gym sells. The billing layer that makes that work — and the layer most multi-tenant founders get wrong — is Stripe Connect. This is what we picked, why, and what we'd warn anyone else considering it.

The naive option: charge the platform, pay out manually

The simplest model: the platform charges all the customers, holds the money, and pays gyms out at the end of the month minus the platform fee. We can build this in a weekend. We didn't.

The problem is the platform becomes the merchant of record for every transaction. That changes your tax situation, your chargeback exposure, your money-transmitter regulation surface, and — practically — the relationship between the gym and its students. Every credit card statement says "CombatScore," not "Crowfoot BJJ." That is a real loss for the gym; it is also a real legal liability for the platform.

Stripe Connect, in three flavors

Stripe Connect comes in three flavors. The differences matter:

  • Standard.The gym signs up for its own Stripe account, the platform connects to it via OAuth, charges run on the gym's account with an application fee. Easiest from a regulatory standpoint — Stripe is the payment processor, the gym is the merchant of record, the platform is just an integration.
  • Express. Stripe creates a lightweight account on behalf of the gym, with a hosted onboarding flow. The platform has more control over the experience but takes on more regulatory responsibility.
  • Custom. Full white-label. The platform is responsible for everything, including collecting know-your-customer data and managing the dashboard experience. Most regulatory exposure, most control.

What we picked, and why

CombatScore uses Stripe Connect Standard. The gym signs up for its own Stripe account, owns its own merchant relationship, owns its own dashboard. CombatScore's integration takes an application fee on each charge — the platform's revenue — and otherwise stays out of the gym's books.

The trade is real. Express and Custom would let us hide the Stripe brand entirely and offer a more polished onboarding flow. Standard makes us send the gym to stripe.com for the OAuth handoff, which is briefly off-brand. We accept that, because:

  • The gym keeps its own merchant identity. Statements say the gym name.
  • Tax and chargeback exposure stays with the gym, not the platform.
  • If the gym ever leaves CombatScore, they keep their Stripe account and customer history.
  • The regulatory burden on the platform is dramatically lower.

The application-fee detail nobody documents clearly

The platform's revenue is collected via the application_fee_amounton the charge. It's just an integer in cents on each checkout.session.create or subscription. Stripe handles the split: the gym gets the rest, the platform gets the fee, both show up on a unified Stripe payouts schedule.

The piece that's genuinely subtle is what happens during refunds and chargebacks. By default, refunds come out of the connected account, not the platform. If you want the platform to share the refund cost proportionally, you have to set refund_application_fee: true. Get this wrong and you discover it the first time a gym refunds a student.

Why we'd pick Standard again

For any SaaS where the seller (the gym, in our case; but it could be a creator, a contractor, a small merchant) has a real customer relationship that pre-exists the platform, Standard is the right answer. Express and Custom make sense when the platform is the brand customers are signing up to — Substack-shaped, not Shopify-shaped. CombatScore is Shopify-shaped: the gyms are the brand, we're the rails. The billing model has to match.