Skip to main content

Payment Statuses

A payment starts PENDING and ends in exactly one terminal status:

StatusTerminalMeaningMerchant action
PENDINGNoAwaiting payment — the customer has not completed an on-chain transfer yet.Do not fulfil yet.
SUCCESSYesPaid — the received amount matches the expected amount.Fulfil after verify.
ACCEPTABLEYesPaid with a small deviation that is within the tolerance you configured.Fulfil after verify.
MISMATCHYesPaid, but under- or over-paid outside your tolerance.Hold for manual review.
EXPIREDYesThe 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.