TL;DR: A decline is a normal
failed session, not an error — confirm with a GET, then start a new session with a new order_reference if the shopper wants to try again.When this happens
- The issuer declines the card (insufficient funds, risk block, expired card, and so on).
What you see
What to do
1
Confirm the outcome with a GET
Since the redirect carries nothing to distinguish a decline from an abandoned checkout, check the session directly (API reference):A
status of failed confirms a decline (or another failure) rather than an abandon (which stays pending until it expires).2
Show the shopper a generic decline message
Avoid echoing the issuer’s specific reason back to the shopper — see Decline codes for how to interpret the code internally without exposing it.
3
Start a new session for another attempt
The failed session can’t be retried in place. Create a new checkout session, with a new
order_reference so it doesn’t collide with the terminal one (API reference):Reusing the same
order_reference as the failed session returns that same terminal session again — it doesn’t create a new attempt. Use a new reference for a genuine retry. See Prevent duplicate payments for the full guidance on choosing and reusing order_reference.Related
Decline codes
Interpret the issuer’s response code.
Verify the payment result
The full decision table for every result signal.
Session lifecycle
Why a failed session can’t be replayed with the same order reference.
Handle failures
All ten failure scenarios, symptom → page.