Payment Statuses
A payment starts PENDING and ends in exactly one terminal status:
| Status | Terminal | Meaning | Merchant action |
|---|---|---|---|
PENDING | No | Awaiting payment — the customer has not completed an on-chain transfer yet. | Do not fulfil yet. |
SUCCESS | Yes | Paid — the received amount matches the expected amount. | Fulfil after verify. |
ACCEPTABLE | Yes | Paid with a small deviation that is within the tolerance you configured. | Fulfil after verify. |
MISMATCH | Yes | Paid, but under- or over-paid outside your tolerance. | Hold for manual review. |
EXPIRED | Yes | The payment window elapsed with no payment. | Do not fulfil. |
Terminal statuses are final — a payment never leaves SUCCESS, ACCEPTABLE, MISMATCH, or EXPIRED.
How SUCCESS / ACCEPTABLE / MISMATCH is decided
Finomesh compares the USD value of what arrived on-chain (minus any fees the customer covers) against the USD value of what was expected:
- Exact match →
SUCCESS - Deviation within your configured tolerance (
overAcceptableDiff/underAcceptableDiff, as flat USD or a percentage) →ACCEPTABLE - Anything else →
MISMATCH
You configure the tolerance per payment at creation (or inherit your gateway's defaults). Setting checkAmountDeviation: false disables the check entirely — any paid amount resolves to SUCCESS.
Fulfil only on the verified status
SUCCESS and ACCEPTABLE are the only statuses you should fulfil on, and only after a server-side verify call — never from the callback or webhook alone.