payment_transition_conflict
Commerce rejected the request because another operation updated or claimed the payment first. Continuing with an older view of the payment could start a duplicate attempt or overwrite a newer result.
Why this happens
Payment operations can overlap with another Pay, Confirm payment, Complete, or status-update operation. Commerce allows only a valid transition from the latest stored payment state. You receive this HTTP 409 response when another operation wins that transition before your request can safely apply its change.
Common causes include:
- two payment requests being submitted for the same customer action;
- a payment attempt already being processed;
- customer confirmation completing while another request is using an older payment state;
- a payment status update arriving while Pay, Confirm payment, or Complete is still running.
This error is not a payment decline and does not, by itself, mean the payment failed. It means Commerce refused to guess whether another payment operation is still running or has already produced a newer result.
What to do
Fetch the order or payment and use its latest state:
- If the payment is
paid, treat the payment as complete and do not submit it again. - If it is
requires_action, follow the returnednext_actioninstead of starting another payment attempt. - If it is still processing, wait for the status to change or for your webhook to arrive.
- If it is
failed, offer a deliberate new attempt only after the customer chooses to try again. - If it is
canceledorexpired, do not resubmit the same payment operation.
Do not immediately repeat the request without reading the resource. When replaying the same logical request after an uncertain response, keep its original Idempotency-Key. Use a new key only for a deliberate new payment attempt after the latest payment state permits one. See Idempotency.
Example error response
{
"error": {
"cause": "resource_state_conflict",
"code": "payment_transition_conflict",
"detail": "we rejected this request because another operation updated or claimed the payment first. continuing could create a duplicate payment attempt or overwrite a newer result. fetch the latest order or payment and follow its current status or next_action before deciding whether to try again.",
"fix_code": "refresh_resource_state",
"message": "request rejected because another operation reached this payment first",
"type": "state_conflict",
"url": "https://studio.inttegro.com/e/payment_transition_conflict"
}
}