How to Handle Payment Disputes in Stripe
Learn what Stripe payment disputes are, why they happen, and how to respond so you can protect your revenue and keep customers happy.
What Is a Payment Dispute?
A payment dispute (also called a chargeback) happens when a customer asks their bank to reverse a charge — even though you already processed it. The bank takes the money back from your Stripe account and gives it to the customer, no questions asked at first.
Think of it like this: you sold someone a pizza, they ate the whole thing, but then their bank took the money back because the customer told the bank the pizza was never delivered. You would be out both the pizza and the money.
Stripe sends you an alert the moment a dispute lands in your dashboard. You then get a window to look at what happened and send back evidence explaining why the charge should stand. If you do not respond in time, the bank automatically rules against you — even if you did nothing wrong.
Disputes Can Quietly Drain Your Revenue
Every dispute you lose costs you the full charge amount plus a dispute fee from Stripe (usually around $15). If you are processing $10,000 per month and lose even a handful of disputes, that is real money slipping out the door.
Beyond the money, too many disputes can get your Stripe account restricted or shut down entirely. Stripe tracks your dispute rate — if it climbs too high relative to your total charges, they flag your account as risky.
The good news: most disputes are preventable with clear communication, honest refund policies, and solid record-keeping. And when disputes do happen, a good response with the right evidence wins more often than you would expect.
Key Insight
Stripe notifies you the moment a dispute lands — but the clock is already ticking. You typically have only 7 to 10 days to submit your evidence response. Knowing what evidence to gather before a dispute ever arrives is the difference between winning and losing.
The Dispute Lifecycle in 5 Steps
Here is what actually happens when a customer disputes a charge with Stripe:
The most common reasons customers dispute a charge are:
- Unauthorized use — Someone else used their card without permission (fraud). You can fight this with IP addresses, device fingerprints, and login records.
- Item not received — Customer says they never got what they paid for. Shipping proof and delivery confirmation are your best defense.
- Item not as described — Customer felt the product or service was different from what was advertised. Screenshots of your listing and clear communication help here.
- Canceled subscription — Customer claims they canceled before the charge hit. Your cancellation records and confirmation emails are key.
A Webhook Handler for Dispute Alerts
Stripe can push dispute events directly to your app using webhooks. Here is a simple Node.js example that listens for a new dispute and alerts your team right away — so you never miss a deadline:
// Simple Stripe dispute webhook listener const express = require('express'); const stripe = require('stripe')('sk_test_YOUR_KEY'); const app = express(); app.post('/webhook', express.raw({ type: 'application/json' }), async (req, res) => { const event = JSON.parse(req.body); // Handle dispute.created event if (event.type === 'charge.dispute.created') { const dispute = event.data.object; console.log('Dispute alert!'); console.log('Amount:', dispute.amount / 100, 'reason:', dispute.reason); // TODO: Send yourself a Slack message or email here // so you do not miss the 7-day response window. } res.send({ received: true }); }); app.listen(3000, () => console.log('Webhook listener running on port 3000'));
The key thing to remember: when Stripe creates a dispute, the deadline to respond is typically short. A webhook that fires immediately and alerts you (or your team via Slack or email) means you never waste time realizing a dispute exists three days too late.
Knowledge Check
Test what you learned with this quick quiz.