ChargebackDeskchargeback evidence for digital goods

ChargebackDesk · Reason codes · Visa 12.6.1

Visa reason code 12.6.1: Duplicate Processing

The cardholder says one purchase was charged more than once. It's a processing-error code: the question is about your billing records, not the product. There are only two answers that hold up — the charges were two separate purchases, or the extra charge was already refunded. If neither is true, the cardholder is right.

At a glance
NetworkVisa
FamilyProcessing error (12.x)
In StripeIn our mapping, usually shown with the reason duplicate; the network code is on the dispute where Stripe exposes it (network_reason_code)
Network timeframeUnder Visa's current rules, typically 120 calendar days from the transaction processing date
Your deadlineThe due-by date on the dispute in Stripe
Sibling code12.6.2 Paid by Other Means — the cardholder says they paid another way. It works the same way: show the card charge was a separate, real transaction.

What it means

The cardholder's bank is told the same transaction posted twice (or more) — in Visa's terms, one transaction processed more than once on the same card, on the same transaction date, for the same amount. For subscriptions and digital products this usually means a retry after a failed payment, a double-click at checkout, or a customer who bought twice on purpose and forgot. Stripe's evidence fields let you name the other charge (duplicate_charge_id) and explain the difference in plain terms (duplicate_charge_explanation).

Response deadline

  • The deadline that binds you is the evidence due-by date on the dispute in Stripe (evidence_details.due_by). If you don't respond by then, you automatically lose the dispute — work to this date, not to the network's own limits.
  • Evidence is effectively a single submission — submit a complete packet, because you generally cannot add to it afterwards.
  • Work backwards: aim to submit at least 72 hours before the due-by date.

The two stories that win

Story A — two separate purchases

Each charge has its own record: separate order IDs, separate license keys, separate seats or accounts, or different billing periods — and each was delivered. Lead with a side-by-side table: charge ID, timestamp, amount, order ID, and what was delivered for each.

Story B — the duplicate was already refunded

The refund record is the case: refund ID, an amount matching the disputed charge, and a timestamp before the dispute was filed. One exhibit, stated plainly.

Check Stripe's own option first. Where the charge was fully refunded through Stripe before the dispute, Stripe's Smart Disputes can build the refund defense for you, with no Smart Dispute fee, where Stripe offers it — whether a dispute qualifies is Stripe's call, so check the dispute in your Dashboard. When Stripe submits through Smart Disputes, there's no countered fee either. If Stripe offers it on your dispute, you may not need a packet from anyone, including us.

What evidence wins

  1. Both charge records side by side — IDs, amounts, timestamps, and statuses from your Stripe export.
  2. A separate delivery record for each charge (Story A), each timestamped at or after its own charge.
  3. The refund record (Story B), dated before the dispute.
  4. Paired receipts — one receipt per charge showing they're different purchases.

Digital-goods specifics

  • SaaS and memberships: two charges in the same billing period is a duplicate unless they're for different seats, plans, or add-ons. Proration and upgrade charges need to be shown line by line.
  • Courses: a second purchase of the same course is rarely two real purchases unless it was a gift or a second seat. Look for a second enrolled account.
  • Downloads and licenses: two license keys issued, two activations — that's Story A. One key and two charges is a duplicate.
  • Payment retries: if your billing retried after a decline and both attempts succeeded, that's a duplicate. Accept the dispute in Stripe (the customer already has the money back) and fix the retry logic.

The minimum checklist

  • ME-D1 — both charges identified from the Stripe export (IDs, amounts, timestamps), with the other charge set as duplicate_charge_id.
  • ME-D2 (Story A) — a distinguishing record for EACH charge AND delivery for both: two entitlements, not one entitlement plus a bare second charge.
  • ME-D3 (Story B) — refund record with a matching amount and a timestamp before the dispute.

Common mistakes

  • Using access logs to show two purchases. Use shows the product was used, not that it was bought twice.
  • Sending one receipt for both charges. One receipt is evidence of one purchase.
  • Fighting a real duplicate. If the charges can't be told apart, accept and fix the billing issue that caused it.

Fight or accept?

Fight it when

  • Each charge has its own order, license, seat, or billing period, and both were delivered (Story A).
  • The duplicate was refunded before the dispute, and the refund amount matches (Story B).

Accept it when

  • Same amount, same purchase, one order, one delivery, no refund — it's a real duplicate.
  • The second charge was a billing retry that went through after the first had already succeeded.
  • The refund was partial, failed, or issued after the dispute was filed, and you can't reconcile it.

Accepting a chargeback in Stripe closes it (accepting an inquiry doesn't resolve it — answer it with evidence or a full refund instead). Don't try to refund an open chargeback — the disputed amount has already been withdrawn from your balance, and Stripe doesn't allow refunds outside the dispute process while the dispute is open.

Got it as an inquiry? (Rare — Stripe notes Visa no longer uses that stage; Amex and Discover do.) Answer it with a narrative plus the single strongest exhibit: the paired receipts (Story A) or the refund record (Story B). If it's a real duplicate, a full refund resolves an inquiry with no Stripe dispute fee; accepting an inquiry doesn't resolve it.

Want the packet built for you? Start a case. You get a finished, sourced packet, and nothing is submitted without your approval — today you submit it yourself in Stripe, with no Stripe login and no integration. Our fee is 20% of what you recover, charged only if you win. If you lose or we decline, our fee is $0. Stripe's own dispute fees are separate. If a case isn't worth fighting, we'll tell you before you spend time on it.

Related