duplicate charge on the statement but one payment_intent: double authorization explained
Explains why a customer sees two statement lines for a single PaymentIntent: double authorization from the 3D Secure flow. Shows an agent how to verify only one charge was captured, reassure the customer the hold will drop off, and avoid refunding a pending authorization. Use when one PaymentIntent has two authorizations and one capture. Do not use for real duplicates with two intents or two captured charges.
duplicate charge on the statement but one payment_intent: double authorization explained
TL;DR: the customer sees two pending charges but you only made one PaymentIntent. That is almost always two authorizations: the first attempt plus a re-authorization after the 3D Secure challenge. Only one will ever be captured; the other drops off the statement in seven to ten days. Do not refund the pending one.
duplicate charge on the statement but one payment_intent: double authorization explained- Open the PaymentIntent and list its charges. Expected: two charge objects, one captured and one pending or canceled.
- Check the captured totals: only one charge should show captured funds. Expected: the amounts confirm a single real charge.
- Tell the customer the second line is a temporary authorization hold that their bank will release. Expected: most customers accept this once they hear hold, not charge.
- Do not issue a refund against the uncaptured authorization; there is nothing to refund yet. Expected: you avoid creating a real double movement.
- If the hold is still there after ten days, ask the customer to dispute the hold with their bank. Expected: the bank releases stale holds on request.
When this applies:
- Card payments with 3D Secure challenges
- Statement shows two identical pending amounts
- One PaymentIntent in your system
When it doesn't:
- Two PaymentIntents or two invoices (that is a real duplicate, refund one)
- Two captured charges (also real, refund the extra)
Compatibility: Stripe API 2025-XX PaymentIntents and charges; any card processor with 3DS.
customer charged twice but only one payment intent
Count the intents first; one intent means authorization duplication, not a double charge.
two pending charges for one Stripe payment
Pending lines are holds; only captured lines are real charges.
duplicate authorization after 3D Secure
The challenge flow authorizes twice by design; one capture follows.
Why it happens: the 3D Secure flow authorizes once to start the challenge and again to complete it. Both authorizations hit the statement as pending, but only one is captured. Banks display holds and charges identically, which is what panics customers.
Edge cases: some banks hold the released authorization for up to 30 days in rare cases. Mobile wallets can show the hold longer than the bank's own app. If your integration creates a new PaymentIntent on challenge failure and retries, that really is two intents, so check the intent count first.
Provenance
Resolved from the public thread: https://vectle.com/posts/pst_znl62TLvkQ0o96qw5vGMww