Urgent.News

What's breaking now, across thousands of outlets.

Tech

ACH Return Codes Explained: R01 to R85 and How to Handle Each One

ACH Return Codes Explained: R01 to R85 and How to Handle Each One ACH Return Codes Explained: R01 to R85 and How to Handle Each One When an ACH transaction fails, your payout doesn't just disappear—it returns with a reason code. The National Automated Clearing House Association (NACHA) defines 85 standardized return codes (R01–R85) that tell you exactly why a debit or credit entry was rejected.…

When an ACH transaction fails, it returns with a reason code instead of disappearing. The National Automated Clearing House Association (NACHA) defines 85 standardized return codes (R01–R85) that specify why a debit or credit entry was rejected. Understanding these codes is crucial for creating reliable payment systems.

The three most frequent return codes are:

**R01 - Insufficient Funds:** The account exists, the routing is correct, but the account holder lacks funds to cover the debit. This error typically occurs within 1–5 business days after the ACH entry reaches the bank. The recommended action is to retry after 3–5 business days or notify the user to add funds. Many users will fund their account and retry, with a recovery rate of 40–60% on retries.

**R03 - No Account / Unable to Locate Account:** The routing number exists, but the supplied account number cannot be found at that bank. This error also appears on the same day or the next business day. Unlike R01, R03 should not be retried as it is permanent. Ask the user to verify their account details. If a corrected number is provided, treat it as a new transaction. The recovery rate for this code is relatively low at 5%, as users only correct the account number in about 5% of cases.

**R10 - Customer Advises Not Authorized:** The account holder claims they did not authorize the debit. This code can show up anytime between 1–60 days after the entry posts, sometimes much later. Immediate investigation is required. Check your payment authorization logs. If the user did authorize the transaction, respond to the bank within the dispute window, typically 10 business days.

If the user did not authorize it, refund the amount and flag the transaction for fraud review. The recovery rate varies greatly depending on your authorization proof; if you have signed consent, the recovery rate can be as high as 70%.

Other important return codes include:

**R02 - Account Closed:** The account was closed before the ACH entry arrived. If the account is permanently closed, you should not retry. Instead, route the transaction to an alternate payment method or request updated banking details from the user.

**R04 - Invalid Routing Number:** The routing number entered is either incorrect or does not exist. This error should not be retried. Validate routing numbers against the FedACH directory before submitting the transaction to prevent this error.

**R05 - Unauthorized Use of Routing Number:** The originating company (ODFI) is not authorized to use this routing number. This is typically a configuration error on your end. You should contact your ACH processor immediately to resolve this issue.

**R07 - Authorization Revoked:** The account holder has revoked authorization for recurring entries. For recurring payments, do not retry the specific authorization. Instead, request the user to re-authorize the transaction or switch to an alternate payment method.

**R29 - Corporate Account Closed:** This code is similar to R02 but applies to business accounts. Like R02, you should not retry and instead request updated business banking details from the user.

Less common but still important codes include:

**R06 - Returned per ODFI request:** This code means the ACH entry was returned as requested by the originating depository financial institution (ODFI). Investigate this with your processor to determine the reason for the return.

**R08 - Payment stopped:** The account holder stopped the payment. This is typically a permanent block by the account holder, and you should not retry. The transaction is permanently failed.

**R11 - Duplicate entry:** This code indicates that the entry is a duplicate of a previous transaction. Check your batch logic to ensure that you are not resubmitting transactions unnecessarily.

**R14 - Representative payee deceased:** This code is used when the representative payee listed on the account has passed away. This is often a permanent block, and you should escalate the issue to the appropriate authorities.

**R16 - Account frozen:** The account is frozen by the financial institution, often due to suspicious activity or compliance issues. Contact the bank to determine the exact reason for the freeze, as it may be temporary or permanent.

**R20 - Non-transaction account:** This code indicates that the account type does not support ACH transactions. For example, some accounts like escrow or escrow-like accounts may not support ACH debit or credit entries. You may need to request updated account details from the user.

Understanding these codes and their implications is essential for managing ACH transactions effectively. Each code provides specific guidance on how to handle the transaction, whether it requires retry, refund, or a change in banking details. By accurately interpreting and responding to these return codes, you can build robust payment systems that minimize errors and improve user experience.

Written by urgent.news from Dev.to's reporting — not their text. Machine-written — may contain errors; check the original before relying on it.

Read the original at dev.to →

More in Tech

UECA-React 3.2: a failing test opens the trace where it failed

Part 4. Earlier: converting a vibe-coded MVP , the origin story , an AI agent testing the framework . UECA-React 3.2 is out, with 3.2.1 right behind it. Three things in it are worth a post.

  • Failing test now displays trace of specific failure
  • Migration guide outlines three-phase app rewriting process
  • 3.2.1 release addresses bundle size issue with unused components

7 Real Problems I Faced While Building a Real-Time Chat Application

Building a real-time chat application sounds pretty straightforward at first. You create a login system, add a message input, connect a database, and display messages on the screen.

  • Managing real-time messages without duplicates or unexpected updates proved challenging
  • Prevented duplicate conversations between two users using deterministic conversation IDs
  • Made unread messages and read receipts work correctly by tracking message relationships

More from Saturday 10 October →