Unresolved transactions no longer report as failed #
A purchase whose upstream result is not yet known reports reconciliation_required rather than failed. The previous model collapsed unknown outcomes into failure, which was wrong often enough to cost money.
Affected
GET /v1/transactions/{reference}webhook: transaction.updated
Action required
Treat reconciliation_required as an open outcome and keep the purchase pending. Refunding locally on this state will refund purchases that later settle.
The transaction state machine previously had no way to express an outcome it had not yet established. A provider response that was ambiguous, delayed or absent was recorded as failed, which is a terminal state, and a meaningful share of those purchases went on to settle successfully once requeried.
Unresolved outcomes now have their own state. It is not terminal and it is not a failure; a requery or an operator moves it to success or failed. Terminal states remain exactly what they were, so an integration that already waited for one is unaffected.
Migration guidance
Where a status check previously tested for failure by exclusion, test for the terminal states explicitly:
- if (state !== "success") markFailed()
+ if (state === "failed") markFailed()
+ if (state === "success") markSettled()
+ // pending, queued, processing, reconciliation_required: still open