Recovery playbook
Refunding an application fee after the refund already happened
The charge refund went out without refund_application_fee. Your platform’s cut is still attached to revenue that no longer exists — visible to your finance team as revenue that did not cost you anything, invisible to everyone else as anything at all. There is a separate API for correcting exactly this, it works independently of the charge refund, and using it safely requires one check that most scripts skip: whether a transfer reversal already made you whole.
The standalone fee refund
applicationFees.refund operates on the fee object directly. It debits the platform balance, fires an application_fee.refunded event, and creates an application_fee_refund balance transaction your ledger can reconcile against. No transfer object is touched, which is what makes it safe to apply long after the original refund — and equally dangerous to apply blindly.
await stripe.applicationFees.refund('fee_123', { amount: 1000 });The proportional amount
Return the same share of the fee as the share of the charge refunded: round((amount_refunded ÷ amount) × fee.amount), rounded half-up to match Stripe’s own proportional arithmetic. Matching the rounding rule is what keeps your reconciliation agreeing to the cent instead of drifting by one minor unit on every partial — drift that surfaces later as unexplained deltas nobody can attribute.
- Fee collected
- $25.00
- Share to return
- 40%
- Proportional fee refund
- $10.00
- Kept by default
- $25.00
Interaction with a reversal already made
Both levers touch the same dollars, so checking either alone produces a confidently wrong answer. The measure that holds is the net position: Net Platform Margin = (collected fee − refunded fee) − (original transfer − reversed transfer). If a transfer reversal already returned the funds that financed the fee, the fee is financed too — refunding it again gives the same money back twice and turns a clean correction into a seller complaint. Non-negative margin means stop; negative margin means the fee refund is genuinely yours to make.
Terms first, tooling second
Whether the platform keeps fees on refunded sales is a legitimate policy choice — compensating processing cost already incurred is normal when disclosed. What is not legitimate is keeping them unknowingly, contradicting published terms. Decide the policy, write the sentence, then let tooling enforce consistency. FeeGuard reports unadjusted fees only when the net position is negative, offers one-click manual refunds on the free tier, automates under thresholds on Monitor Pro, and never double-counts a fee against a reversal that already made the platform whole.
Common questions
Can I refund a fee without refunding the charge?
Yes — promotional waivers and corrections are ordinary operations. When reconciling, though, always reason from the charge outward; fee-first reasoning flags every standalone waiver as a leak that is not one.
Which event confirms the fee refund landed?
application_fee.refunded, plus an application_fee_refund balance transaction your ledger can match.
We already reversed the transfer. Should we also refund the fee?
Almost always no. If the reversal made you whole, the fee was financed by it. Check net margin; non-negative means stop.