Documentation sections
Documentation/API
Payment statuses
Lifecycle and final statuses
| Status | Final | Meaning |
|---|---|---|
| CREATED | no | The payment has been created; the customer has not started paying yet. The payUrl link does not expire until payment is started; an unneeded payment can be canceled via the API. |
| PENDING | no | The customer has started paying: an invoice has been issued, a QR code shown, or a bank page opened. From this moment the customer has 20 minutes to pay. |
| SUCCESS | yes | Paid. paidAt is set and the credit appears in the shop balance. |
| FAILED | yes | The payment did not go through: the bank declined it or it was canceled. No money was charged; create a new payment to retry. A late payment may change it to SUCCESS (see "Lifecycle"). |
| EXPIRED | yes | The time to pay has run out. Create a new payment to retry. A late payment may change it to SUCCESS (see "Lifecycle"). |
| REFUNDED | yes | The payment was refunded to the customer after SUCCESS. Refunds are handled via TabPay support. |
| CANCELED | yes | The payment was canceled by you via the API before payment started (from status CREATED). The payUrl link shows the customer an "Invoice canceled" screen; it can no longer be paid. |
Lifecycle
CREATED, then PENDING, then one of the final statuses: SUCCESS, FAILED, or EXPIRED. From SUCCESS a payment can move to REFUNDED, and from CREATED to CANCELED (cancellation via the API, available only while the customer has not started paying). The only exception to finality is a late payment: an SBP QR code can be paid even after our timeout, in which case EXPIRED or FAILED changes to SUCCESS and a webhook is sent. So do not close the order irreversibly on EXPIRED: a late SUCCESS webhook means the money has arrived and the order must be fulfilled. There are no other transitions out of final statuses.
On every transition to a final status - including REFUNDED after SUCCESS and CANCELED - your shop receives a webhook. Handle statuses unknown to your code safely: acknowledge with a 200 response and log them - the set of statuses may grow.