Glossary

Stripe Destination Charge

A Stripe destination charge is a payment created on a Connect platform’s own account with a connected account named as the destination, so the charge lands in the platform’s balance and Stripe immediately and automatically transfers the funds onward to the connected account’s pending balance.

Also called: destination charge, Connect destination charge, transfer_data destination, indirect charge

Definition

Stripe puts the mechanism in one sentence. Setting transfer_data[destination] on the payment "indicates that this is a destination charge", and a destination charge "means the charge is processed on the platform and then the funds are immediately and automatically transferred to the connected account’s pending balance."

So the money takes two steps rather than one, and both are recorded. The customer pays your platform. Stripe moves the funds to the seller. You keep a slice. Stripe groups this with separate charges and transfers as an indirect charge, defined as a payment "made to your platform" where funds then move "to Stripe as fees and to the connected account as its portion of the payment".

The consequence that matters to a bookkeeper is short: your platform balance holds the whole customer payment before it holds your margin. Stripe is direct about what that exposes you to. With this charge type, "Your account balance is debited for the cost of the Stripe fees, refunds, and chargebacks."

That is the real difference between this and a direct charge. A destination charge does not just change where the money pauses. It changes whose balance absorbs everything that goes wrong afterwards.

Key points

  • +Stripe: transfer_data[destination] "indicates that this is a destination charge".
  • +The charge "is processed on the platform and then the funds are immediately and automatically transferred to the connected account’s pending balance".
  • +Stripe classes it as an indirect charge, a payment "made to your platform", alongside separate charges and transfers.
  • +With this type, "Your account balance is debited for the cost of the Stripe fees, refunds, and chargebacks."
  • +Two ways to take your cut: application_fee_amount, which creates an Application Fee object, or transfer_data[amount], which does not.
  • +on_behalf_of sets the settlement merchant. "If on_behalf_of is omitted, the platform is the business of record for the payment."
  • +On a refund, "by default the destination account keeps the funds that were transferred to it", leaving the platform balance short unless you set reverse_transfer.
  • +On a dispute, "with or without on_behalf_of", Stripe debits the disputed amount and the fee from the platform account.
  • +A failed asynchronous payment reverses the transfer automatically, so no funds move permanently to the connected account.
  • +Acodei documents a transfer as its own balance-transaction line, bucketed by day and currency and signed by the direction of the amount.

Two ways to take your cut, and only one of them itemises itself

Stripe gives you two parameters for the platform’s share, and they produce different records. Choosing between them is a reporting decision more than a technical one.

With application_fee_amount, Stripe describes the sequence precisely: "The full charge amount is immediately transferred from the platform to the connected account that’s specified by transfer_data[destination] after the charge is captured. The application_fee_amount is then transferred back to the platform, and the Stripe fee is deducted from the platform’s amount." On a 10.00 charge with a 1.23 fee and 0.59 of Stripe fees, 8.77 settles with the connected account and 0.64 stays with you. Afterwards "an Application Fee object is created", which you can list in the Dashboard or in Sigma, and Stripe notes you can use its amount property "for itemized fee reporting".

With transfer_data[amount] you do the arithmetic yourself: "You subtract your platform’s fees from the charge amount, then pass the result of this calculation as the transfer_data[amount]." No application fee object exists, so there is nothing itemised to reconcile against. Stripe’s own suggested method is to "retrieve the PaymentIntent and subtract the transfer_data[amount] from the amount on the PaymentIntent", or to read the Destination Platform Fee column in the Balance history export.

Two further differences are easy to miss and hard to undo. Settlement currency: an application fee "settles in the same currency as the connected account’s settlement currency", while a transfer_data[amount] settles in your platform’s settlement currency, which matters the moment a payment crosses a border. And visibility: with transfer_data[amount], Stripe says your connected account "can’t view the total amount of the charge. They only see the amount transferred." With an application fee, the connected account can see both the total and the fee.

Stripe’s own recommendation is to "consider using the application fee amount to simplify reporting by creating explicit application fees which are linked to the charge". For anyone who has to explain a commission line to an accountant, that is the easier of the two to defend.

Whose business the customer thinks they paid

A destination charge sits on your platform, so by default your platform is the merchant the customer sees. Stripe states it plainly: "If on_behalf_of is omitted, the platform is the business of record for the payment."

Setting on_behalf_of to a connected account ID makes that account the settlement merchant, which Stripe defines as the party that "determines whose information is used to make the charge". The effects are concrete rather than cosmetic. Charges settle in the connected account’s country and settlement currency. The fee structure for that country applies. The connected account’s statement descriptor appears on the customer’s statement, and if that account is in a different country than the platform, so do its address and phone number. The pending balance is held according to the connected account’s own delay_days setting.

Stripe frames the choice around who the customer actually deals with. Some platforms prefer to be the settlement merchant "because the end customer interacts directly with their platform", as with on-demand services. Others have connected accounts that face customers directly, such as a storefront on a marketplace, where "it might make more sense for the connected account to be the settlement merchant".

One constraint decides it for you in some cases. Stripe notes that with certain exceptions, if your platform and a connected account are not in the same region, you must specify the connected account as the settlement merchant using on_behalf_of. And the parameter is "supported only for connected accounts with a payments capability such as card_payments".

Note what on_behalf_of does not change. It does not move the liability. Disputes on destination charges are debited from the platform "with or without on_behalf_of".

The refund that leaves your balance short

This is the behaviour that surprises platforms in their first month, and it is documented rather than accidental.

When you refund a charge carrying a transfer_data[destination], Stripe says that "by default the destination account keeps the funds that were transferred to it, leaving the platform account to cover the negative balance from the refund". You refunded the customer in full, the seller keeps their 8.77, and your balance absorbs the gap.

The remedy is a parameter. Setting reverse_transfer to true when creating the refund pulls the funds back from the connected account. Stripe adds that "if the refund results in the entire charge being refunded, the entire transfer is reversed. Otherwise, a proportional amount of the transfer is reversed."

The application fee is a separate decision again. By default "the platform account keeps the funds from the application fee" on a refund. Setting refund_application_fee to true pushes it back, and Stripe is explicit that "if you refund the application fee for a destination charge, you must also reverse the transfer".

Disputes work the same way but without the opt-out. For destination charges, "Stripe debits dispute amounts and fees from your platform account", and recovery is something you initiate by reversing the transfer. If the connected account has a negative balance, Stripe attempts to debit its external account only when debit_negative_balances is set to true. Stripe also warns that retransferring a previous reversal is subject to cross-border transfer restrictions, "meaning you might have no means to repay your connected account", and advises waiting to recover disputed cross-border transfers until after a dispute is lost.

For a bookkeeper the takeaway is that a refund on a destination charge is potentially three movements rather than one: the refund itself, an optional transfer reversal, and an optional application fee refund. A month-end that reconciles only the first will not balance.

Transfers that reverse themselves, and transfers that never happen

Two cases produce a charge with no matching transfer, and both look like missing money until you know the rule.

Asynchronous payments first. With methods such as ACH Debit or SEPA Debit there is a gap between initiation and confirmation, and Stripe notes that during that window "both the charge and the transfer to the connected account’s pending balance are in a pending state". If the payment then fails, "Stripe automatically reverses the transfer. No funds are permanently moved to the connected account." Nothing for you to do, and nothing to correct.

The second case does need attention. If the destination account loses its transfer capability or is closed during that same window, Stripe "can’t complete the transfer as originally requested", so it skips the transfer and "the funds remain in your platform’s balance". You are holding money intended for a seller, and the only signal is quiet: listen for the charge.updated event and check whether transfer_data on the Charge object is null. Stripe says a null value "indicates a skipped transfer", and that once the problem is resolved you can create the transfer yourself.

That second case is worth a control rather than good intentions. A skipped transfer inflates your platform balance and, if your books treat a destination charge as pass-through, quietly overstates what is yours.

How a destination charge reaches QuickBooks through Acodei

Acodei’s documentation treats Connect activity as balance-transaction types. Each type is bucketed by day and currency and becomes a line item whose QuickBooks account is decided by the product you map to that type under Account Mapping, then Balance Transaction Mapping.

The two movements a destination charge produces both appear that way. A transfer is bucketed as its own line, signed by the direction of the amount, which is what the outbound leg to the connected account looks like. An application_fee is bucketed as its own line on the same basis, and application_fee_refund is handled as its own type when payout lines are built, so a returned commission is a separate entry rather than an adjustment to the first.

What Acodei deliberately does not do is decide the accounting for you. Acodei’s Connect documentation is explicit that a specific accounting treatment per type is a consequence of how you map it rather than fixed behaviour in the product. So this page tells you which lines arrive and what decides their destination, and stops there. Whether the gross belongs in your revenue at all is the principal-versus-agent question, and it is settled with your accountant rather than in a mapping screen.

Whichever split you chose, the platform balance those movements pass through still has to tie out, which is how a transfer out of your platform balance reaches QuickBooks.

Want to see this on your own Stripe data?

Start a free trial

Frequently asked questions

What is a Stripe destination charge?

It is a payment created on a Connect platform’s own account that names a connected account as the destination. Stripe defines transfer_data[destination] as the parameter that "indicates that this is a destination charge", where the charge "is processed on the platform and then the funds are immediately and automatically transferred to the connected account’s pending balance".

What is the difference between a destination charge and a direct charge?

Where the payment lands and whose balance carries the risk. On a direct charge the payment is created on the connected account and its balance grows. On a destination charge the payment lands on the platform and moves outward, and Stripe states that the platform account "is debited for the cost of the Stripe fees, refunds, and chargebacks".

Should I use application_fee_amount or transfer_data[amount]?

Use application_fee_amount if you want your commission itemised. It creates an Application Fee object linked to the charge, which Stripe suggests using "for itemized fee reporting". With transfer_data[amount] you calculate the split yourself and no fee object exists, so reconciliation means subtracting the transferred amount from the charge amount. Stripe itself recommends the application fee route to simplify reporting.

What does on_behalf_of do on a destination charge?

It sets the settlement merchant, which determines whose information is used to make the charge. That covers the statement descriptor the customer sees, the settlement country and currency, the fee structure applied, and the payout delay on the connected account. Stripe notes that if on_behalf_of is omitted, "the platform is the business of record for the payment".

Who pays for a refund on a destination charge?

Your platform, unless you ask for the funds back. Stripe documents that "by default the destination account keeps the funds that were transferred to it, leaving the platform account to cover the negative balance from the refund". Setting reverse_transfer to true recovers them, in full or proportionally depending on the size of the refund.

Who is liable for a chargeback on a destination charge?

The platform. Stripe debits dispute amounts and fees from the platform account "with or without on_behalf_of". You can attempt to recover the funds by reversing the transfer to the connected account, and if that account is left with a negative balance, Stripe attempts to debit its external account only when debit_negative_balances is set to true.

Why did a charge arrive with no transfer to the connected account?

Two documented cases. If an asynchronous payment fails while pending, Stripe automatically reverses the transfer and no funds move permanently. If the destination account lost its transfer capability or was closed, Stripe skips the transfer and the funds stay in your platform balance. Stripe says a null transfer_data on the Charge object "indicates a skipped transfer", surfaced through the charge.updated event.

How does Acodei record the transfer from a destination charge?

As a balance-transaction line. Acodei documents a transfer as bucketed by day and currency and signed by the direction of the amount, with application_fee and application_fee_refund handled as their own types. Which QuickBooks account each line reaches is set by the product you map to that type under Account Mapping, then Balance Transaction Mapping.

What customers say about running Stripe through Acodei

Stripe Verified Partner BadgeQuickBooks Intuit Badge
If you're testing out all the different Stripe/QuickBooks integration apps right now, let me save you some time. This one is the best one by far.
RyanOwner at Indie Music Academy
Works well and is really helpful for massive transactions. The support is really fast and helpful. 100% recommended.
AndresCo-founder and CEO at Kanguro Collections and Reinsurance

Related reading

More glossary terms

See the full glossary

Ready to try Acodei?

Connect Stripe to QuickBooks Online in minutes and let the fees, refunds, and payouts land where your accountant expects them.