Skip to main content
All posts
Education· by Varun Borawake

Stripe Connect Application Fees and Accounting: A Practical Guide

Stripe Connect for marketplace founders: direct charges, destination charges, separate charges and transfers, with journal entries and refund handling for each.

It is 11pm and you are six tabs deep into the Stripe Connect documentation. You have a marketplace launching in three weeks. Every page seems to introduce a new concept: application_fee_amount, transfer_data.destination, on_behalf_of, separate charges and transfers, reverse transfers.

Underneath the API choice is an accounting choice. Each Connect pattern produces a different set of journal entries, splits revenue between your platform books and the connected-account books in different ways, and treats refunds differently when something goes wrong. The docs cover it, but in the order an integration engineer would want it, not in the order a founder designing the business needs it.

I have implemented all three Connect patterns in production. I spent several years as an SAP and ASC 606 implementation lead at Accenture before founding ERPClaw, so I have seen what happens when the accounting decisions get made by accident rather than on purpose. This is the explainer I wish someone had handed me the first time.

We will walk the same $100 customer charge through each pattern, write the journal entries on both sets of books, work through refunds (the part that gets people in trouble), and finish with a decision tree.

What Stripe Connect actually does

Stripe Connect lets your platform process payments and route money to other Stripe accounts you have onboarded. Those accounts are called connected accounts: sellers on your marketplace, vendors on your B2B platform, drivers on your delivery app.

The plumbing question is: when a customer pays $100 on your platform and $90 is supposed to go to a connected account, whose Stripe balance does the charge land in first, and how does the connected account get its share?

Stripe gives you three answers, and they are not interchangeable. The shape of the money flow drives who is the merchant of record, whose tax ID is on the receipt, who absorbs chargebacks, and how your ledger has to look.

The three patterns:

  1. Direct charges: charge happens on the connected account, your platform takes an application_fee_amount cut.
  2. Destination charges: charge happens on your platform, you set transfer_data.destination and Stripe immediately moves the connected account’s share.
  3. Separate charges and transfers: charge happens on your platform, then you fire transfers.create separately, whenever you want.

Let us put $100 through each.

Pattern 1: Direct charges with application_fee_amount

The customer pays the connected account. Your platform is invisible to the receipt. Stripe debits the connected account’s balance for the processing fee, then deducts your application_fee_amount and routes it to your platform balance.

A $100 charge with a $10 application fee and Stripe’s standard 2.9% plus $0.30 fee (call it $3.20):

  • Customer is charged: $100
  • Stripe processing fee debited from connected account: $3.20
  • Application fee transferred to platform: $10
  • Net to connected account balance: $86.80

Journal entries on the connected account’s books

AccountDebitCredit
Stripe Clearing$86.80
Stripe Fees$3.20
Application Fee Expense$10.00
Revenue$100.00

The connected account is the principal. They booked $100 of revenue. They paid Stripe $3.20 and they paid your platform $10 as a marketplace fee, which is an operating expense on their books.

Journal entries on your platform’s books

AccountDebitCredit
Stripe Clearing$10.00
Marketplace Fee Revenue$10.00

Your platform recognizes $10 of marketplace fee revenue. You never touched the gross $100. From an ASC 606 principal-versus-agent perspective you are clearly the agent here, and your revenue is the fee you charged for matching the buyer and seller.

This is the Etsy pattern. Each seller is the merchant of record, each seller has their own Stripe account, the buyer’s receipt shows the seller’s name. Your platform is a fee-collecting matchmaker.

Pattern 2: Destination charges with transfer_data

The customer pays your platform. The receipt shows your name. Stripe charges the customer, then immediately transfers the connected account’s share based on transfer_data.destination and transfer_data.amount.

Same $100 charge, $90 going to the connected account, $10 you keep. Stripe processing fee comes off your platform side:

  • Customer is charged: $100
  • Stripe processing fee debited from platform: $3.20
  • Transfer to connected account: $90
  • Net to platform balance: $6.80

Journal entries on your platform’s books

The charge:

AccountDebitCredit
Stripe Clearing$96.80
Stripe Fees$3.20
Revenue$100.00

Then the immediate transfer:

AccountDebitCredit
Connect Transfer Expense$90.00
Stripe Clearing$90.00

Net effect: Stripe Clearing rises by $6.80, you booked $100 of revenue, you booked $90 of cost. Gross margin on the transaction is $6.80 minus any other COGS.

Whether “Connect Transfer Expense” is a true expense or a contra-revenue line is the principal-versus-agent question. If the connected account is delivering the service and you are facilitating, you are the agent and the $90 should reduce revenue, not appear as an expense. If you are reselling and the connected account is your supplier, you are the principal and $90 is COGS.

Journal entries on the connected account’s books

AccountDebitCredit
Stripe Clearing$90.00
Revenue$90.00

The connected account books $90 of revenue, sees $90 hit their Stripe balance, never sees the gross $100, never sees the processing fee. They get a clean payable from your platform.

This is the SaaS marketplace pattern. Your platform is the merchant of record, your tax ID is on the receipt, you handle customer service. The connected account is essentially a payee that delivers part of the value. Substack, Patreon, and most “platform takes a cut” SaaS marketplaces use this.

Pattern 3: Separate charges and transfers

You charge the customer on your platform with no transfer_data. The full $96.80 (after Stripe’s fee) lands in your platform balance. Then, whenever you want, you call transfers.create to move the connected account’s share.

This is the escrow pattern. You can hold the money for hours, days, or weeks. You can release it on a delivery confirmation, a shipment scan, the end of a return window, or a manual approval. You can also split the same charge across multiple connected accounts later, which neither of the other patterns supports cleanly.

Journal entries on your platform’s books

The charge:

AccountDebitCredit
Stripe Clearing$96.80
Stripe Fees$3.20
Revenue$100.00

When you decide to release, post a transfer-pending entry:

AccountDebitCredit
Connect Transfer Pending$90.00
Stripe Clearing$90.00

When the transfer settles and the connected account confirms receipt:

AccountDebitCredit
Connect Transfer Expense$90.00
Connect Transfer Pending$90.00

Journal entries on the connected account’s books

AccountDebitCredit
Stripe Clearing$90.00
Revenue$90.00

Same end state as the destination pattern, but with a holding period on the platform side. The “Connect Transfer Pending” account is what your auditor will ask about: it is essentially funds you are holding on behalf of someone else, which has implications for licensing in some jurisdictions (look up “money transmitter” before you build a 30-day escrow on a US platform).

This is the pattern Uber-style platforms, real-estate booking sites with cancellation windows, and B2B marketplaces with delivery verification all reach for. It is the most powerful and the most complicated.

Refunds, the part everyone gets wrong

Refund handling is where Connect accounting goes sideways. The question is always the same: when the customer gets their money back, who eats it? Stripe gives you flags to control this, but the flags only matter if your books mirror what Stripe actually did.

Direct charge refund

The refund happens on the connected account, because the original charge happened on the connected account. The flag that matters is refund_application_fee=true|false.

If refund_application_fee=true, Stripe pulls the $10 application fee back from your platform balance and applies it to the refund. The connected account gets the full $100 back from their balance, your platform balance drops by $10.

Connected account’s books:

AccountDebitCredit
Revenue$100.00
Stripe Fees$3.20
Application Fee Expense$10.00
Stripe Clearing$86.80

Platform’s books:

AccountDebitCredit
Marketplace Fee Revenue$10.00
Stripe Clearing$10.00

If refund_application_fee=false, your platform keeps the $10. The connected account eats the refund alone. No journal entry on your platform side. This is the contractually-aggressive option and you should probably tell sellers up front if you are going to do it.

Note: Stripe does not refund the original processing fee in either case. That $3.20 stays gone. Connected account absorbs it.

Destination charge refund

The refund happens on your platform. The flag is reverse_transfer=true|false, which controls whether the $90 you already pushed to the connected account gets pulled back.

If reverse_transfer=true, the platform refunds the customer $100 and Stripe pulls the $90 back from the connected account.

Platform’s books, the refund:

AccountDebitCredit
Revenue$100.00
Stripe Clearing$96.80
Stripe Fees$3.20

The transfer reversal:

AccountDebitCredit
Stripe Clearing$90.00
Connect Transfer Expense$90.00

Connected account’s books:

AccountDebitCredit
Revenue$90.00
Stripe Clearing$90.00

Net effect: everybody is back to zero, except the platform still ate the $3.20 in Stripe fees.

If reverse_transfer=false, the platform refunds the customer the full $100 but the connected account keeps the $90. Your platform is out $93.20 ($100 refund plus $3.20 fee, minus the $10 you would have kept). This is the right choice when the connected account already shipped a physical good and you do not want to chase them for the money. It is the wrong choice when the customer never received anything; that money is just gone.

Separate transfer refund

You reverse the charge first, then optionally call transfers.createReversal to pull the transfer back.

The flexibility is the point. You can refund the customer immediately and decide later whether to claw back the connected account’s share based on whatever business rule applies (was the order shipped? did the seller ship in time? was the dispute the seller’s fault?).

The discipline is also the point. Every refund without a matching reversal decision creates an accounting question that has to be answered by hand or by code. Spreadsheet bookkeeping breaks here within the first month.

Application-fee-only refund

Stripe also lets you refund only the application fee without refunding the underlying charge. Useful when your platform overcharged its marketplace fee or you want to give a connected account a goodwill credit.

Platform’s books:

AccountDebitCredit
Marketplace Fee Revenue$5.00
Stripe Clearing$5.00

The $5 returns to the connected account. The customer is unaffected.

Two sets of books, one ledger system

Every example above had separate journal entries on the platform’s books and on the connected account’s books. That is not stylistic. Each Stripe account is a separate accounting entity. The connected account has its own legal identity, its own 1099-K, its own tax filings.

If your platform also keeps the books for your sellers (common for SaaS marketplaces and embedded-finance plays), you need your accounting system to keep those ledgers separate. One general ledger per Stripe account, with its own chart of accounts and its own period-end close. Consolidated reporting on top, but the source ledgers do not mix.

Most off-the-shelf SaaS accounting tools assume one entity, which works fine for the platform alone. The moment you need to also track connected-account books for reporting or compliance, multi-entity ledger support is the difference between a tool that handles Connect properly and one that stuffs everything into a single chart of accounts and labels rows with a metadata field.

ERPClaw treats every Stripe account as a separate stripe_account row with its own GL account namespace. The Connect platform fees reference has the full schema.

Picking the right pattern

The choice is business model, not technical preference.

Use direct charges when: each connected account is a separate brand, has its own customer relationship, and wants the receipt to show their name. Etsy/Airbnb style. Connected accounts file their own 1099-Ks. Your platform is a fee collector and never sees the gross transaction on its books.

Use destination charges when: your platform is the merchant of record, your name is on the receipt, and you handle customer service, refunds, and chargebacks centrally. SaaS marketplaces where the platform sells and splits revenue with vendors (Substack, Patreon, course platforms). Settlement is immediate.

Use separate charges and transfers when: you need to hold money before releasing it (delivery verification, return windows), split a single charge across multiple connected accounts, release on a schedule that is not the charge timestamp, or run an escrow/hold-and-release model. You take on additional accounting and possibly licensing complexity.

The trap to avoid: do not mix patterns within the same Connect platform. Stripe lets you. Your books will hate you for it. Pick one pattern at design time and stick with it.

Tools that can automate this

There is a depressing amount of manual work in Connect accounting if you do not automate it. A few options, ordered by founder budget:

  • Stripe’s own reporting. Free with your account. Connect-aware reports that show application fees, transfers, reversals, and per-connected-account balances. The output is CSV/JSON you push into your accounting system; the math itself is correct.
  • Stripe Sigma. SQL on top of your Stripe data, $0.02 per query. Useful when you have outgrown the canned reports. Still no journal entries; you build those yourself.
  • Synder and similar connectors. Sync individual Connect charges into QuickBooks or Xero with some Connect awareness. Light multi-entity support. Good for small platforms on a single destination-charge pattern.
  • ERPClaw. Free, open-source, AI-native, self-hosted on your own infrastructure. Implements all three Connect patterns, handles per-account ledgers natively, and posts journal entries with audit trail. See the Stripe integration page and the SaaS landing page.
  • Sage Intacct and NetSuite. Connect-capable modules through partners. Real money ($1K to $10K/month) and real implementation projects. Default landing spot once you have a controller.

Most platforms can get to $5M of GMV on Stripe’s own reporting plus a careful person and QuickBooks. After that, ledger complexity wins.

Frequently asked questions

If I use direct charges, do I have to issue 1099-Ks to my connected accounts?

No. The connected account is the merchant of record on a direct charge, and Stripe issues the 1099-K to them on their own account. Your platform issues 1099s only for its own contractor or vendor payments, not for marketplace gross volume.

If I use destination charges, who issues the 1099-K?

You do, for the gross transaction, because you are the merchant of record. You also have the option of issuing 1099-MISC or 1099-NEC to the connected accounts for the transfers you made to them, depending on how you classify the relationship. This is one of the conversations worth having with a CPA before you scale.

Can I switch patterns later if I picked the wrong one?

Technically yes, business-realistically no. Switching patterns means new charges flow through different code paths and produce different journal entries, and your historical reports become apples-and-oranges. You can do it, but the migration project is real. Pick carefully the first time.

What about Stripe’s “merchant of record” service, Atlas Embedded Tax?

Different product. Embedded Tax handles US sales tax calculation and remittance. It does not change the Connect pattern question. You still have to pick direct, destination, or separate.

Do application fees count as my revenue under ASC 606?

Yes, recognized at the point in time the underlying transaction completes (usually instantly). The principal-versus-agent question matters for whether you also recognize the gross transaction. Direct charges = you are clearly the agent, fee is your revenue, gross is not. Destination charges = depends on facts, see your CPA. The ASC 606 deep dive walks through this for SaaS subscriptions; the principle is the same for Connect fees.

What happens to application fees during a chargeback?

Same as a refund with refund_application_fee=true by default. Stripe also charges a $15 chargeback fee that comes out of the platform or the connected account depending on your platform settings. Set the policy explicitly; the default may not be what you want.

Closing

Stripe Connect is one of the few API surfaces where the technical choice and the accounting choice are the same choice. Picking direct versus destination versus separate is a business question about who is the merchant of record, who eats the fee, and how you want your books to look five years from now.

Walk the $100 example through both sets of books for each pattern before you write any code. The pattern with the cleanest journal entries is usually the right one for your business.

The Connect platform fees reference, Stripe integration page, and pricing cover the rest. The ASC 606 guide is the companion read for SaaS-style platforms.

Questions or edge cases? Email [email protected].

Tagsstripestripe-connectmarketplacesaasaccounting