TL;DR: No signal ever arrives when a shopper simply leaves — the session stays
pending until it expires. Cancel it proactively, or reconcile by polling after the TTL.pending until it expires.
When this happens
- The shopper closes the tab or browser before entering payment details.
- The shopper clicks back or navigates to another site mid-checkout.
- In embedded mode, the shopper navigates your own page away from the iframe.
What you see
What to do
1
Don't wait on a redirect or event that will never arrive
There’s no signal from the shopper’s browser for this case — build your own UX around a timeout on your side (for example, “we didn’t hear back — did you complete your purchase?”) rather than waiting indefinitely.
2
Optionally cancel the session proactively
If your own UI detects the shopper has left (for example, they started a new checkout for the same cart), cancel the still-
pending session explicitly instead of waiting for it to expire (API reference):3
Reconcile by polling after the TTL, if you don't cancel proactively
Otherwise, check the session’s status after its TTL has elapsed:A
status of expired confirms nothing was charged. If you need to prompt the shopper to try again, see Handle expired checkout sessions.Related
Redirect integration
The full redirect-mode flow.
Embed hosted checkout
The full embedded-mode flow.
Handle expired checkout sessions
What happens once the TTL elapses.
Handle failures
All ten failure scenarios, symptom → page.