Fraud Prevention 9 min read

How to Fight a Stripe Chargeback (and Win)

Matt King

Matt King

November 5, 2025

How to Fight a Stripe Chargeback (and Win)

The average merchant wins about 30% of chargebacks they contest. Most lose because they submit the wrong evidence — or no evidence at all. With the right data attached to each transaction, you can push your win rate above 50%.

This guide covers the Stripe-specific workflow: what happens when a dispute is filed, which reason codes you can realistically win, and exactly what evidence to submit.

How Stripe Chargebacks Work

When a customer disputes a charge with their bank, Stripe:

  1. Debits the transaction amount plus a $15 dispute fee from your account
  2. Sends a charge.dispute.created webhook event
  3. Gives you 7-21 days to submit evidence
  4. Forwards your evidence to the card network for a decision
  5. Returns the funds if you win (the $15 fee is non-refundable either way)

The entire process takes 60-90 days from dispute filing to resolution.

Which Disputes Can You Win?

Not all chargeback reason codes are equally contestable. Focus your effort where evidence matters most:

Reason Code Dispute Type Win Probability Key Evidence
fraudulent Customer claims unauthorized Medium (40%) IP match, email validation, usage logs
product_not_received Claims non-delivery High (60%) Delivery tracking, access logs
duplicate Claims charged twice High (70%) Transaction records showing distinct charges
subscription_canceled Claims they cancelled Medium (50%) Cancellation policy, no cancellation record
unrecognized Doesn't recognize charge High (55%) Clear billing descriptor, receipt email

The fraudulent reason code is the most common and also the most important to contest. This is where pre-transaction data makes the biggest difference.

The Evidence That Wins Disputes

For "Fraudulent" Disputes

This is where fraud prevention data becomes your strongest weapon:

  1. Email validation proof — Show that the email passed validation: not disposable, valid DNS, low risk score. This demonstrates the customer used a real email address.
  2. IP address and geolocation — Show the purchase IP matches the customer's billing country. Include VPN/proxy detection results.
  3. Login and usage logs — Timestamps showing the customer logged in and used the product after purchase. This is your strongest evidence for digital products.
  4. Device consistency — Same device/browser used for signup and purchase.
// Example evidence data from Fidro validation
{
  "email": "customer@gmail.com",
  "disposable": false,
  "dns_valid": true,
  "risk_score": 0.12,
  "ip": "203.0.113.42",
  "ip_country": "US",
  "vpn": false,
  "proxy": false,
  "validated_at": "2025-09-15T14:23:00Z"
}

For "Unrecognized" Disputes

These are often the easiest to win:

  1. Billing descriptor — Show what appears on their statement. If it's unclear, fix it in Stripe.
  2. Receipt email — Proof the customer received a receipt at their email address.
  3. Account activity — Login records showing continued use of the service.

For "Product Not Received" Disputes

  1. Access logs — For digital products, show the customer accessed the service.
  2. Delivery tracking — For physical products, provide shipping confirmation and tracking number.
  3. Download records — If applicable, show file downloads or content access.

Automating Evidence Collection

Set up a Stripe webhook listener that automatically gathers evidence when a dispute is filed:

// Stripe webhook handler
app.post('/webhooks/stripe', async (req, res) => {
  const event = req.body;

  if (event.type === 'charge.dispute.created') {
    const dispute = event.data.object;
    const charge = await stripe.charges.retrieve(dispute.charge);

    // Retrieve stored Fidro validation data
    const fraudData = await getFraudCheckForCustomer(charge.customer);

    // Retrieve usage/access logs
    const accessLogs = await getAccessLogs(charge.customer);

    // Submit evidence automatically
    await stripe.disputes.update(dispute.id, {
      evidence: {
        customer_email_address: charge.receipt_email,
        customer_purchase_ip: fraudData?.ip,
        access_activity_log: formatAccessLogs(accessLogs),
        uncategorized_text: formatFraudEvidence(fraudData),
      },
    });
  }

  res.sendStatus(200);
});

The Prevention-First Approach

Fighting chargebacks is expensive even when you win. The $15 fee is non-refundable, and the operational cost of gathering evidence adds up.

The most effective strategy is preventing chargebacks before they happen:

  1. Validate emails at signup — Block disposable emails and flag high-risk addresses using Fidro's API
  2. Check IPs at checkout — Catch geographic mismatches and VPN usage
  3. Use clear billing descriptors — Set this in your Stripe dashboard
  4. Send receipt emails — Immediate confirmation reduces "unrecognized" disputes
  5. Offer easy refunds — A self-service refund is cheaper than a chargeback

Next Steps

  1. Set up the charge.dispute.created webhook in Stripe
  2. Start collecting fraud prevention data at signup with Fidro's free plan
  3. Attach validation data to every Stripe customer record
  4. Build your automated evidence submission pipeline

Frequently Asked Questions

What is the average chargeback win rate?

The average merchant wins about 30% of chargebacks they contest. However, merchants who submit comprehensive evidence — IP logs, email validation data, usage records, and delivery confirmation — can achieve win rates of 50-65%. The key is submitting the right evidence for each dispute reason code.

How long do I have to respond to a Stripe chargeback?

You typically have 7-21 days to submit evidence after Stripe notifies you of a dispute. Stripe sends a charge.dispute.created webhook event immediately. The exact deadline depends on the card network (Visa, Mastercard) and the dispute reason code.

What evidence should I submit for a Stripe chargeback?

The most effective evidence includes: customer email and IP address at time of purchase, proof the email passed validation (not disposable, valid DNS), login/usage logs showing the customer used the service, billing descriptor evidence, and any customer communication acknowledging the purchase.

Does Stripe charge a fee for chargebacks?

Yes. Stripe charges a $15 dispute fee for each chargeback. This fee is non-refundable even if you win the dispute. Some high-risk businesses may face higher fees. This is in addition to the transaction amount being held during the dispute process.

Can I prevent chargebacks entirely?

You cannot prevent all chargebacks, but you can dramatically reduce them. Pre-transaction fraud detection (email validation, IP checks, risk scoring) prevents the most common fraud patterns. Clear billing descriptors reduce "I don't recognize this charge" disputes. Proactive refund policies reduce friendly fraud.