TL;DR: A session that hits its TTL becomes
expired and can’t be paid — confirm with a GET, then start a new session.ttl_minutes (5–60, default depends on your environment — see Session lifecycle). If the shopper doesn’t finish paying before it elapses, the session moves to expired and can’t be paid.
When this happens
- The shopper leaves the hosted page open past the TTL without completing payment.
- The hosted page’s own countdown times out: it redirects the shopper to your raw
cancel_urlwithreason=timeoutappended. - The shopper closes the tab or navigates away before the TTL — see Handle abandoned checkouts for that path instead; it looks the same server-side but nothing redirects the shopper back.
What you see
reason=timeout only appears on the countdown’s own auto-redirect. Don’t rely on it as your only signal that a session expired — always confirm with a GET request, since a shopper who manually clicks back or closes the tab gets no query params at all.What to do
1
Treat any cancel-URL return as unpaid, provisionally
A return to
cancel_url — with or without reason=timeout — never carries a sig, so don’t infer anything from it beyond “the shopper didn’t complete the redirect flow.” Confirm with the next step.2
Confirm the session's actual status
Call the authenticated session-status endpoint (using your secret key) from your server (API reference):A
status of expired confirms no charge happened.3
Start a new session if the shopper wants to try again
Create a fresh checkout session (API reference). You can reuse the same
order_reference — an expired session’s order_reference is no longer idempotency-active, so this creates a genuinely new session rather than replaying the old one.Prevent it
- Set
ttl_minutesto match how long your checkout page is realistically open (for example, longer for a page reachable from an abandoned-cart email link). - Surface your own countdown or warning in your own UI before the hosted page’s timer fires, if your integration keeps the shopper on your domain (embedded mode).
Related
Session lifecycle
Statuses, TTL, and retry rules in full.
Redirect integration
How the cancel-return step fits into the full flow.
Handle abandoned checkouts
When the shopper never returns at all.
Handle failures
All ten failure scenarios, symptom → page.