Skip to main content

Payment Statuses

A payment in Odus carries two separate status fields: status and displayStatus. Understanding the difference between them — and how they relate to the boolean lifecycle flags — helps you build integrations that correctly handle every payment outcome.

The status field

status represents the core lifecycle of a payment. It has four possible values:

ValueDescription
openThe payment has been created and is waiting to be processed. This is the initial state for every payment.
requires_actionThe customer must complete an action before processing can continue, typically a 3DS redirect.
succeededThe payment has been completed successfully. Funds have been authorized (and captured, if capture method is automatic).
cancelledThe payment has been permanently stopped. No further processing will occur.

Terminal vs. non-terminal

open and requires_action are non-terminal — the payment can move forward from these states. cancelled is terminal — once cancelled, a payment cannot change. succeeded is the normal end state; in the narrow case where an uncaptured authorization is voided, it may also transition to cancelled.

State transitions

What causes each transition:

  • openrequires_action — The PSP requires the customer to complete an authentication step, such as 3DS. The payment object receives an action.redirectUrl pointing to the authentication page.
  • requires_actionopen — The action was not completed within 24 hours. The payment is reset to open so that a new attempt can be made.
  • open / requires_actionsucceeded — The PSP confirms the payment is authorized (and captured, for automatic capture).
  • open / requires_action / succeededcancelled — The payment is cancelled programmatically or by the merchant via the Dashboard. This is also the outcome when all retry attempts are exhausted.

The displayStatus field

displayStatus is a derived, user-friendly value computed from status and the boolean lifecycle flags below. It is useful for displaying a meaningful label to your team or customers, but you should not use it in webhook or API logic. Use status and the individual flags for that.

ValueMeaning
unattemptedPayment is open and no transaction has been attempted yet.
incompletePayment is in requires_action — waiting for customer to complete a redirect.
failedPayment is open but a previous attempt failed. Can still be retried.
retryingPayment is actively cycling through retry attempts after a failure.
succeededPayment succeeded and has been fully captured.
uncapturedPayment succeeded but capture has not yet occurred (manual capture mode).
partially_reversedPayment succeeded and has been partially refunded.
reversedPayment succeeded and has been fully refunded or voided.
chargebackA chargeback has been recorded against this payment.
cancelledPayment is cancelled.

Boolean lifecycle flags

The status field alone does not tell you whether a payment has been captured, refunded, or chargebacked. These outcomes are tracked by separate boolean fields returned alongside status.

FieldTypeMeaning
isCapturedbooleanFunds have been captured from the customer.
isReversedbooleanThe payment has been at least partially refunded or voided.
isFullyReversedbooleanThe entire authorized or captured amount has been reversed.
isChargebackedbooleanA chargeback has been recorded for this payment.
isRetryingbooleanThe payment is currently in a retry cycle after a failed attempt.
isRecoveredbooleanThe payment eventually succeeded after one or more failed retry attempts.
Example

A payment can have status: "succeeded", isCaptured: false, and isFullyReversed: false at the same time. This means the authorization was approved but the funds have not yet been captured — the displayStatus would be uncaptured.

warning

Do not use displayStatus as the primary signal in your integration logic. It can expand with new values in future releases. Always branch on status and the individual boolean flags.

Amounts

The captured and refunded amounts are also surfaced directly on the payment object:

FieldMeaning
amountCapturedAmount that has been captured, in minor currency units (e.g. cents).
amountReversedAmount that has been reversed (refunded or voided), in minor currency units.