How Stripe Connect fees work (with currency conversion)

Matt Lim
4 min readSep 4, 2021

This took me a while to figure out, so figured I’d write an article about it.

Flow of Funds

Stripe’s documentation has a good diagram of the flow of funds, which gives a nice high level overview of how things work. It just needs one minor change to be more comprehensive:

I added the “currency conversion fee happens here” part, if you didn’t notice

In the rest of this article, we’re going to go over how to track all of these fees within Stripe—knowing how things work at a high level vs. knowing how to actually locate the fees within Stripe’s dashboard are two very different things! Note that everything shown is test data.

Example 1: USD → USD

First, we’ll go over the simplest scenario: the buyer pays in USD, and the connected account settles in USD (e.g. they have a US bank account).

Payment to the platform account

https://dashboard.stripe.com/test/payments/PAYMENT_ID

Here, the customer pays $10, and Stripe takes $0.59 (2.9% + 30 cents, see https://stripe.com/pricing for more details).

Transfer to the connected account

https://dashboard.stripe.com/test/connect/accounts/ACCOUNT_ID/payments/PAYMENT_ID

$10 goes to the connected account, and $0.29 is taken as fees. This is the application fee.

Overall, we’ve actually lost money on this transaction, because Stripe took $0.59 and we only made $0.29. This can be “fixed” by increasing the application fee amount.

Example 2: USD → AUD

What happens if the connected account settles in AUD (i.e. their bank account is Australian)? It’s pretty similar, but there are some more fees we need to be aware of.

Payment to the platform account

This looks the same as for USD → USD.

Transfer to the connected account

https://dashboard.stripe.com/test/connect/transfers/TRANSFER_ID, then click on “View Receipt”

Aha, another fee! This one is a bit hard to find—it’s the 1% currency conversion fee that’s documented here.

https://dashboard.stripe.com/test/connect/accounts/ACCOUNT_ID/payments/PAYMENT_ID

The way the payment/transfer to the connected account shows up is basically the same as before, except USD is converted to AUD. Note that the application fee is in AUD as well.

Note that there is also a cross-border transfer fee in this scenario. But that fee gets taken later, not at the time of the transaction.

Example 3: Austrian credit card → USD

In this scenario, the payment is made with an Austrian credit card (see here to get test card numbers), and settled in USD.

Payment to the platform account

https://dashboard.stripe.com/test/payments/PAYMENT_ID

Hey, the fees are higher than for USD → USD! That’s because this time, Stripe takes an additional 1% currency conversion fee.

Transfer to the connected account

Same as forUSD → USD.

I’m not sure if there’s a cross-border transfer fee in this scenario. I don’t think there is though, because the payout is in USD.

Example 4: Austrian credit card → AUD

Our final example! In this scenario, the buyer pays with an Austrian credit card, and the connected account has an Australian bank account.

Payment to the platform account

This looks the same as Austrian credit card → USD.

Transfer to the connected account

This looks the same as USD → AUD. This means there are two currency conversion fees—both when the buyer pays, and when the money is transferred to the connected account.

That’s it! I didn’t cover payout fees because otherwise this would get too long. Hope this helps at least one other person, and if you have any questions, hit me up on Twitter.

--

--

Matt Lim

Software Engineer. Tweeting @pencilflip. Mediocre boulderer, amateur tennis player, terrible at Avalon. https://www.mattlim.me/