Understanding Payment Statuses

Payment Statuses

StatusDescriptionFinal?
INITIATIONPayment created, waiting for payer actionNo
CHECKOUT_PENDINGPayer is preparing the paymentNo
CHECKOUT_SUCCESSPayer has successfully paidNo
PAYMENT_RECEIVEDFunds received by the banking providerNo
PAYMENT_SUCCESSFunds received in the user's accountYes (success)
PAYMENT_FAILEDPayment failedYes (failure)
PARTIAL_REFUNDEDPart of the payment has been refundedNo (can refund more)
FULLY_REFUNDEDFull refund completedYes
REFUND_PENDINGRefund is being processedNo
REFUND_FAILEDRefund failedYes (failure)

Status Flow

INITIATION → CHECKOUT_PENDING → CHECKOUT_SUCCESS → PAYMENT_RECEIVED → PAYMENT_SUCCESS
                                                                     ↘ PAYMENT_FAILED

PAYMENT_SUCCESS → REFUND_PENDING → FULLY_REFUNDED
                                 → PARTIAL_REFUNDED

Happy Path

INITIATIONCHECKOUT_PENDINGCHECKOUT_SUCCESSPAYMENT_RECEIVEDPAYMENT_SUCCESS

Failed Payment

INITIATIONCHECKOUT_PENDINGCHECKOUT_SUCCESSPAYMENT_FAILED

Refund

PAYMENT_SUCCESSREFUND_PENDINGFULLY_REFUNDED (full) or PARTIAL_REFUNDED (partial)

In the API

When you query a payment via the API, the status field contains the current status:

{
  "id": "pay_abc123",
  "status": "PAYMENT_SUCCESS",
  "timeline": [
    { "status": "INITIATION", "timestamp": "2025-01-15T10:30:00.000Z" },
    { "status": "CHECKOUT_SUCCESS", "timestamp": "2025-01-15T10:31:00.000Z" },
    { "status": "PAYMENT_SUCCESS", "timestamp": "2025-01-15T10:31:05.000Z" }
  ]
}

The timeline array shows every status transition with timestamps. Duplicate transitions are collapsed — you will see at most one entry per status.

In Webhooks

When a payment status changes, a payment_status_updated webhook event is fired. The payload is the same shape as the getPayment API response. Use this to:

  • Update your database when a payment reaches PAYMENT_SUCCESS
  • Notify your customer of a PAYMENT_FAILED event
  • Trigger fulfillment when a payment reaches CHECKOUT_SUCCESS

Expected Timing Between Statuses

TransitionExpected Delay
CHECKOUT_SUCCESSPAYMENT_RECEIVED3–5 business days (depends on currency)
PAYMENT_RECEIVEDPAYMENT_SUCCESS~1 hour (can be faster or slower)

PAYMENT_FAILED is rare for one-time payments. It mainly results from failed recurring subscription invoice charges.

Status Behavior by Payment Method

BehaviorOpen BankingCard Payment
INITIATION → CHECKOUT_SUCCESSAfter bank transfer initiatedAfter card charge authorized
CHECKOUT_SUCCESS → PAYMENT_RECEIVED3–5 business days3–5 business days
PAYMENT_RECEIVED → PAYMENT_SUCCESS~1 hour~1 hour
Can FAIL after CHECKOUT_SUCCESSRarePossible (e.g., fraud check)
3DS requiredNoSometimes