Payments progress through a workflow that plans the payment and then executes a sequence of funds transfer steps.
- Payment Planning (prior to funds movement)
- Plans the route for the payment and obtains quote information. See Payment planning.
- Screens beneficiary wallet risk
- If manual risk review is required, a user with sufficient permissions can review the payment in the Tesser dashboard, or the decision can be programmatically delivered to Tesser via API.
- Payment Execution (funds movement)
- Reserves available balance (if insufficient funds, will enqueue for future execution)
- Uses the signing keys configured for the organization to authorize transfers (if using self-custodial model)
- Requires explicit initiation/approval by the customer (or their configured signing automation) — Tesser cannot execute unilaterally
- Results in funds actually moving on the specified blockchain network
- If applicable, delivers fiat to the beneficiary
Example workflow for stablecoin payouts:

Example workflow for fiat payouts:

Statuses in the payment workflow
Certain components of a payment maintain their own status as the payment progresses through the workflow:
- Risk review
- Balance Check
- Transfer steps
*Note: For transfer steps, it is possible for the next step to begin execution prior to a prior step completing. E.g. a transfer of fiat may begin prior to a transfer of crypto finalizing.
Risk statuses
Result of risk review performed on beneficiary wallet
| Status | Terminal | Webhook event type | Description |
|---|---|---|---|
unchecked | No | Not sent. All payments at creation have a risk status of | Beneficiary wallet identifier has not been supplied or risk check has not yet completed. |
awaiting_decision | No | Risk.updated | Beneficiary wallet has been risk screened and requires manual review to determine whether to send the payout. |
auto_approved | Yes | Risk.updated | Beneficiary wallet has been risk screened and automatically approved per your organization's policy. |
manually_approved | Yes | Risk.updated | Beneficiary wallet has been risk screened and has been manually reviewed and approved. |
auto_rejected | Yes | Risk.updated | Beneficiary wallet has been risk screened and automatically rejected per your organization's policy. |
manually_rejected | Yes | Risk.updated | Beneficiary wallet has been risk screened and has been manually reviewed and rejected. |
Balance statuses
Result of balance check for source wallet
| Status | Terminal | Webhook event type | Description |
|---|---|---|---|
unreserved | No | Not sent. All payments at creation have a balance status of | Source wallet id has not been supplied or the reserve operation has not yet completed. |
awaiting_funds | No | Balance.updated | The balance of the source wallet was checked and there are insufficient funds to process the payout. The payment is queued and awaiting funds from a deposit. |
reserved | Yes | Balance.updated | The balance of the source wallet was checked and funds were reserved to process the payout. |
Payment Steps
Each payment consists of multiple steps that track the money movement through the system:
- On-Network Transfer: Transfer stablecoins on the underlying network
- Cross-Network Bridge: Move assets between different networks (when needed)
- Token Swap: Convert between different stablecoins or tokens (when needed)
- Fiat Conversion: Convert stablecoins to fiat currency (when needed for off-ramped payments)
Steps are tracked individually, allowing you to monitor the exact progress of each money movement operation.
Payment steps statuses
| Status | Terminal | Webhook event type | Description |
|---|---|---|---|
created | No | Not sent. All steps at creation have a status of | Tesser has created a record for this step. |
submitted | No | step.updated | Tesser submitted the step information to the blockchain or fiat payment network |
confirmed | No | step.updated | The step was accepted by the operator of the payment network |
finalized | No | step.updated | For crypto transfer steps, the block containing the transfer step has been finalized. The transfer step is now permanent and irreversible. How long it takes to finalize a transfer depends on the blockchain. |
completed | No | step.updated | For fiat transfer steps, indicates the local payment network has delivered funds to the beneficiary. *Note, some fiat payment networks may not provide formal confirmation of funds delivery, in which case funds are assumed to be delivered unless a |
failed | Yes | step.updated | The transfer step was not successful; funds were not transferred from the from_account to the to_account |