Skip to main content
Every checkout session begins in pending and ends in one of four terminal states: paid, paid_late, expired, or failed. Between those bookends, a status machine driven by on-chain events and a configurable confirmation threshold governs exactly how and when the session advances. Understanding this lifecycle helps you build reliable integrations and handle edge cases like underpayments, block reorgs, and late payments.

Status reference

StatusTerminal?Description
pendingNoSession created. Waiting for a transaction to be detected on the deposit address.
detectedNoA transaction with the correct amount has appeared on-chain. Waiting for the confirmation threshold to be reached.
underpaidNoA transaction was received, but the amount sent was less than expected. Merchant review required.
overpaidNoA transaction was received, but the amount sent was more than expected. Merchant review required.
paidYesThe exact (or overpaid) amount has been confirmed with the required number of block confirmations. Triggers the session.paid webhook.
paid_lateYesPayment confirmed after the session’s expiresAt timestamp but within the late-payment grace window.
expiredYesThe session TTL elapsed with no payment detected.
failedYesA terminal, unrecoverable error occurred.
An underpaid session does not automatically expire or become paid. It stays in underpaid until you take action in the dashboard. No automatic refund or top-up is attempted.

The detection flow

When a customer sends crypto to the deposit address, here is what happens internally:
1

Session created — unique deposit address derived

When the session is created, a deterministic deposit address is derived for it. EVM chains share the same address space (the same derived key works across all EVM networks), so the address is the same regardless of which EVM chain the customer uses — detection is scoped by chainId and asset.
2

Customer sends crypto to the address

The customer scans the QR code or copies the address from the hosted checkout page and broadcasts a transaction from their wallet.
3

On-chain activity detected in real time

Crypto Checkout subscribes to address-activity notifications for the deposit address. As soon as the transaction appears in the mempool or in a new block, a notification is pushed to the server in real time — no polling required.
4

Payment verified and amount classified

The server reads the received amount and compares it to the session’s expected amount.wei. The result is one of:
  • Exact → status advances to detected
  • Underpaid → status advances to underpaid
  • Overpaid → status advances to overpaid
5

Confirmations reach threshold — session finalized

Once the transaction accumulates the required number of block confirmations (configured by your operator), the session is finalized:
  • detected or overpaidpaid (or paid_late if expiresAt has passed)
  • underpaid → remains underpaid (requires merchant action)
At finalization, any configured sweep is triggered and the session.paid (or session.paid_late) webhook is dispatched to your registered endpoint.

State machine rules

The following table summarizes every valid transition. Any event applied to a status not listed in the “From” column is a no-op — the status does not change.
FromEventTo
pendingPayment detected — exact amountdetected
pendingPayment detected — underpaidunderpaid
pendingPayment detected — overpaidoverpaid
pendingTTL elapsedexpired
expiredPayment detected (within grace window) — exactdetected
expiredPayment detected (within grace window) — underpaidunderpaid
expiredPayment detected (within grace window) — overpaidoverpaid
detectedConfirmations reached — before expiresAtpaid
detectedConfirmations reached — after expiresAtpaid_late
overpaidConfirmations reached — before expiresAtpaid
overpaidConfirmations reached — after expiresAtpaid_late
detected / overpaid / underpaidBlock reorg detectedpending
Block reorgs roll a detected, overpaid, or underpaid session back to pending. The session then waits for the transaction to reappear on the canonical chain. If the reorg removes the transaction entirely and the TTL expires before it reappears, the session will eventually become expired.

Confirmations

The required confirmation count is configurable per deployment. A higher threshold increases security against double-spend attacks but increases the time customers wait for paid status. Lower-value transactions can safely use fewer confirmations; high-value transactions should use more. You can see the confirmation count progress in real time on the hosted checkout page. The session stays in detected (or overpaid) until the threshold is reached.

Late payments and the grace window

After a session’s expiresAt timestamp passes, the hosted checkout page shows an expiry message. However, the server continues monitoring the deposit address for a configurable grace window. If a payment arrives and confirms within this grace window, the session moves to paid_late instead of remaining expired.
Subscribe to both session.paid and session.paid_late in your webhook endpoint. Treat paid_late the same as paid for order fulfillment — the funds have confirmed on-chain.

Underpaid and overpaid sessions

Sessions in underpaid or overpaid require your attention:
  • Underpaid: the customer did not send enough. The dashboard shows the shortfall. You can contact the customer to request the difference, or cancel the order and arrange a refund.
  • Overpaid: the customer sent too much. The payment is still treated as successful once confirmations are reached (paid or paid_late), but you should consider issuing a partial refund for the excess.
Both states are surfaced in the dashboard under Sessions with a filter for underpaid / overpaid.

Manual payment check

If you believe a payment has been made but the session has not advanced (e.g. a notification was delayed), you can trigger an on-chain scan manually:
  1. Open the session in Dashboard → Sessions.
  2. Click the Check payment button.
This performs an immediate RPC call to scan the deposit address for incoming transactions — it does not wait for a webhook and will update the session status in real time if a payment is found.

Next steps

Webhooks Overview

Set up webhook endpoints to receive real-time session.paid notifications.

Webhook Event Types

Full reference for every event type Crypto Checkout can deliver.