Skip to main content
Something can go wrong in two different ways during a Flow payment. A request can be rejected, which leaves the flow as it was, or the flow itself can fail, which ends it. This page explains both, lists the failure codes a flow reports, and describes how refunds work.

Rejected requests and failed flows

A rejected request is something the payer or your UI can usually recover from in the same flow, for example by requesting a new quote or choosing another source. The API guide and the SDK references list the errors each request can return. A failed flow cannot be retried. Its executionState or settlementState is failed, and its failure field describes the reason.

The failure record

A failed flow carries a failure object with these fields: Your server receives the same record in the failed execution webhook and in the settlement webhook when settlement fails.

Failure codes

Treat a code your integration does not recognize as a failure, and show the message.

Refunds

Refunds in Flow payments are performed by the provider that handled the payment, such as the deposit-address or conversion provider. Dynamic does not initiate refunds.
  • REFUND_INITIATED means the provider reported that it started returning the funds. For a deposit address, the funds go to the refund address the payer gave.
  • REFUND_FAILED means the provider reported that the refund failed. The funds were not returned, and you need to contact support to resolve it.
Never tell a payer that a refund is guaranteed before the flow reports REFUND_INITIATED. Funds sent to a deposit address after the flow was cancelled or expired have no provider refund. They can still reach your destination, the flow does not record them, and no webhook reports them, so you handle any refund to the payer. See Expiry and cancellation. A short payment in deposit mode is not a failure and is not refunded: the flow settles for the amount that arrived. See Short payments depend on the mode.

What to show the payer

Check the flow in this order and show the first outcome that applies:
  1. settlementState is completed: the payment succeeded. Show the delivered amount when the flow reports one.
  2. Either axis is failed: show the failure. When failure.code is REFUND_INITIATED, show that a refund was started.
  3. executionState is cancelled: the payment was cancelled.
  4. executionState is expired: the payment expired. A new payment needs a new flow.
  5. Any other state: the payment is still in progress.

Next

Payment lifecycle and states

Every state and what moves a flow between them.

Webhooks

How your server learns that a flow failed.
Last modified on October 27, 2026