Direct answer
Why did my Stripe Connect refund lose money?
Because refunding a destination charge returns the buyer’s money from your platform balance, while the original transfer to the connected account stays put unless your code explicitly requested it back with `reverse_transfer: true`. Stripe executed exactly what was asked — a valid instruction, executed silently — and the missing boolean meant nobody asked. Your ledger disagrees with reality by precisely the transfer amount minus any fee refunded.
The three positions to check
Every refund moves three objects: the buyer’s refund (from platform balance), the seller’s transfer (untouched by default), and your application fee (kept by default). On a $100 sale with a $10 fee: buyer gets $100 from you, seller keeps $90, you keep $10 — netting −$90 against a sale you earned $10 from. Any reconciliation checking only one position produces confident nonsense.
- Buyer refunded (from you)
- −$100.00
- Seller transfer reversed
- $0.00
- Your net position
- −$90.00
The four causes this could be
Unreversed transfer (most common). Application fee kept on dead revenue. Lost dispute debited while seller kept funds. Cross-border conversion drag. All four share the silence property — no error, no log line — and all four are detectable from the same event stream you already emit.
What to do now
Prevent forward leaks: both flags on every refund path, including admin tools and support macros. Recover backward leakage: reversals work whenever seller balances remain reachable, which decays per payout cycle. The seven-step checklist enumerates the audit manually; the free scanner does it computationally in minutes.
Common questions
Is this a Stripe bug?
No — it is documented default behaviour executing valid instructions. That is why nothing warned you, and why detection belongs on your side.
Can past refunds be recovered?
Yes, wherever connected-account balances remain reachable — 90 days is the practical lookback and payouts erode reachability continuously.
How do I prevent it permanently?
Both flags on every path that issues refunds, verified by tests asserting their presence — plus continuous monitoring for paths that appear later.