Dispute/Chargeback Handling
Managing the process when a customer contests a charge with their bank, including automated evidence collection, response submission, and prevention strategies to minimize dispute rates.
Description
A dispute (chargeback) occurs when a cardholder contacts their bank to contest a charge on their statement. The bank forcibly reverses the payment and debits the merchant's Stripe account for the disputed amount plus a $15 dispute fee. The merchant then has a limited window (typically 7-21 days depending on the card network) to submit evidence proving the charge was legitimate. Stripe notifies your application of disputes via the charge.dispute.created webhook event, and you submit evidence through the Stripe API or Dashboard.
Effective dispute handling requires automated evidence collection. When you receive a dispute webhook, your system should immediately gather relevant evidence: the customer's name and email, IP address and device fingerprint from the original purchase session, delivery/access logs proving the service was provided, any customer communications acknowledging the purchase, your terms of service and refund policy, and prior successful charges from the same customer. Stripe's Dispute object accepts structured evidence fields (customer_name, customer_email_address, product_description, service_documentation_url, etc.) that should be populated programmatically where possible.
Prevention is more cost-effective than fighting disputes. Implement recognizable statement descriptors (set via stripe.charges.create or account settings) so customers recognize the charge, send immediate receipt emails after every payment, provide easy self-service refund and cancellation options, and use Stripe Radar rules to block suspicious transactions before they become disputes. Monitor your dispute rate carefully: card networks flag merchants with dispute rates above 0.75% (Visa) or 1% (Mastercard), and excessive disputes can result in monitoring programs, fines, or loss of processing ability.
Prompt Snippet
Handle charge.dispute.created webhooks by immediately querying your database for evidence: the order record, customer email/IP from the session, access/delivery logs, and prior charge history. Submit evidence programmatically via stripe.disputes.update(disputeId, { evidence: { customer_name, customer_email_address, customer_purchase_ip, product_description, service_date, access_activity_log, customer_communication } }) within 24 hours of creation. Set a recognizable dynamic statement descriptor with stripe.paymentIntents.create({ statement_descriptor_suffix: 'YOURAPP ORDER123' }) to reduce friendly fraud. Track your dispute rate as a key metric (disputes / successful_charges over rolling 30 days) with alerting at 0.5% to stay below Visa's 0.75% threshold.Tags
Related Terms
Fraud Detection Basics
Implementing fraud prevention measures using Stripe Radar rules, risk scoring, velocity checks, and behavioral signals to block fraudulent transactions before they result in chargebacks.
Refund Flow Design
Designing the end-to-end process for returning funds to customers, including full and partial refunds, internal state management, and integration with Stripe's Refund API.
Financial Data Audit Trail
Maintaining a complete, immutable record of all financial actions and state changes for compliance, debugging, dispute resolution, and regulatory requirements.
Payment Analytics & Reporting
Tracking and reporting on key financial metrics including MRR, churn rate, LTV, payment success rates, and revenue breakdowns to understand business health and inform decisions.