Route and trace a payment
Creating a payment records it. Confirming decides it. This is the sequence, and the record it leaves.
Click any step to read what happens there and what can refuse it.
The intent's states
Click a state to read what it means and what moves it on.
Reading the trace, line by line
The payment page shows the stored route decision. Read it top to bottom:
- The verdict sentence glosses the selection reason: One connection survived every hard filter (
ROUTE_ONLY_CANDIDATE), Several were eligible and this one scored highest (ROUTE_SCORE_WINNER), A healthy connection was preferred over an impaired one before any score was compared (ROUTE_HEALTH_WINNER), or No connection survived (NO_ELIGIBLE_ROUTE). - Decided under names the policy version (or engine defaults), engine
route-v1, and the Gate decision id. - What it saw: amount, method, capture mode, merchant account, connections the Gate routed away from, connections already tried.
- Every connection considered: the matrix. Find the row without a ✓ in every column; the ✗ names the filter and reason code.
- How the winner was picked: the four score terms per eligible candidate, and each candidate's health rank. Rank 0 always beats rank 1.
The same record is at GET /v1/route-decisions/{id} and is what the node quickstart prints.
When the provider disagrees with itself
Observations are facts, not instructions. If a webhook says FAILED after Pehmen recorded CAPTURED, nothing regresses: an audit row and a payment.intent.conflict.v1 event are written and both readings are kept. If a success arrives for an attempt already marked declined, the attempt moves to MANUAL_REVIEW for a person. In this release there is no self-service control to settle a payment attempt in MANUAL_REVIEW; raise it with the platform team.