Notes on Stripe Connect

Blog.
November 2023

Stripe Connect is the service where a platform can act as a medium between the service provider and the service consumer. Service consumer pays → platform takes cut → transfer remaining to the service provider. This is the marketplace model.
There’s 2 ways of how the platform can take the cut.

Service Provider takes 100%

When carrying out a payment intent, a stripe account can be specified as:
const paymentIntent = await stripe.paymentIntents.create( { amount: 10000, // <- $100 currency: "hkd", automatic_payment_methods: { enabled: true, }, application_fee_amount: 500, // <- $5 }, { stripeAccount: {{connectedStripeAccountId}} } );
What happens in this case is:
Consumer: -$100
Platform: under collected fee+$5
Provider: under net transaction → +$89.25 (with a fee $10.75)
The total “fee” for this transaction is contributed from 2 part: 1. from stripe and 2. from the platform. The fee for stripe is 3.4% + $2.5 per transaction, so it being $100*0.034+2.35 = $5.75. So adding up with the fixed platform fee ($5.0) in this case makes up to $10.75.
What the provider gets in its own stripe dashboard is:
  1. The customer record
  2. The payment intent from the customer
  3. Fee with a breakdown of Fee = $10.75 and Collected fee of $5
Benefits of letting the service provider to take the direct charge is that the service provider’s stripe works as it is, just that they ‘allow’ the platform to take payment intent on behalf of them and accept that it’ll incur charge from the platform.

Platform takes the payment and transfer the rest

const paymentIntent = await stripe.paymentIntents.create( { amount: 10000, // <- $100 currency: "hkd", automatic_payment_methods: { enabled: true, }, application_fee_amount: 500, // <- $5 transfer_data: { destination: {{connectedStripeAccountId}}, }, } );
The other way of doing this is the payment intent is taken under the platform’s stripe account. So this payment intent will only be shown in the platform’s stripe but not the provider’s stripe. Only when a payment intent is confirmed and paid, stripe will make a transfer from the platform’s stripe account to the provider’s connected stripe account.
The difference this makes is that the provider will only see a payment record from the platform instead of from the actual customer. The customer details are being shielded to the platform’s stripe account. The fee and collected fee in this case will be identical - since the platform’s stripe is taking the stripe’s fee and the cut together.

Which way is better

Officially, according to stripe, creating destination charge is recommended for express/custom account. Express account is almost like the platform is opening stripe account on behalf of the user. Stripe takes a $15 (HKD) onboarding fee for each user for express account. It’s almost like lifting the effort for user to set up stripe themselves, white-labelling the stripe payment system into own platform. Otherwise - standard is the way to go.
For the method of creating destination charge, dispute / refund will be handled by the main platform, because the payment intents are created under the main platform stripe account. If someone is requesting a refund, the main platform will have to handle the logistic, instead of the provider.
Latest
Built with Gatsby ^5.3 + Notion Email 📥 Twitter 💬 Github 👩‍💻 LinkedIn