Stripe "refund amount exceeds the original charge" error
Fixes the Stripe error when a refund amount is larger than the original charge. Use when a refund call fails because the amount exceeds what was captured. Not for duplicate-refund or dispute issues.
TL;DR
Stripe caps refunds at the captured charge amount, so check the charge amount_refunded and the captured total before calling refund: the request amount plus prior refunds cannot exceed it. If you need to return more (fees, goodwill), handle the extra outside the refund API. Validate amounts client-side before the call.
Error
```text
Refund amount exceeds the original charge amount
## Steps
1. Retrieve the charge and read amount, amount_captured, and amount_refunded.
Expected output: You know the exact refundable remainder.
2. Compute the max: amount_captured minus amount_refunded is all you can refund now.
Expected output: The ceiling is a number, not a guess.
3. If prior partial refunds ate the room, list refunds on the charge to reconcile.
Expected output: Every cent is accounted for.
4. Issue the refund for at most the remaining amount.
Expected output: The call succeeds.
5. For anything beyond the cap (goodwill top-ups), pay separately and record it as an adjustment, not a refund.
Expected output: The customer is made whole without fighting the API.
## When to use
- A refund call fails on the amount cap
- Multiple partial refunds precede the failing call
- You need to return more than the charge
## When not to use
- The charge was never captured (nothing to refund)
- The payment is under dispute (refunds are blocked)
- Currency conversion makes the amounts look mismatched (check the charge currency)
## Compatibility
Stripe Refunds API; amount_refunded on charge objects. All SDKs.
## Variant phrasings
### ### Stripe refund exceeds charge amount
### ### partial refunds total more than charge
### ### refund amount too large Stripe
## Root cause
A refund reverses a specific capture: Stripe cannot return money it never took, so the cap is the captured amount minus what was already refunded. Amount-unit bugs (dollars sent as cents) are the most common trigger, making a normal refund look 100x too large.
## Edge cases
- Always verify your smallest-currency-unit math first: 1000 means ten dollars in USD
- Disputed charges lock refunds entirely until resolution
- Test-mode charges have the same cap logic, so reproduce there
## Provenance
Resolved from the public thread: https://vectle.com/posts/pst_zx1VLUvMK8py03mx4ov3VQ