Skip to main content
After you create an offramp order, you track it from the stablecoin deposit through to the fiat payout arriving in your user’s bank account. This guide shows you how to monitor that journey, react to each status correctly, and handle every outcome along the way. In this guide, you will learn how to:
  • Check an order’s status and know which fields to watch
  • Follow an order through each phase of its lifecycle
  • Map each status to the right UI state and next action
  • Receive order updates through webhooks instead of polling
  • Troubleshoot expired quotes and rejected payouts

Check order status

Fetch an order any time with its orderId (see the Get Order API reference for the complete response schema):
The response includes the full order object (see the Quickstart for the full end-to-end flow). The key fields to watch are:
  • phase: the high-level stage of the order
  • payment.status: whether the stablecoin deposit has been received
  • lineItems[0].delivery.status: whether the fiat payout is pending, in transit, completed, or failed
  • lineItems[0].delivery.rail: the payout rail the order routed through, snapshotted once resolved and never changed afterward (see Payment Schemes)
If you poll instead of using webhooks, use the status-handling reference below to decide when to stop and what to show next. Below is a full completed-order response with the key fields highlighted:
A completed order can still show quote.status: "expired" because the quote time window closes independently of payment and delivery. By itself, this does not indicate a problem. Rely on phase, payment.status, and lineItems[].delivery.status to determine the order outcome.

Order lifecycle

The full status model has four phases. Offramp orders start in payment, with the quote included inside the order, then move through delivery to completed when the payout reaches a terminal outcome. The quote phase appears if the quote expires before the deposit arrives.
Offramp order lifecycle showing the happy path (Order created, Deposit received, Payout in progress, Payout completed) and failure paths (quote expired before deposit, payout failed)
1

Payment: waiting for the deposit

After the order is created and the quote is locked, the order sits in the payment phase until the stablecoin deposit arrives on-chain and is matched by memo.
If no deposit arrives before the quote expires, the order returns to the quote phase with payment.status: "requires-quote". See Quote expired below.
2

Delivery: fiat payout in progress

Once the deposit lands, Crossmint converts the stablecoin and initiates the fiat payout. The order moves to the delivery phase.
Offramp settlement has two asynchronous parts: receiving the stablecoin deposit and completing the fiat payout. After payment.status becomes completed, the order may remain in delivery while the payout is being prepared, processed by the rail, or delayed by weekends and bank holidays. For rail-specific timing, see Payment Schemes.
3

Completed: terminal state

Once the bank transfer completes, the order moves to completed with a successful delivery status.
phase: "completed" means the order is terminal, not necessarily successful. Always check lineItems[0].delivery.status to determine the outcome: "completed" (success) or "failed" (see Bank rejection).

Order status reference

Each field below returns one of a fixed set of values. Expand a field for the full list.
In the standard offramp flow, payment.status typically moves through awaiting-payment, in-progress, and completed. The other statuses listed below represent missing setup steps, verification requirements, or payer-wallet conditions.
When a deposit cannot be processed or a payout fails, the order response may include a structured failure reason:
  • payment.failureReason: may be present when the deposit cannot be processed. Shape: { code, message?, developerMessage? }.
  • lineItems[].delivery.failureReason: may be present when the fiat payout fails. Shape: { code, message? }. Possible codes: transfer-failed, slippage-tolerance-exceeded, payment-refunded.
Payment failure reasons are returned on the order object. If you need to detect deposit-processing issues before a delivery event fires, refetch the order with the Get Order API and inspect payment.status and payment.failureReason.

Status-handling reference

Use this table to decide what to show the user and what action to take:
These statuses may appear during order setup or when the payer wallet has issues. Use payment.status as the key to decide what to show:

Webhooks

Instead of polling, subscribe to order events so Crossmint notifies your backend as the order progresses. Configure an endpoint in the Crossmint console and subscribe to events using the Webhooks guide. The events relevant to the standard offramp progression are: Use these events to drive your UI updates. For example, show the user “payout on the way” when you receive orders.delivery.initiated and “funds sent” when you receive orders.delivery.completed.

Troubleshooting

An offramp order spans two independent systems: an on-chain stablecoin deposit and a fiat payout over banking rails. Most orders complete on their own, but a few situations can interrupt the standard flow, most often a quote that expires before the deposit arrives or a payout the bank declines. Both are expected and recoverable. Expand a case below to see how to detect and resolve it.
If the user does not send the stablecoin deposit before the quote expires, the order returns to the quote phase. No funds are collected.
The exchange rate is stale. Create a new order to get a fresh quote.
If the bank rejects the payout after the stablecoin deposit has been received (for example, invalid account details), the order moves to completed with a failed delivery. The buyer deposit is automatically refunded.
Check payment.refunded to confirm the refund details. Listen for orders.delivery.failed so you can surface the issue in your app and prompt the user to try again with corrected bank details.

Next steps

Quickstart

Build the full flow

Launch in Production

Move from staging to live payouts