ACH return codes: the complete list, in plain language
ACH return codes tell you why an entry came back. This is the complete list of the standard codes, what each one means in plain language, and what to do next, because different returns need different responses and blindly retrying can create more problems.
What are ACH return codes?
When a bank cannot post an ACH entry, or its customer rejects it, the bank sends the entry back through the network with a standardized reason attached. That reason is the return code: an R followed by two digits, with a fixed meaning that every bank on the network shares. Nacha, the body that governs the ACH network, maintains the list.
The code matters because it tells you two things at once: what went wrong, and what you are allowed to do about it. Some returns invite a corrected retry. Some forbid any retry until the recipient acts. A few are signals to stop entirely and escalate.
If you already have a code in hand and just need the answer, the ACH return code lookup tool gives the meaning and next step in one search. The table below is the same material in full.
Complete ACH return code list
| Code | Name | What it means | Next step |
|---|---|---|---|
| R01 | Insufficient funds | The available balance could not cover the debit entry. | Retry later, within your bank’s rules |
| R02 | Account closed | A previously open account has been closed. | Get new account details |
| R03 | No account / unable to locate account | The account number passes format checks but does not match an open account. | Verify details with the recipient |
| R04 | Invalid account number structure | The account number fails the receiving bank’s format checks. | Correct the account number |
| R05 | Unauthorized debit, corporate code on consumer account | A business-coded debit hit a consumer account without authorization. | Stop and obtain proper authorization |
| R06 | Returned per ODFI’s request | The originating bank asked the receiving bank to send the entry back. | Coordinate with your bank |
| R07 | Authorization revoked by customer | The consumer revoked the authorization behind the debit. | Stop debits until reauthorized |
| R08 | Payment stopped | The receiver placed a stop payment on the entry. | Contact the recipient before retrying |
| R09 | Uncollected funds | The balance exists on paper but the funds have not cleared yet. | Retry after funds clear |
| R10 | Customer advises not authorized | The consumer says they did not authorize the debit or do not know the originator. | Stop and treat as a dispute |
| R11 | Entry not in accordance with authorization | An authorization exists, but the entry differs from its terms, such as amount or date. | Fix the error, then reinitiate if allowed |
| R12 | Account sold to another DFI | The account was transferred to a different bank. | Get the new bank details |
| R13 | Invalid ACH routing number | The entry carries a routing number that is not valid. | Correct the routing number |
| R14 | Representative payee deceased or unable to continue | The person receiving payments on the beneficiary’s behalf has died or can no longer act. | Confirm who should be paid now |
| R15 | Beneficiary or account holder deceased | The beneficiary or the account holder is deceased. | Stop payments and escalate |
| R16 | Account frozen / OFAC instruction | Funds are unavailable due to legal action, or OFAC has instructed the return. | Do not retry; escalate to compliance |
| R17 | File record edit criteria / questionable entry | A field fails the receiving bank’s checks, or the bank is flagging the entry as questionable. | Verify details; treat as a fraud signal |
| R20 | Non-transaction account | The account does not accept ACH entries, or transaction limits apply. | Get a transaction account instead |
| R21 | Invalid company identification | The company identification in the entry is not valid. | Correct the company ID |
| R22 | Invalid individual ID number | The individual ID does not match the receiver’s records. | Correct the ID number |
| R23 | Credit entry refused by receiver | The account holder declined the incoming payment, for example a wrong amount or an account in dispute. | Contact the recipient, then resend |
| R24 | Duplicate entry | The receiving bank got what looks like a duplicate of an earlier entry. | Confirm what has already been paid |
| R29 | Corporate customer advises not authorized | A business receiver says the debit was not authorized. | Stop and obtain authorization |
| R31 | Permissible return entry | A corporate entry is being returned late, with the originating bank’s agreement. | Coordinate with your bank |
| R33 | Return of XCK entry | A destroyed-check entry is being returned. | Collect by other means |
Codes in the R80s exist too, but they apply to international (IAT) entries. A domestic payout program rarely sees them. If one shows up, it usually traces to a gateway handling a cross-border leg, and your bank or processor is the right first call.
Most common ACH return codes
R01: insufficient funds. The available balance was not sufficient for the entry. The account itself may be perfectly valid; the issue is funds availability. For a payout program sending credits, the relevant return profile differs from a debit collection program, so interpret the code in the context of the entry type and your bank or processor rules.
R02: account closed. The account has been closed. Sending the same instruction to the same account again will not solve it. The only fix is a new destination from the recipient.
R03: no account or unable to locate account.The receiving institution could not locate the account using the information provided. The number looked plausible but matched nothing. The next step is to verify the recipient’s account details, not to retry as-is.
R04: invalid account number structure. The account number itself is malformed, often a typo or a digit dropped during entry. The destination should be corrected before another attempt.
R23: credit entry refused by receiver. This is the return unique to sending money out. The credit reached the account, but the account holder refused it: the amount was wrong, the payment was unexpected, or the account is in dispute. A refused credit is a conversation, not a technical fix. Contact the recipient, resolve the reason, and only then resend.
R24: duplicate entry. The receiving bank believes it already got this entry. This is one reason payout systems need duplicate protection with idempotency keysbefore they submit payments. The right question is not “Can we retry?” It is “Do we know whether this obligation has already been paid?”
ACH returns vs reversals
A return moves from the receiving bank back to you: the other side could not or would not accept the entry, and the code explains why. A reversal moves the other direction. It is a new entry you originate to pull back a payment you sent in error, such as a duplicate, a wrong amount, or a wrong account.
Reversals are narrow. Nacha permits them only for specific error cases, within a short window measured in banking days, and the money is not guaranteed to come back: if the account is empty or closed, the reversal itself can return. Treat reversals as a correction of your own mistake, and returns as information about the destination.
ACH return codes vs Notification of Change codes
Not every correction arrives as a return. When the receiving bank can post the entry but spots stale details, it lets the payment settle and sends a Notification of Change instead: a message saying “this went through, but fix these details before you send the next one.” NOCs carry C-codes rather than R-codes.
The distinction matters for operations. A return means the money came back and the obligation is still open. A NOC means the money arrived and your job is data hygiene: update the stored account details so future entries carry the corrected information.
Notification of Change C-codes
| Code | What to correct |
|---|---|
| C01 | Incorrect account number |
| C02 | Incorrect routing number |
| C03 | Incorrect routing number and account number |
| C05 | Incorrect transaction code |
| C06 | Incorrect account number and transaction code |
| C07 | Incorrect routing number, account number, and transaction code |
| C09 | Incorrect individual ID number |
C02 is the one payout teams see most, usually after a bank merger: the payment settled, but the routing number you have on file is out of date, and the NOC carries the corrected routing number to use from now on. Apply the correction promptly; continuing to send entries with the old details after a NOC is a rules problem, not just an operational one.
What to do after an ACH return
The code is only useful if it becomes an action someone can take. Instead of showing this:
R03
show this:
Payout returned Reason Account could not be located Action Ask the recipient to update bank information Retry Only after the destination is corrected
That mapping is mechanical: every code in the table above pairs with a next step, so a payout API should hand your team the action, not just the raw code. A returned payout is one kind of failed payout, and the broader playbook for handling failed payouts, retries, fallback rails, and recipient communication, applies from the moment the return lands.
Two habits prevent most of the damage. First, never retry automatically on codes that require new information (R02, R03, R04) or that forbid retries outright (R16, and unauthorized claims like R10 and R29). Second, when the fix is a new destination, collect it through a secure flow rather than email, because a return is exactly the moment fraudsters like to impersonate recipients.
How returns affect payout reconciliation
A return does not erase the payment attempt. It adds a second event that has to land in your books against the same obligation:
Obligation $750 owed Attempt 1 ACH Returned R03 Attempt 2 RTP Completed Result Obligation satisfied
Finance can now explain why two attempts exist without treating them as two separate amounts owed. That structure, one obligation with many attempts, is the core of payout reconciliation: returns become ledger entries that offset the original attempt, and the obligation stays open until an attempt actually completes.
See returns handled automatically. We’ll show a returned payment update the ledger and queue its next action.
Book a demo