By Katerina V., payments content, covering crypto processing for iGaming and eCommerce operators.
A crypto checkout payment goes through several stages: first the transaction is confirmed on the blockchain, then the provider marks the payment as received, and only after that should the store's system update the order status. These events are connected, but they do not happen automatically, so it is possible for the money to have already arrived while the order still shows as unpaid.
This article looks at the path of a crypto payment from checkout to order update and explains where errors most often occur.
Crypto checkout links the payment to a specific order
Crypto checkout is not just a wallet address. The provider creates a separate payment request with an amount, a network, an expiry time and its own status: this is a standard pattern, for example, Coinbase Commerce's checkout object explicitly stores the amount, currency/network and expiresAt in ISO 8601 format, and generates a separate checkout.payment.expired event once the time runs out (Coinbase Developer Docs, «Creates a charge», 2026).
At the same time, the store has a separate order with its own status. These two entities need to be linked to each other.
| Entity | What it is | Where it lives |
|---|---|---|
| Cart | Products chosen by the buyer | Store website |
| Checkout / invoice | Payment request with amount and expiry | Crypto provider |
| Blockchain transaction | The buyer's transfer | Blockchain |
| Payment status | Payment status | Crypto provider |
| Order | The buyer's order | Store system |
| Order status | Order status | Store system |
| Webhook | Message about a payment status change | Provider → store |
| Settlement / payout | Crediting funds or a further payout | Provider / business system |
The key rule: payment status and order status are not the same thing. Their synchronisation needs to be set up in the integration.
Payment goes through three different stages
| Stage | Who records it | What it means |
|---|---|---|
| Transaction on the network | Blockchain | The buyer sent the transfer, and the network started confirming it |
| Payment at the provider | Crypto provider | The transaction was found and matched to the right checkout |
| Order update | Store backend | The store received the event and changed the order status |
These events usually happen one after another, but each one is handled by a separate system. So a confirmed transaction does not by itself mean the order has automatically moved to processing.

The order should be updated by a server-side event, not by a redirect

After paying, the buyer can be redirected to a "Payment successful" page. But the redirect itself does not confirm that the store has received and processed the payment information: the buyer might close the tab, lose their connection, or not return to the site. The Baymard Institute, in its checkout UX research, explicitly advises against relying on a redirect to an external payment page as the source of truth for status, this weakens both conversion and confirmation reliability (Baymard Institute, «E-Commerce Cart & Checkout Usability Research», 2026).
So it is better to update the order status on the backend after an event from the crypto provider, rather than after the success page opens.
The path of a crypto payment from checkout to order goes through ten steps
| Stage | What happens | What can go wrong |
|---|---|---|
| Buyer chooses crypto payment | The store creates the order | The order and payment are not linked |
| Backend creates the checkout | The provider receives the amount and order ID | The order ID was not saved |
| Provider shows the address and network | The buyer gets the payment details | The wrong network is chosen |
| Buyer sends the transfer | The transaction lands on the blockchain | Wrong amount, token or network |
| Network confirms the transaction | The payment receives confirmations | A delay occurs |
| Provider checks the payment | The amount, network and checkout expiry are matched | Underpayment, overpayment, or a late payment |
| Provider changes the status | The checkout is marked as paid | The status is not yet final |
| Provider sends the webhook | The store receives the event | The webhook did not arrive or arrived twice |
| Backend updates the order | The order changes status | Integration error or order not found |
| Store fulfils the order | The product or service is sent | Fulfilment starts too early |
A reliable integration needs to account for errors at every stage, not just the ideal scenario.
Checkout is better created on the backend
The most reliable setup is when the store's backend creates the checkout through the API and saves the link between the order and the payment request in advance.
| Model | What it fits | Order automation |
|---|---|---|
| Static address | Donations and simple scenarios | Limited |
| Payment Button | Simple sites and MVPs | Possible with backend processing |
| Hosted checkout through API | Online stores | Yes |
| CMS plugin | Standard stores | Depends on the plugin's capabilities |
| Custom API integration | Stores and marketplaces with their own logic | Yes |
| Marketplace with payouts | Multi-vendor platforms | Yes, but requires separate payout logic |
The main advantage of a backend integration is that the amount and order ID are saved before payment even happens. This lets the store unambiguously determine which order a received transaction belongs to.
Blockchain adds extra payment statuses

After cryptocurrency is sent, the transaction does not always become final right away. First it lands on the network, then it receives confirmations. The number of confirmations needed depends on the specific blockchain and the provider's rules.
For stablecoins, choosing the right network also matters. USDT is issued simultaneously on TRON, Ethereum, Solana, BNB Smart Chain, TON and several other networks (Tether.io, «Tether to Wind Down USD₮ Support for Five Legacy Blockchains», 2025). If the store supports one network and the buyer sends funds through another, the transaction may go through on the blockchain, but not be counted as a payment.
On top of that, the checkout needs to account for several standard situations:
- underpayment, the buyer sent less than the required amount;
- overpayment, they sent more;
- late payment, they sent it after the checkout expired;
- wrong network, they chose an unsupported network.
Because of this, "paid / not paid" logic is too simple for a crypto checkout.
Webhook links the payment to the store's system
A webhook is a message the crypto provider sends to the store's backend after the payment status changes. For example, when the checkout becomes paid, the provider sends an event, and the store checks it and moves the order to the next status.
This is the same pattern used in card processing: Stripe's official documentation recommends verifying the event signature against the raw request body (not the already-parsed JSON), using event.id for idempotency, storing processed IDs with a unique constraint so the same update isn't applied twice, and quickly returning a 2xx response while offloading heavy logic to a background queue, since delivery with retries can continue for up to several days (Stripe Docs, «Receive Stripe events in your webhook endpoint», 2026).
A webhook may not arrive, may arrive twice, or may arrive later than another event. So the backend needs to:
- verify the signature;
- quickly confirm receipt;
- correctly handle repeated events;
- store the event ID and order ID;
- have a backup status check through the API.
This setup reduces the risk of a situation where the money has already arrived but the order stays unpaid.
An order can be created before payment, but is better fulfilled after confirmation
A store does not have to wait for payment to create the order itself. It can appear earlier, for example to reserve the product or save the cart.
But sending the product, opening access to a digital product, or a seller payout is better triggered only after the backend has received and verified the final payment status.
For marketplaces, an extra layer appears: the buyer's payment, the order status, and the seller's payout all need to be tracked separately.
What has changed over the last 12 months
- Tether narrowed its list of supported networks. From September 1, 2025, Tether stopped issuing and redeeming USDT on five legacy networks — Omni, Bitcoin Cash SLP, Kusama, EOS and Algorand, as part of an infrastructure review, focusing on core networks like TRON, Ethereum, Solana, BSC and TON (Tether.io, 2025). For integrations that hardcode the list of supported networks, this is a reason to check that list again.
- Requirements for webhook processing became stricter de facto, not by regulation: as the number of payment providers has grown, mandatory signature verification and idempotency by event ID have become common practice, the same standard described in Stripe's current documentation.
These changes mainly affect the technical side of an integration: the list of supported networks and the reliability of webhook processing are worth reviewing not just once at launch, but regularly.
A correct integration gives a recoverable order state, but does not remove the need for the integration itself
Neither the webhook nor the API on their own solve the desynchronisation problem, they give the store tools to detect and fix it. From there, it remains a backend development task.
| Provides | Does not provide |
|---|---|
| A clear link between the transaction, the payment and the order | Does not remove the need for backend integration |
| Server-side payment confirmation | Does not let you rely on the redirect alone |
| Handling of underpayment, overpayment and late payment | Does not remove network delays |
| Webhook with repeated delivery | Does not remove the need for periodic checks via API |
The main job of the integration is to make sure the store can recover the order's state even after an error or a missed event.
Finassets sends the payment status through API and webhook, the order update stays on the store's side
Finassets provides tools for an API-first crypto checkout integration: Checkout API, order reference, Payment Button and signed webhook events.
The store's backend creates the checkout, saves the link with the order, and receives a notification after the payment status changes. The order update itself is carried out in the merchant's system, so it can be built into the store's or marketplace's own business logic.
- Onboarding. Usually takes 2–7 business days, subject to KYB and compliance review.
- Speed. A transaction is usually identified within ~15 seconds, and the balance is credited around 30 seconds after network confirmation.
- Fee. 0.40% → 0.30% → 0.25% → 0.20% depending on volume.
- Integration security. The API supports authentication, request signing, IP whitelisting and signed webhook events.
- Support. The technical team is available on Telegram. The Help Center has up-to-date instructions for integration and working with the platform.
Crypto checkout works reliably when the store tracks each of the three events separately
Crypto checkout works reliably when the store separately tracks the transaction on the network, the payment status at the provider, and its own order status. The main job of the integration is to correctly link these events through the backend and the webhook.
Then, even if there is a network delay or an event delivery failure, the store will still be able to determine the payment's state and correctly update the order.
→ Discuss crypto checkout architecture with the Finassets team