Payment link states
PENDING โ PROCESSING โ CONFIRMED
โ
โโโ EXPIRED (terminal โ not paid before TTL)
โโโ CANCELLED (terminal โ cancelled via API)
| State | Meaning |
|---|---|
PENDING | Created, awaiting payment on any enabled rail |
PROCESSING | M-Pesa STK push sent, waiting for PIN confirmation |
CONFIRMED | Payment received and confirmed. Webhook delivered. |
EXPIRED | Link TTL elapsed without payment |
CANCELLED | Manually 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
PROCESSINGis M-Pesa-specific: the STK push was sent but the customer hasn't entered their PIN yet- There is no
DETECTED/CONFIRMINGsplit โ crypto payments move directly toCONFIRMEDonce the required depth is reached - Once
CONFIRMED, the link cannot receive further payments
Confirmation depthโ
| Rail | Required confirmations |
|---|---|
USDT_TRON | 20 blocks (~60 seconds) |
USDT_BSC | 15 blocks (~45 seconds) |
MPESA | Instant (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.