Payouts Lifecycle

Understanding the full lifecycle of a payout is critical for designing reliable systems and anticipating every possible event during the transaction journey.

At Bitnob, a payout typically passes through five major stages:

stage
description
1
Quote Requested
2
Payout Initiated
3
Funding Detected
4
Fiat Payout Processing
5
Completion (Success, Failure, or Expiry)

Each stage updates the payout’s Trip timeline. Four webhook events are emitted: payouts.initialized when the payout is accepted for processing, payouts.processing when the settlement rail picks it up, and payouts.withdrawal.success or payouts.withdrawal.expired on the terminal outcome. Intermediate stages are observed by polling GET /api/payouts/:id.


Lifecycle Diagram

flow

Step-by-Step Breakdown

1. Quote Requested

Action:

Customer calls POST /api/payouts/quotes.

Bitnob returns a quote_id with the amount to pay, destination currency, FX rate, and expiry timestamp.

Important:

Quote has a strict expiry time (typically 15 minutes).

Customer must initiate payout before the quote expires.


2. Payout Initiated

Action:

Customer calls POST /api/payouts/:quoteId/initialize with the quoteId and beneficiary details.

Bitnob responds with:

A payment address (BTC/USDT address or Lightning invoice),

Funding amount,

Trip ID to track the lifecycle.

Webhook:

payouts.initialized is emitted once the payout is accepted for processing. Nothing has settled yet — the customer is still expected to pay.


3. Funding Detected

Action:

Customer pays the provided address/invoice.

Bitnob detects the incoming payment.

Status — observe by polling GET /api/payouts/:id (no webhook is sent at this stage):

event
meaning
Asset received (status)
Asset detected on-chain or over Lightning.
Note

If payment is too late (after expiry), payout may be canceled or manually reconciled.

If underpaid, payout will adjust down proportionally.


4. Fiat Payout Processing

Action:

After payment is fully confirmed, Bitnob initiates the fiat payout to the beneficiary (bank, mobile wallet, cash pickup).

Webhook: payouts.processing is emitted when the rail picks up the payout.

event
meaning
Processing (status)
Fiat payout is now underway.
Note

Payout processing depends on the destination country/rail speed (NIP, SEPA, ACH, Mobile Money, etc.)

If the beneficiary account details are invalid, payout may fail here.


5. Completion (Success, Failure, or Expiry)

outcome
description
webhook
Success
Fiat funds delivered to the beneficiary account.
payouts.withdrawal.success
Failure
Fiat payout failed (e.g., invalid account, system downtime). The payout record moves to status FAILED.
— (poll GET /api/payouts/:id )
Expired
Payment not received within the quote window; payout canceled.
payouts.withdrawal.expired

Final Trip Timeline Snapshot:

completion_time is recorded on the terminal state,

Webhooks delivered to customer systems.


Quick Summary Table

lifecycle stage
trigger
trip fields
webhooks
Quote Requested
POST /api/payouts/quotes
quote_at
-
Payout Initiated
POST /api/payouts/:quoteId/initialize
initialized_at
payouts.initialized
Funding Detected
Payment observed on-chain
-
-
Funding Confirmed
Full confirmation thresholds met
finalized_at
-
Payout Processing
Fiat payout dispatched
processing_start
payouts.processing
Payout Completion
Success, failure, or expiry
completion_time
payouts.withdrawal.success, payouts.withdrawal.expired

Developer Best Practices

Treat every payout as a lifecycle with stages, not a single API call.

Use Trip ID as the anchor to track a payout through all webhook updates and fetches.

Handle both funding events and payout events separately — they are not the same.

Build for timeouts and failures gracefully (expired quotes, rejected payouts).

Log and monitor key lifecycle timestamps to improve operational efficiency and incident detection.


Random Thought

In Bitcoin + fiat hybrid payments, payout success depends not just on payment, but on orchestrating funding, confirmation, fiat liquidity, compliance, and beneficiary delivery together.

This lifecycle documentation gives you the full map to operate confidently.


Share on
Did you find this page useful?

Join our Discord