Refunds and disputes in Stripe: a guide for small SaaS
How refunds work in Stripe, what happens when a customer disputes a charge, when to accept or fight a chargeback, and how a SaaS can prevent most disputes.
Leer en español →
A refund is money you choose to give back; a dispute (or chargeback) is the customer's bank taking it back on their behalf. In Stripe you can refund all or part of a payment from the Dashboard or the API, but Stripe's processing fee on the original payment isn't returned. When a dispute opens, Stripe immediately debits the disputed amount plus a dispute fee from your balance, and you have one chance, usually within 7 to 21 days, to accept it or submit evidence.
This guide covers how refunds behave, how the dispute timeline works, how to decide whether to fight, what evidence helps a SaaS, and how to keep disputes rare.
How do refunds work in Stripe?
Open the payment in the Dashboard and choose Refund. The default is a full refund; enter a smaller amount for a partial one. You can bulk-refund full payments by selecting several in the list, but partial refunds have to be issued one at a time.
A few behaviours worth knowing:
- Fees. Stripe doesn't return the processing fee from the original payment, so a refunded sale still costs you that fee.
- Balance. Refunds come out of your available Stripe balance. If it doesn't cover the refund, card refunds wait as pending until it does; refunds for other payment methods fail instead.
- Timing. Stripe sends the refund to the customer's bank. When it shows on their statement depends on the card network and the bank.
- Failures. Rarely, a refund fails, for example on a closed account. Stripe sends
refund.failedand puts the money back in your balance, which can take up to 30 days. You then need another way to repay the customer. - Uncaptured payments. If you only authorised a payment and never captured it, cancel it instead. Cancelling costs nothing.
Does a refund cancel the subscription?
No. Refunding a subscription invoice gives the money back but leaves the subscription running, and it will renew next period. If the customer is leaving, cancel the subscription as well, either from the Dashboard or by letting them do it in the customer portal. Your webhook should handle charge.refunded according to your own policy, for example removing access when a payment is fully refunded.
What happens when a customer disputes a charge?
The sequence for a formal dispute is roughly:
- The cardholder tells their bank they don't recognise or don't accept a charge. Card networks typically allow this within 120 days of the payment, sometimes longer.
- The bank pulls the money back. Stripe debits the disputed amount and a dispute fee from your balance and sends
charge.dispute.created. - You get a deadline to respond, usually 7 to 21 days depending on the network. It's shown on the dispute in the Dashboard.
- You either accept, or submit evidence. If you counter, a separate dispute countered fee applies, and Stripe returns it if you win.
- The bank decides, usually within 60 to 75 days of receiving your evidence. The whole process often takes two to three months.
The fee for receiving a dispute isn't refunded even if you win, outside a few exceptions Stripe lists (such as businesses in Mexico). Check Stripe's pricing for the amounts in your country.
What is an inquiry?
Some networks, mostly American Express and Discover, start with an inquiry: the bank asks for information before filing a formal dispute. Stripe shows these as statuses starting with warning_. Respond to them. Ignoring an inquiry can turn it into a chargeback that is very hard to win, and answering one well can close it without any dispute fee.
What about early fraud warnings?
Card issuers sometimes flag a payment as likely fraud before any dispute. Stripe sends radar.early_fraud_warning.created. These need no response, but Stripe's data says about 40% of Visa and Mastercard warnings that aren't refunded become fraud disputes. For small charges, refunding proactively is often cheaper than paying a dispute fee. Stripe suggests it is generally worth it when the charge is about the size of your dispute fee or smaller.
Should you accept or fight a dispute?
Fight it when you have evidence that answers the specific reason the bank gives. Accept it when you don't, or when the amount is smaller than the time and fee it would cost to counter.
Two rules from Stripe's docs matter here:
- You only get one submission. Stripe forwards your response to the bank at once, and you can't edit it or add files afterwards. Assemble everything first.
- Don't refund a disputed payment. The bank has already returned the money to the cardholder. A refund on top would pay them twice. Accept or counter the dispute instead.
If your account uses Smart Disputes, Stripe can assemble and submit evidence for eligible disputes automatically before the deadline, and its fee applies only to disputes you win. Check whether it's enabled in your dispute settings.
What evidence helps a SaaS win?
Keep it relevant to the dispute reason and short. Issuers review many responses and won't search through long files. For a subscription product, useful evidence usually includes:
- Proof the customer agreed to the terms at signup, and the specific section on renewals or cancellations, not the whole document.
- Login and usage records after the charge, showing the account was used.
- The customer's email and IP address matching earlier, undisputed payments.
- Receipts and renewal reminders you sent.
- Your messages with the customer, trimmed to the relevant parts.
Your app can only produce this if it records it. Log sign-ins and important actions with timestamps, and store when each user accepted your terms.
How do you prevent disputes in the first place?
Many disputes on subscription products start with confusion rather than fraud: a name on the statement nobody recognises, or a renewal nobody remembered.
- Use a recognisable statement descriptor, ideally your product name or domain.
- Make cancelling easy. A customer who can't find the cancel button often calls their bank instead.
- Send renewal reminders before annual renewals, and receipts for every charge.
- Answer refund requests quickly. A quick refund costs less than a dispute.
- Restrict access when a dispute opens if your policy allows it, so the account isn't used for free while it's being decided.
Quick answers
Can I undo a refund? Some card refunds can be cancelled from the Dashboard for a short time, as long as they weren't processed as a reversal. After that, no.
Does Stripe decide who wins a dispute? No. The customer's bank decides; Stripe passes on your evidence.
What if I win after the customer already got a refund from me? That's the double-payment problem. Don't refund once a dispute exists.
Should my webhook listen for disputes? Yes. Handle charge.dispute.created and charge.dispute.closed, so your team hears about them in time to respond. Our subscriptions guide lists the related events.
Want your billing flow to hold up under disputes?
Good dispute outcomes start with what your app records long before anyone complains. Our Stripe payments service can add the logs, webhooks and cancellation flow that make that evidence easy to pull together. You can begin with the free app health check, read Stripe's guide to how disputes work, or contact us.


