Skip to main content

Payment Statuses Reference

Complete reference of all order, payment, and payment link statuses.

Complete reference of all statuses used in Paysera Checkout. There are three distinct status types that track different aspects of the payment flow.

Important Distinction

Do not confuse these status types - they track different entities:

  • Order Status - Tracks the overall order state
  • Payment Status - Tracks individual payment attempts
  • Payment Link Status - Tracks the payment link availability

Order Statuses​

Orders track the overall transaction state. An order can have multiple payment attempts.

StatusCodeDescriptionTerminal
Pending Paymentpending_paymentOrder created, awaiting payment completionNo
PaidpaidOrder total amount equals amount paid (fully paid)No
CanceledcanceledOrder was manually canceled*Yes
ClosedclosedNo further operations allowed on order*Yes

*Note: canceled and closed statuses are defined in the system but not yet fully implemented.

Order Status Transitions​

Key Transition: pending_payment → paid​

An order transitions from pending_payment to paid when:

  • Order Amount Paid equals Order Total Amount to Pay

This happens when one or more payments settle and their total reaches the order amount.

Payment Statuses​

Payments track individual payment attempts through the payment provider flow.

#StatusCodeDescriptionTerminal
1InitiatedinitiatedPayment request created after payer clicks "Pay"No
2Awaiting Authorizationawaiting_authorizationRequires Strong Customer Authentication (SCA/3DS)No
3AuthorizedauthorizedBank authorized the payment, funds not yet movedNo
4ProcessingprocessingMoving through internal processing stepsNo
5Pending Settlementpending_settlementIn clearing/batch processing stageNo
6On Holdon_holdPaused for compliance or fraud reviewNo
7SettledsettledFunds reached merchant accountNo*
8FailedfailedTechnical failure occurredYes
9RejectedrejectedBank explicitly refused the paymentYes
10CanceledcanceledPayment canceled before settlementYes
11ExpiredexpiredAuthorization or session expiredYes
12RefundedrefundedPayment partially or fully returned to payerYes
13ChargebackchargebackDispute/chargeback initiated by cardholderYes

*settled can transition to refunded or chargeback

Payment Status Flow​

Payment links control access to the payment flow. They have their own lifecycle independent of payment status.

StatusCodeDescriptionTerminal
ActiveactiveLink is valid and can initiate a payment sessionNo
CompletedcompletedPayment settled successfully via this linkYes
ExpiredexpiredLink lifetime (TTL) passedQuasi*
CanceledcanceledLink was invalidated by order update or manual cancelYes

*expired is quasi-terminal: it can still transition to completed if a payment that was started before expiration settles during the bank flow.

Important Notes​

  1. No failed status for payment links - Payment links do not have a failed status. If a payment attempt fails, the link remains active (unless expired or canceled), allowing the customer to retry.

  2. Expired links can complete - If a customer starts a payment flow before the link expires, and that payment settles after expiration, the link transitions from expired to completed.

Status Mapping Between Entities​

Order StatusTypical Payment StatusPayment Link Status
pending_paymentinitiated, processing, failedactive
paidsettledcompleted
-refunded, chargeback-

API Response Examples​

Order Response​

{
"id": "a6f2b8e3-5e5f-47d9-b13f-87ed2db2938a",
"projectId": "b7c3d4e5-6f7a-8b9c-0d1e-2f3a4b5c6d7e",
"amount": 2500,
"currency": "EUR",
"status": "pending_payment",
"reference": "ORDER-12345",
"createdAt": 1736433270,
"updatedAt": 1736433270,
"amountPaid": 0,
"balanceDue": 2500
}
{
"id": "c8d9e0f1-2a3b-4c5d-6e7f-8a9b0c1d2e3f",
"orderId": "a6f2b8e3-5e5f-47d9-b13f-87ed2db2938a",
"status": "active",
"amount": 2500,
"currency": "EUR",
"expiredAt": 1736436870,
"createdAt": 1736433270,
"updatedAt": 1736433270
}

Status Handling Examples​

PHP​

<?php

class OrderStatusHandler
{
public function handleOrderStatus(string $status, string $reference): void
{
match ($status) {
'pending_payment' => $this->awaitPayment($reference),
'paid' => $this->fulfillOrder($reference),
'canceled' => $this->handleCancellation($reference),
'closed' => $this->handleClosure($reference),
default => $this->logUnknownStatus($status, $reference),
};
}
}

class PaymentLinkStatusHandler
{
public function handleLinkStatus(string $status, string $linkId): void
{
match ($status) {
'active' => $this->trackActiveLink($linkId),
'completed' => $this->confirmPayment($linkId),
'expired' => $this->handleExpiredLink($linkId),
'canceled' => $this->handleCanceledLink($linkId),
default => $this->logUnknownStatus($status, $linkId),
};
}
}

JavaScript​

const orderStatusHandlers = {
pending_payment: (reference) => awaitPayment(reference),
paid: (reference) => fulfillOrder(reference),
canceled: (reference) => handleCancellation(reference),
closed: (reference) => handleClosure(reference),
};

const paymentLinkStatusHandlers = {
active: (linkId) => trackActiveLink(linkId),
completed: (linkId) => confirmPayment(linkId),
expired: (linkId) => handleExpiredLink(linkId),
canceled: (linkId) => handleCanceledLink(linkId),
};

function handleOrderStatus(status, reference) {
const handler = orderStatusHandlers[status];
if (handler) {
handler(reference);
} else {
console.warn(`Unknown order status: ${status}`);
}
}