A duplicate charge means Stripe successfully collected payment for the same Shopify order more than once. It's not a common failure, but it happens often enough — and quietly enough — that most merchants don't discover it until a customer complains or a bookkeeper flags an odd pattern in the Stripe payout report.
The financial risk cuts both ways: you owe the customer a refund for the second charge, and if you don't catch it first, they'll file a dispute — which costs you a chargeback fee on top of the refund.
Why Stripe double-charges a Shopify order
- Checkout retry on a slow connection: The customer clicks "Pay" and the page appears to hang, so they click again. If the first request actually succeeded server-side but the confirmation was slow to return, both clicks can produce a successful charge.
- Idempotency key not set (or reused incorrectly): Stripe's API is designed to prevent duplicate charges when a request is retried with the same idempotency key. If a checkout integration doesn't set one — or generates a new key on every retry instead of reusing it — Stripe has no way to recognize the retry as the same request.
- Webhook-triggered double fulfillment: Some custom checkout flows charge the card directly from a webhook handler. If the webhook fires twice (which Stripe's own documentation says can happen and integrations must handle), and the handler isn't idempotent, the card gets charged twice.
- Split payment methods: A customer starts checkout with a saved card, the payment appears to fail, they switch to a different card and complete the order — but the first charge actually went through moments later, after the perceived failure.
How to find duplicate charges manually
Why this is hard to catch at scale
At low order volumes, an eyeballed scan of the Stripe dashboard can surface obvious duplicates. Past a few hundred orders a month, it stops being realistic — duplicates hide inside a payout report with thousands of line items, and the two charges are often separated by exactly the amount of time it takes a customer to click "Pay" twice, which varies from a few seconds to a few minutes.
The fix isn't a smarter spreadsheet — it's matching every Stripe charge to its Shopify order automatically, so any order with more than one successful charge attached to it gets flagged the moment it happens, not discovered a month later during bookkeeping.
Fincile flags every duplicate charge automatically
Connect Shopify and Stripe, and Fincile matches every order to its charges — surfacing duplicates, missing payments, and refund mismatches with the order ID and variance amount attached.
No credit card required · Read-only access · Results in minutes