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:
- Direct charges: charge happens on the connected account, your
platform takes an
application_fee_amountcut. - Destination charges: charge happens on your platform, you set
transfer_data.destinationand Stripe immediately moves the connected account’s share. - Separate charges and transfers: charge happens on your
platform, then you fire
transfers.createseparately, 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
| Account | Debit | Credit |
|---|---|---|
| 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
| Account | Debit | Credit |
|---|---|---|
| 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:
| Account | Debit | Credit |
|---|---|---|
| Stripe Clearing | $96.80 | |
| Stripe Fees | $3.20 | |
| Revenue | $100.00 |
Then the immediate transfer:
| Account | Debit | Credit |
|---|---|---|
| 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
| Account | Debit | Credit |
|---|---|---|
| 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:
| Account | Debit | Credit |
|---|---|---|
| Stripe Clearing | $96.80 | |
| Stripe Fees | $3.20 | |
| Revenue | $100.00 |
When you decide to release, post a transfer-pending entry:
| Account | Debit | Credit |
|---|---|---|
| Connect Transfer Pending | $90.00 | |
| Stripe Clearing | $90.00 |
When the transfer settles and the connected account confirms receipt:
| Account | Debit | Credit |
|---|---|---|
| Connect Transfer Expense | $90.00 | |
| Connect Transfer Pending | $90.00 |
Journal entries on the connected account’s books
| Account | Debit | Credit |
|---|---|---|
| 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:
| Account | Debit | Credit |
|---|---|---|
| Revenue | $100.00 | |
| Stripe Fees | $3.20 | |
| Application Fee Expense | $10.00 | |
| Stripe Clearing | $86.80 |
Platform’s books:
| Account | Debit | Credit |
|---|---|---|
| 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:
| Account | Debit | Credit |
|---|---|---|
| Revenue | $100.00 | |
| Stripe Clearing | $96.80 | |
| Stripe Fees | $3.20 |
The transfer reversal:
| Account | Debit | Credit |
|---|---|---|
| Stripe Clearing | $90.00 | |
| Connect Transfer Expense | $90.00 |
Connected account’s books:
| Account | Debit | Credit |
|---|---|---|
| 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:
| Account | Debit | Credit |
|---|---|---|
| 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].
Related posts
Agency Accounting, Project P&L, and Time Billing: A Real Guide
Why your friendly retainer client is secretly losing you $40 an hour, the four metrics every agency owner should know, and how to fix project P&L.
A2X Alternative: The Free Open-Source Tool Most Shopify Stores Don't Know About
Looking for an A2X alternative? ERPClaw uses the same clearing account method, books every order separately, includes per-warehouse stock costs, and costs $0. A founder's honest comparison.
AI Decorated vs AI Native Software: Why Most AI Features Will Lose
AI-decorated tools bolt a chatbot onto 2015 software and charge a new fee. AI-native software rebuilds the architecture. One of these wins. Here is why.