Skip to main content

Payment link states

PENDING โ†’ PROCESSING โ†’ CONFIRMED
โ”‚
โ”œโ”€โ†’ EXPIRED (terminal โ€” not paid before TTL)
โ””โ”€โ†’ CANCELLED (terminal โ€” cancelled via API)
StateMeaning
PENDINGCreated, awaiting payment on any enabled rail
PROCESSINGM-Pesa STK push sent, waiting for PIN confirmation
CONFIRMEDPayment received and confirmed. Webhook delivered.
EXPIREDLink TTL elapsed without payment
CANCELLEDManually cancelled via API

Key differences from invoicesโ€‹

Payment links are rail-agnostic and reusable until confirmed or expired:

  • One link, multiple rails โ€” the customer picks M-Pesa, TRON, or BSC at checkout
  • PROCESSING is M-Pesa-specific: the STK push was sent but the customer hasn't entered their PIN yet
  • There is no DETECTED / CONFIRMING split โ€” crypto payments move directly to CONFIRMED once the required depth is reached
  • Once CONFIRMED, the link cannot receive further payments

Confirmation depthโ€‹

RailRequired confirmations
USDT_TRON20 blocks (~60 seconds)
USDT_BSC15 blocks (~45 seconds)
MPESAInstant (Safaricom callback received)

Terminal statesโ€‹

CONFIRMED, EXPIRED, and CANCELLED are terminal. A link in any of these states will not accept further payments and will not match incoming on-chain transactions.