CHARGEBACKSSTRIPE

How to win chargebacks on Stripe

How Stripe disputes work for subscriptions: statuses, reason categories, evidence fields, deadlines, fees, early fraud warnings and Smart Disputes.

Published 7 min read

A chargeback on a subscription payment costs you the payment, a fee, and some of your standing with the card networks. You get one chance to answer it, usually within a few weeks, and the bank decides based only on what you send. This guide explains how the dispute process works on Stripe and how to build an evidence packet that fits a subscription business.

It sticks to Stripe’s own documentation: how disputes work, respond to disputes, dispute reason code categories, dispute reason codes, evidence best practices, the Dispute object, Smart Disputes and the dispute fees FAQ (all accessed November 2026). Where Stripe’s pages leave a gap, we say so.

The dispute lifecycle

A dispute starts when the cardholder contacts their bank. Stripe then creates a Dispute object on the charge and sends the charge.dispute.created webhook. From there, the Dispute object moves through a small set of statuses:

Status What it means
warning_needs_response An inquiry (not yet a chargeback) that needs a response
warning_under_review An inquiry under review after you submitted evidence
warning_closed An inquiry closed without becoming a formal dispute
needs_response A chargeback that needs a response
under_review A chargeback under review after you submitted evidence
won / lost Resolved in your favor / in the customer’s favor
prevented A dispute that was prevented from becoming a formal chargeback

Inquiries matter because, per Stripe, no funds are withdrawn unless the inquiry is escalated to a dispute. If you lose an inquiry, it escalates: the status changes with a charge.dispute.updated event and the funds are withdrawn with charge.dispute.funds_withdrawn. When the case ends, charge.dispute.closed fires with won, lost or warning_closed.

On timing, Stripe’s how disputes work page says you usually have 7 to 21 days to respond after a chargeback is created, depending on the card network, and that the issuer typically takes 60 to 75 days to decide after you submit. The whole process can take two to three months. The exact deadline for each case is on the Dispute object and in the Dashboard; always work from that date, not from a rule of thumb.

Fees

Stripe charges a dispute fee when a dispute is opened, and a separate countered fee if you contest it. According to the dispute fees FAQ and Stripe’s US pricing page, in the US both are $15.00; the countered fee is returned if you win, and the dispute fee is not returned unless your contract says otherwise. Amounts differ by country, so check the pricing page for yours. Accepting a dispute does not avoid the dispute fee.

For Visa and Mastercard compliance disputes, Stripe collects an extra 500 USD network fee (or local equivalent) if you contest, refunded if you win.

Reason categories

Every network has its own reason codes. Stripe maps them to a reason value on the dispute, which is the first thing to read because it decides what evidence the bank will look at. The categories page lists them; the three that come up most for subscriptions are:

  • fraudulent: the cardholder says they did not authorize the payment (for example Visa 10.4, Mastercard 4837).
  • subscription_canceled: the cardholder says they were charged after cancelling (Visa 13.2, Mastercard 4841, Amex C28).
  • product_not_received: the cardholder says they did not get what they paid for (Visa 13.1, Mastercard 4855).

Other values exist, such as duplicate, credit_not_processed, product_unacceptable and general. Use the reason codes page to see what the network expects for each one.

What Stripe accepts as evidence

You submit evidence through the Dashboard or by updating the dispute through the API. The evidence hash has file fields and text fields. A few that matter for subscriptions, with Stripe’s descriptions paraphrased from the Dispute object:

Field Type Use it for
cancellation_policy File Your cancellation policy as shown to the customer
access_activity_log Text, max 20,000 characters Logs proving the customer used the product: IP addresses, timestamps, activity
customer_communication File Emails or messages with the customer
uncategorized_text / uncategorized_file Text / file Anything relevant that does not fit another field

The constraints Stripe documents on respond to disputes and best practices:

  • One submission. You can only submit once. After that you cannot edit the response or add evidence.
  • Stage first. Updating the dispute with submit=false stages evidence without sending it. A later request with submit=true (the default) sends it to the bank.
  • One file per evidence type. Combine several documents of one kind into a single multi-page file.
  • Size limits. Files are limited to a combined 4.5 MB, and Mastercard evidence to a combined 19 pages. All text fields together are limited to 150,000 characters. If the compiled packet is too long, the API returns dispute_evidence_page_limit_exceeded.
  • No links. Stripe notes that banks will not review external content, so do not rely on URLs or “call us”.

Evidence that works for subscriptions

Stripe’s reason codes page gives the direction for each category. Translated to a subscription business:

Subscription canceled

The bank wants to know whether the customer really cancelled before the charge, and whether they agreed to the terms.

  1. Show proof the customer accepted the subscription terms, including how and when they could cancel. Upload the relevant section of the policy as cancellation_policy, not your whole terms; Stripe suggests highlighting the part that applies.
  2. Give the cancellation record with exact timestamps. If the customer never cancelled, or cancelled after the charge, say so with the system log.
  3. If they used the product after the date they claim to have cancelled, include usage with timestamps and IPs in access_activity_log.
  4. If you refunded anything, include the refund record.

Fraudulent

The cardholder says they never authorized the payment. For a subscription, the strongest answer is that the same customer has been paying and using the account for a while.

  1. Show the history: earlier undisputed payments on the same card, account creation date, the email on file.
  2. Show use of the account: logins, IP addresses, devices, activity around the billing date.
  3. Include any communication from that customer that shows they know the service.

Product not received

For digital services, Stripe points to login records, download logs and usage timestamps, plus your terms. Show that the account was provisioned and used during the period that was charged.

Write a short cover note

Whatever the reason, put a plain summary in uncategorized_text: who the customer is, what they bought, what happened, and which attached document proves each point. The reviewer reads many cases; make yours easy to follow.

Early fraud warnings

Visa, Mastercard and JCB issuers can send early fraud warnings (EFWs) for payments they suspect are fraudulent, often before any dispute. Stripe exposes them as Early Fraud Warning objects and the radar.early_fraud_warning.created webhook. The object’s actionable field is true only while the charge has no dispute and has not been fully refunded.

Stripe’s guidance is not to refund every warning. Its docs say a refund does not remove the warning itself and only prevents the fraud report when it is processed as a reversal, which usually happens within about two hours of capture. Stripe suggests that refunding makes the most sense for charges roughly equal to or below your dispute fee, and gives a Workflows example that refunds under that amount and alerts a person above it. For a subscription, also consider cancelling the subscription on that card so the next renewal does not create a second dispute.

Smart Disputes

Stripe offers Smart Disputes, which assembles an evidence packet from data Stripe already has and, if you take no action, submits it just before the deadline. You can turn off auto-submit in the Dashboard. Stripe’s docs say the Smart Disputes fee is charged only when the dispute is won; check the current terms on that page, as Stripe lists the product as a preview. Smart Disputes can only use the data Stripe holds, so evidence that lives in your own systems (logins, usage, support threads) still has to come from you.

A response checklist

  1. Subscribe to charge.dispute.created, charge.dispute.updated, charge.dispute.closed and radar.early_fraud_warning.created.
  2. On each dispute, read reason and the response deadline first.
  3. Decide quickly whether to accept. If the customer did cancel and was charged anyway, accepting and fixing the cause may be the honest answer.
  4. Gather evidence for that reason: terms accepted, cancellation record, usage logs, communications.
  5. Stage the evidence with submit=false, check limits, have someone review it, then submit once.
  6. Record the outcome and the reason, so you can fix the patterns that cause disputes (unclear billing descriptor, hard-to-find cancel button, missed renewal reminders).

Doing this with NoChurn

NoChurn reads Stripe disputes and gathers evidence for each one automatically: the customer’s cancel flow answers, the emails NoChurn sent, usage data you send by API, and conversations from a connected help desk (read only). It drafts the response with AI, and nothing is sent to Stripe until a person on your team has reviewed it. Stripe still decides fees, deadlines and the outcome with the bank, and NoChurn cannot change those. NoChurn is free under $300 MRR, with every feature on every plan. See NoChurn + Stripe.

PROMPT

Read https://www.nochurn.sh/llms.txt,
then follow https://www.nochurn.sh/docs/quickstart/
to add NoChurn to this app. Use a test key
(nc_test_…) until I say we go live.

Stop leaking revenue.

  • Free until $300 MRR
  • No card needed
  • Live in 10 minutes
  • Never a cut of what we recover