Checking access…

Skip to main content
Version: v2

Payment Lifecycle States

πŸ”’ InternalInternal information β€” not visible in the public (merchant) site.

Overview​

Every payment in the v2 system follows a state machine. Understanding which states are transient, which are terminal, and what triggers each transition is fundamental to working on payment code.


Complete State Machine​


State Reference​

Transient States (non-terminal)​

StateTriggerNext StatesNotes
INITIATEDPOST /v2/payments acceptedPENDING, PROCESSING, PENDING_FOR_CUSTOMER_CREATION, PENDING_FOR_PAYMENT_METHOD_CREATIONEntry state for all payments
PENDINGPayment queuedPROCESSING, CANCEL_INITIALIZEDWaiting for processing slot
PENDING_FOR_CUSTOMER_CREATIONCustomer lookup failed, creation neededPROCESSING, FAILEDParks transaction; resumes via CustomerConsumer on async customer event. Only applies to USER_INITIATED_PAYMENT flows. See Customer Creation During Payment
PENDING_FOR_PAYMENT_METHOD_CREATIONPayment method needs setupINITIATED, FAILEDRetries PM setup
PROCESSINGVendor request in flightCOMPLETED, FAILED, AUTHORIZED, ACCEPTED, AUTH_REQUIRED, PROCESSING_DEDUP_CHECKActive Stripe call
PROCESSING_DEDUP_CHECKPay-and-save dedupPROCESSINGChecks for duplicate PM before saving
AUTH_REQUIRED3DS challenge issuedCONFIRMATION_REQUIREDWaiting for customer 3DS completion
CONFIRMATION_REQUIREDUser completed 3DS challengeCONFIRMATION_INITIALIZEDWaiting for merchant (or widget) to call PATCH .../confirm
CONFIRMATION_INITIALIZEDConfirm call receivedAUTHORIZED, COMPLETED, FAILEDStripe processing the PaymentIntent confirmation
AUTHORIZEDPre-auth hold placedCAPTURE_INITIALIZED, CANCEL_INITIALIZEDFunds held, awaiting merchant action. Expires after 7 days.
ACCEPTEDACH accepted by processorCOMPLETED, FAILED, CANCEL_INITIALIZEDBank account settlement pending
CAPTURE_INITIALIZEDPATCH /capture receivedCOMPLETED, FAILEDStripe capture in progress
CANCEL_INITIALIZEDPATCH /cancel receivedCANCELLED, CANCEL_FAILEDStripe void/cancel in progress

Terminal States​

StateMeaningWebhook Event
COMPLETEDPayment fully processed and settledPAYMENT_SUCCEEDED
FAILEDPayment permanently failedPAYMENT_FAILED
CANCELEDPayment cancelled by merchant or systemPAYMENT_CANCELLED
CANCEL_FAILEDCancellation attempt failed; original state unchangedβ€” (requires manual intervention)

Allocation-Level States​

In split-tender payments, each allocation has its own state independent of the payment-level state.

The Merchant-Facing Status column shows what GET /v2/payments/{id} returns for that internal state (translated by MerchantStatusUtil).

Allocation StatusDescriptionMerchant-Facing StatusUnique to Split-Tender?
PENDINGQueuedPENDINGNo
PROCESSINGActive Stripe callPENDINGNo
AUTH_REQUIRED3DS needed β€” user must complete challengeAUTH_REQUIREDNo
CONFIRMATION_REQUIRED3DS challenge complete; waiting for confirm callCONFIRMATION_REQUIREDNo
CONFIRMATION_INITIALIZEDConfirm call received; Stripe processing PaymentIntent confirmationCONFIRMATION_INITIALIZEDNo
AUTHORIZEDFunds heldAUTHORIZEDNo
CAPTURE_INITIALIZEDCapturingCAPTURE_INITIALIZED (PRE-AUTH) / PENDING (SALE)No
ACCEPTEDACH acceptedACCEPTEDNo
CANCEL_INITIALIZEDCancellingCANCEL_INITIALIZED (PRE-AUTH) / PENDING (SALE)No
CANCELEDSuccessfully cancelledCANCELEDNo
CANCEL_FAILEDCancellation failedCANCELEDNo
ROLLED_BACKSystem reversed (sibling failed)CANCELEDYes
COMPLETEDSettledCOMPLETEDNo
FAILEDDeclined/errorFAILEDNo
PAYMENT_METHOD_FAILEDPayment method-specific failureFAILEDNo

State Transition Rules​

Cancellation Eligibility​

Only payments in these states can be cancelled:

StateCancel Allowed?Notes
AUTHORIZEDβœ…Pre-auth void
ACCEPTEDβœ…ACH reversal
PENDINGβœ…Before processing starts
COMPLETED❌Use refund instead
FAILED❌Already terminal
CANCELLED❌Already terminal
PROCESSING❌In-flight β€” wait for terminal state

Capture Eligibility​

StateCapture Allowed?Notes
AUTHORIZEDβœ…Full or partial capture
All others❌Only AUTHORIZED payments can be captured

Standard Flow Patterns​

FlowState Path
Card β€” SaleINITIATED β†’ PROCESSING β†’ COMPLETED
Card β€” Pre-Auth + CaptureINITIATED β†’ PROCESSING β†’ AUTHORIZED β†’ CAPTURE_INITIALIZED β†’ COMPLETED
Card β€” Pre-Auth + CancelINITIATED β†’ PROCESSING β†’ AUTHORIZED β†’ CANCEL_INITIALIZED β†’ CANCELLED
Card β€” 3DSINITIATED β†’ PROCESSING β†’ AUTH_REQUIRED β†’ CONFIRMATION_INITIALIZED β†’ COMPLETED
Bank Account (ACH)INITIATED β†’ PROCESSING β†’ ACCEPTED β†’ COMPLETED
Pay-and-SaveINITIATED β†’ PROCESSING β†’ PROCESSING_DEDUP_CHECK β†’ PROCESSING β†’ COMPLETED
Split-Tender (both succeed)INITIATED β†’ PROCESSING β†’ COMPLETED (both allocations)
Split-Tender (one fails)INITIATED β†’ PROCESSING β†’ allocation[0]=COMPLETED, allocation[1]=FAILED β†’ rollback β†’ allocation[0]=ROLLED_BACK β†’ payment=FAILED
User-Initiated β€” new customerINITIATED β†’ PENDING_FOR_CUSTOMER_CREATION β†’ PROCESSING β†’ COMPLETED
User-Initiated β€” customer creation failedINITIATED β†’ PENDING_FOR_CUSTOMER_CREATION β†’ FAILED
Merchant-Initiated β€” new customerINITIATED β†’ PROCESSING β†’ COMPLETED (customer created synchronously via find-or-create)
Guest PaymentINITIATED β†’ PROCESSING β†’ COMPLETED (no customer lookup)