Listen to the charge.refund.updated webhook and check the refund's status field — a transition to failed indicates Stripe could not return funds to the original payment method
Retrieve the Refund object and inspect failure_reason (e.g., lost_or_stolen_card, expired_or_canceled_card, charge_for_pending_refund_disputed, or unknown) to determine the appropriate recovery path
For failed refunds where funds were not returned to the customer, Stripe returns the funds to your Stripe balance — confirm this by checking the refund object's balance_transaction and source fields
Deliver refund funds via an alternative method: use Stripe Payouts to bank account if you have the customer's bank details, issue a check, apply a credit to the customer's account in your system, or provide a gift card
Update the customer with a clear explanation of why the refund failed and how alternative delivery will work — this reduces disputes filed by customers who see no refund on their card
Document your refund failure handling procedure for compliance — some card networks and consumer protection regulations require timely alternative refund delivery within specified windows after a failed card refund
Known gotchas
When a refund fails and funds return to your Stripe balance, they are not automatically re-queued for alternative delivery — you must proactively detect failed refunds via webhooks and trigger your alternative delivery workflow; do not assume the issue resolves itself
Do not attempt to refund a failed refund by creating a new refund to the same payment method — if the card is expired or closed, the new attempt will also fail; verify the failure reason before choosing a recovery path
Regulatory requirements for alternative refund delivery timelines vary by jurisdiction — consult legal counsel and applicable consumer protection laws (e.g., Regulation E for ACH, card network rules for cards) rather than relying solely on Stripe's documentation
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp