All docs

charge.dispute.closed — who actually pays when you lose

Lose a Connect dispute and Stripe debits the platform for the full amount plus the fee, while the connected account keeps the funds. How to recover it.

What the event means

charge.dispute.closed fires when a dispute reaches a final state. Check status: lost means the platform is out of pocket, won means the funds came back.

Only lost represents a realised loss. Treating every closed dispute as a loss is a common bug that inflates recovery figures by roughly the win rate.

Where the money goes

On a lost dispute, Stripe debits the platform for the disputed amount plus a dispute fee. The connected account that received the original transfer is untouched.

Unless the platform reverses that transfer, it has funded a chargeback for a sale it took only a small fee on.

Calculating what is actually recoverable

The recoverable amount is the portion of the original transfer still sitting in the connected account: transfer.amount − transfer.amount_reversed.

It is not the charge amount. The transfer to a connected account is the charge minus the application fee, so using the charge amount overstates the recoverable balance by exactly the platform's own fee — and an automated reversal for that inflated figure is rejected by Stripe for exceeding the transfer.

The dispute fee itself is not recoverable from the connected account. It is a platform cost.

const transfer = await stripe.transfers.retrieve(charge.transfer as string);
const recoverable = transfer.amount - (transfer.amount_reversed ?? 0);

await stripe.transfers.createReversal(transfer.id, { amount: recoverable });

Act on dispute.created, not dispute.closed

Recovery is far more likely before the connected account's next payout clears. charge.dispute.created is the early warning worth acting on — the funds are still at risk rather than already gone.

FeeGuard raises a lower-severity finding on charge.dispute.created for exactly this reason, and excludes open disputes from automated clawback so a connected account is not penalised for a dispute that may still be won.

Liability depends on your charge type

Get this straight before building any recovery process, because it determines whether there is anything to recover at all.

Destination charges and separate charges & transfers: the platform is the merchant of record. Disputes are debited from the platform balance. This is where clawback applies.

Direct charges: the connected account is the merchant of record and Stripe debits them directly. The loss never reaches the platform, and there is nothing to claw back.

If you are unsure which you run, check whether your charges carry transfer_data[destination]. Destination charges live on your account; direct charges are created on the connected account with the Stripe-Account header.

The dispute fee is yours, permanently

Stripe charges a dispute fee — commonly around $15, varying by region — on top of the disputed amount. It is debited from the platform on destination charges.

It is not recoverable from the connected account, and including it in a reversal amount guarantees the reversal fails for exceeding the transfer balance.

On a high-dispute-volume platform this is worth tracking separately. It is a real cost of the business model, it does not appear in any transfer, and it is invisible to any reconciliation that only looks at charge and transfer amounts.

A worked example

A $600 order on a platform taking a 10% fee, disputed and lost:

You transferred $540 to the seller and kept $60. Stripe debits you $600 for the dispute plus $15 in fees. Your position before any recovery is −$555.

The recoverable amount is $540 — the transfer still sitting with the seller. Recover it and your net loss is $15, the dispute fee. Fail to recover it and your net loss is $555, which is thirty-seven times larger for the same event.

That ratio is why dispute recovery is usually the largest single line in a Connect platform's reconciliation, even on platforms where disputes are rare.

Inquiries, warnings, and disputes that are not disputes

Not everything arriving on the dispute endpoints is a chargeback. Treating them all identically produces both false findings and missed ones.

Inquiries and retrievals are requests for information. Funds are not withdrawn, and status reflects that. No loss has occurred and none may ever occur.

Early fraud warnings signal that a network flagged the transaction as likely fraudulent before any dispute exists. No debit has happened. Many platforms proactively refund at this point — which, if done without reverse_transfer, creates exactly the leak the companion articles describe.

warning_closed means a warning resolved without becoming a dispute. Nothing was lost.

Only status: lost represents a realised loss. Filtering on the event type alone, without checking status, is the most common bug in home-grown dispute reconciliation — it counts won disputes as losses and inflates the recoverable figure by roughly the win rate.

Partial dispute wins

A dispute can be resolved for less than the full disputed amount, and the resulting arithmetic surprises people.

When that happens, the amount debited from your platform is the settled amount, not the original. A reversal calculated from dispute.amount will exceed what you actually lost and, depending on the transfer balance, may either fail outright or over-recover from a seller who then has a legitimate complaint.

Read the actual debit from the dispute's balance transactions rather than from dispute.amount. The balance transactions record what moved; the dispute object records what was claimed.

// What was actually debited, not what was claimed
const debited = (dispute.balance_transactions ?? [])
  .filter((tx) => tx.amount < 0)
  .reduce((total, tx) => total + Math.abs(tx.amount), 0);

Evidence submission does not pause the clock

While a dispute is open you are gathering evidence, and the connected account is continuing to receive payouts on unrelated volume. Those two processes are unrelated, and the second one is quietly reducing your chance of recovery.

By the time a dispute closes — often 60 to 75 days after it opened — the funds you would reverse against have usually been paid out several times over.

Platforms with real recovery rates tend to act on charge.dispute.created, not charge.dispute.closed. See the companion article on that event for the trade-off, which is genuine: reversing early penalises a seller on a dispute that may still be won.