Unreversed transfer

Destination charge refund leaks

Destination charges give a platform the most control and the most liability. The refund path is where that asymmetry turns into cash leaving your balance for a sale you took a small fee on.

How the money actually moves

Stripe collects the full charge into your platform balance, then immediately transfers the amount minus your application fee to the connected account.

A refund debits your balance for the full refunded amount. The transfer already sent is untouched unless you ask for it back. On a $100 charge with a $10 fee, a full refund without reverse_transfer costs you $90 of your own money.

The three positions you must reconcile

Any correct reconciliation needs all three numbers together: what was refunded to the buyer, what was reversed from the connected account, and what happened to the application fee.

Checking any one in isolation produces a confidently wrong answer — which is worse than not checking, because it produces a number people act on.

const charge = await stripe.charges.retrieve(chargeId, {
  expand: ['transfer', 'application_fee'],
});

const transfer = charge.transfer as Stripe.Transfer;
const fee = charge.application_fee as Stripe.ApplicationFee;

const netPlatformMargin =
  (fee.amount - fee.amount_refunded) -
  (transfer.amount - transfer.amount_reversed);

When the reversal fails for insufficient funds

A reversal against an account with no balance still succeeds — Stripe creates it and leaves the seller negative, recovering it from their next inbound volume.

That is fine for an active seller and worthless for a dormant one. A reversal is best understood as a claim on future volume rather than a retrieval of past funds, which is exactly why reconciling continuously beats reconciling at month-end.

Should you switch to direct charges instead?

Moving to direct charges pushes refund and dispute liability onto sellers, and it is a much larger change than it looks: it changes merchant of record, buyer statements, who handles support, and exposure to card network monitoring.

It also removes control — on destination charges you can reverse a transfer when a seller disappears; on direct charges you never held the funds. Most platforms are better served fixing the reconciliation, which is a bounded engineering problem.