Skip to main content
A reason code explains why an outcome occurred. It is distinct from a status code, which tells you what happened. The two travel together in the same webhook payload:
Here 1114 is the status — the payment was returned. 02 is the reason — the receiving bank reported no account. Use the Status Codes reference for the first value and this page for the second.
Ingo reason codes are normalized. Where a return originates with the ACH network, a card network, or an issuer, Ingo maps that provider’s response into the single Ingo reason code set below before delivering it to you. Integrate against the Ingo code — the accompanying reason_description names the underlying network reason for operational triage, but the code is the stable contract.

Reading the value

In webhook payloads, reason_code is always a two-character string, zero-padded below 10. A no-account return arrives as "02" — never as 2 or "2".
Compare against the padded literal, and store the field as a string. Parsing to an integer discards the padding that makes the value canonical and will break any round-trip back onto the wire.
On the request side, POST /gateway/checkcancel and POST /gateway/checkstop accept reason_code as an integer (73, not "73"). Because every send-side code is already two digits, no padding question arises — but the type differs from the webhook representation, so do not share a single serializer across both directions.
Most events that carry reason_code also carry reason_description — up to 250 characters, emitted verbatim from the platform’s reason code table.Treat it as display and log text only. It is not normalized prose: some entries carry legacy spellings and internal formatting (for example Chargeback-RC30_ServicesNotProvided, or R20-non transaction account). Descriptions on this page have been cleaned for readability, so they will not always match the emitted string character-for-character.Branch your logic on reason_code. Never string-match reason_description.
The check and return events above are delivered on the IngoPay, Embedded Account Capture, and Notify webhook channels. See Webhooks for delivery, retry, and payload envelope details.Codes 7378 are the only reason codes you send. Every other code on this page is one you receive.
10 is not assigned. Codes 1115 are reserved for a legacy partner integration and are not emitted on any client-facing contract.Treat any unrecognized reason_code as an unclassified failure rather than rejecting the event — the set can grow, and new codes are added without a contract version change.

Reason code reference

Returned when an ACH credit or debit cannot be posted by the receiving depository financial institution. The NACHA column shows the network return code that maps to each Ingo reason code.
44 carries an obsolete reason_description. An R11 return is delivered as reason_code 44 with reason_description set to Check truncation entry return — R11’s pre-2015 NACHA meaning. R11’s current meaning is the one shown in the table above. Match on the code 44; do not rely on the description to tell you what the return was.
Reinitiation eligibility. Not every ACH return reason permits a reinitiation attempt. Status codes 1315 and 1317 on the Status Codes page are returned when a reinitiation is rejected because of the return reason on the original — or on a prior reinitiation — transaction.
Returned when a card disbursement is declined or reversed for a reason other than a formal chargeback.
Do not retry 08 (reported lost or stolen) automatically. Prompt the recipient to supply a different destination account.
00 and 07 are both Declined and are not distinguishable from the payload alone. Treat them identically.
Returned when a card disbursement is reversed through the network chargeback process. The RC column shows the network chargeback reason code that maps to each Ingo reason code.Chargebacks are terminal for the original transaction. Reconcile the reversal against your ledger; do not resubmit the same disbursement.
Submitted in the reason_code field of POST /gateway/checkcancel as an integer. The code must match the check’s current transaction status, or the request is rejected with status 722.These codes are echoed back as strings on the payment.status.check.canceled webhook event.
Submitted in the reason_code field of POST /gateway/checkstop as an integer. The check must be in an issued status.A successful stop response confirms only that the request was submitted. Confirmation that the check was actually stopped arrives on the payment.status.check.stopped webhook event, which echoes the reason code as a string.
Returned on the status.payment.check.returned webhook event when a presented check fails a positive pay exception check.

Status Codes

Response and event status codes across all Ingo Payments products.

Webhooks

Delivery, retry behavior, and payload envelope structure.

Retry Logic

Which outcomes warrant a retry, and how to retry safely.

Reporting

Reason codes as they appear in transaction and status files.