ACH return codes explained (R01, R02, R03…)
Why a payment came back — and why 'insufficient funds' and 'account closed' should be different branches in your code.
When an ACH payment can't complete, it comes back with a return code — a short reason. Treating every return as one generic "failed" throws away the information you need to respond correctly.
Common codes
- R01 — Insufficient funds. The account existed but lacked the money. Often worth a retry later.
- R02 — Account closed. Don't retry; get new details.
- R03 — No account / unable to locate. The account number is wrong.
- R04 — Invalid account number. A structural problem with the number.
- R10 / R11 — Customer advises not authorized / originator not authorized. Stop; these count toward unauthorized-return limits.
Why the distinction matters
"Insufficient funds" might warrant a retry; "not authorized" must not be retried and affects your NACHA standing. Different codes, different actions.
On DigitalTreasury
Returns arrive as inbound events, are matched to their payment order, reverse the ledger hold, and land in a typed status carrying the code — so your webhook can branch on the reason instead of guessing.
What is ACH?
The batch network that moves most US bank-to-bank money — how credits, debits and returns actually work.
What is NACHA?
The body that writes the ACH rulebook — and the thresholds every originator has to live under.
Webhooks for payments: delivery you can trust
How to get told the instant money moves — and be sure the notification is real and never lost.