Skip to main content
Every payment has a status. It starts at scheduled when you create it and ends in one of three terminal states: completed, failed, or canceled.

Statuses

How the status changes

Paper checks

Paper checks behave differently from electronic payments, because Melio can’t know the payment is complete until the payee deposits the check and it clears. Checks stay in-progress until they clear. The steps inside in-progress are for illustration only and aren’t returned by the API.
  • A check stays in-progress until it clears. Depending on mailing time and when the payee deposits it, that can take days or weeks. A long-running in-progress check is normal, not an error.
  • A check becomes completed only after it’s deposited and cleared. Mailing or delivering the check does not complete the payment.
  • An issued check can be voided while it’s in-progress. See Editing and canceling.
  • Uncashed checks are canceled after 90 days. If the payee doesn’t deposit the check within 90 days, it’s canceled and the amount is automatically refunded to the originating account.
  • Tracking. Check tracking details are available on the payment object. Fetch GET /payments/{id} to see them.

Editing and canceling

Editing requires the payment to be scheduled. Once it is in-progress, PATCH /payments/{id} is rejected with 409 PAYMENT_NOT_EDITABLE. Canceling is also limited to scheduled, with one exception: a paper check that has been issued but has not yet cleared. Canceling that voids the check and refunds the originating account.
A 202 means the void was accepted, not that it completed. Voiding a check is asynchronous and is not guaranteed to succeed - if the check clears before the void takes effect, the void fails and the payment continues to completed as normal. Poll GET /payments/{id} until the payment reaches a terminal state rather than assuming the cancel took effect.
A voided check ends in failed, the same status as other failures such as insufficient funds. The payment doesn’t currently indicate that the failure came from a void, so keep track of the voids you request on your side.

Risk review

A payment being reviewed stays scheduled the whole time; there is no separate review status. If the review is approved it proceeds as normal. If it is not, the payment is not sent and moves to failed.
Payment events are notifications, not snapshots. api.payment.updated fires on every change but carries no payment body, so fetch GET /payments/{id} to read the current status.