Use case #0002

Bounce handling: the retry logic Repayment AI applies after a failed ACH

An ACH bounce is not a default. It is a missed collection that may have a dozen innocent explanations — the borrower's salary arrived a day late, their account was temporarily frozen for a KYC / CIP update, they had an unrelated bank system downtime. The institution's response in the first 48 hours after a bounce determines whether the monthly payment is collected within the month or becomes an overdue. The Repayment Agent AI reads the Nacha ACH return reason code from the bounce, classifies it, selects the optimal retry or resolution action, and executes — without any human intervention required for the majority of bounce types.

The Nacha ACH return reason taxonomy — and why it matters for retry logic

Nacha provides a return reason code for every failed ACH debit. The codes are not all the same — and treating them all identically with a single retry schedule wastes retries on accounts where a retry will certainly fail, and fails to use the right resolution path for each bounce type. A return code R01 (insufficient funds) is resolved by waiting for the borrower's next salary credit and retrying. A return code R29 (do not honour) is a broad decline that may indicate a fraud flag on the account — retrying immediately will fail again and may create additional bank charges for the borrower. A return code R02 (account closed) cannot be retried on this account at all — the mandate needs to be modified to the new account number. Each return reason requires a different response.

"A return code R02 (account closed) retried three times is not a diligent collection effort — it is three rejection notices and three penal charges on an account that cannot pay because it no longer exists. The Repayment AI reads the return code before deciding the response."

The return reason codes and the Repayment AI's response to each

Nacha CodeReasonFrequencyRepayment AI ResponseRetry?
01 Insufficient funds Most common · ~55% of all bounces WhatsApp + SMS notification to borrower · Retry on Day 3 (after typical salary date) · Second retry on Day 7 if first fails Yes · Day 3 + Day 7
02 Account frozen / dormant ~8% Borrower notified to activate account · Retry on Day 5 · If second failure: escalate to tele-collections for alternate payment method Yes · Day 5 only
05 Do not honour (generic decline) ~12% No immediate retry · Borrower contacted for explanation · Tele-collections team assigned Day 2 · Retry only after borrower confirms account issue resolved After confirmation only
10 Account closed ~6% No retry on this account · Borrower contacted to provide new account details · Mandate modification request submitted once new account verified · Bridge payment via ACH / Zelle requested immediately No retry · Mandate modification
11 Account number incorrect / invalid ~3% Mandate data review triggered · If routing number changed (bank merger or branch migration): auto-update routing number and retry · If account number wrong: contact borrower for correction · Mandate modification required After correction only
17 Debit not permitted by user (borrower instructed bank to block debit) ~5% Escalate immediately — borrower has actively blocked the mandate · Tele-collections priority contact Day 1 · Legal team notified if pattern repeats · No retry until mandate reinstated No retry · Legal alert
21 Technical failure (bank or ACH network issue) ~8% Automatic retry next working day · No borrower notification required (technical failure, not borrower issue) · If second attempt also fails with code 21: ODFI / sponsor bank support ticket raised Auto-retry next day
25 Mandate not registered / ACH trace number invalid ~3% Mandate status check triggered · If mandate pending: collection via bridge method, retry once mandate activates · If mandate cancelled: new mandate registration initiated After mandate check

The bounce resolution sequence: 7-day playbook for code R01 (insufficient funds)

Bounce Resolution Playbook — Return Code R01 (Insufficient Funds) · Account LA-2024-9010 · Shanthi Devi
monthly payment $9,200 · Due date Nov 5, 2025 · Bounce received Nov 5, 2025 · Return code R01
Day 0
Nov 5
Immediate · On ACH return

Bounce received and classified — WhatsApp and SMS notifications sent

Nacha return code R01 received at 14:32. monthly payment marked as unpaid in CBS. Penal charge $500 accrued per the loan agreement. Borrower notified immediately via WhatsApp: "Your monthly payment of $9,200 due on November 5 could not be debited from your account — it looks like the account balance may have been insufficient. We'll try again in a few days. If you'd like to pay now, tap here: [ACH / Zelle link]." SMS sent as backup.

→ Notification: WhatsApp + SMS · ACH / Zelle self-payment link provided · DPD clock starts Day 1
Day 1–2
Nov 6–7
Monitoring · Self-payment window

Self-payment window — borrower can pay via ACH / Zelle link · No collection call yet

For code R01, the first 48 hours are a self-resolution window. Many borrowers pay voluntarily via the ACH / Zelle link before any tele-collection is made — salary credits typically arrive in the first few days of the month for salaried borrowers. The Repayment Agent AI monitors for any incoming ACH / Zelle credit against this loan account. If payment received: monthly payment marked paid, penal waiver assessed per the institution's policy (first bounce = penal waived on same-month payment), DPD counter reset.

→ 28% of code R01 bounces self-resolve in this 48-hour window via ACH / Zelle
Day 3
Nov 8
First ACH retry · Submitted via Nacha

Retry 1 submitted — Day 3 after bounce, after typical salary credit window

Day 3 is the optimal first retry date for code R01 bounces: most salaried borrowers have received their November salary by this point, and the account balance is most likely to be sufficient. The Repayment Agent AI submits the ACH debit presentation for $9,200 (the monthly payment only — penal charge is not included in the ACH debit; it is accrued separately and collected in the next monthly payment or on prepayment). A "heads up" WhatsApp is sent the previous evening: "We'll try your monthly payment again tomorrow — please ensure your account has $9,200 available."

→ 54% of code R01 retries succeed on Day 3 · Pre-debit WhatsApp sent Day 2 evening
Day 4–5
Nov 9–10
Retry 1 result

If Retry 1 succeeds: monthly payment posted, DPD reset. If fails: tele-collections assigned, Retry 2 scheduled.

If Retry 1 succeeds: monthly payment posted to CBS, DPD counter reset, penal charge waived per first-bounce policy (if account is in good standing). Case closed. If Retry 1 fails with code R01 again: the borrower's account does not have funds on Day 3. Tele-collections is assigned the case with the bounce history. A tele-collections call is made to understand when funds will be available. Retry 2 is scheduled for Day 7 (or for the date the borrower commits to having funds available, whichever is earlier).

→ Retry 1 fail: tele-collections assigned · Borrower call Day 4 · Retry 2 scheduled per borrower commitment
Day 7
Nov 12
Second ACH retry (or borrower-committed date)

Retry 2 — final ACH retry · If fails, alternate payment method required

Retry 2 is the final automated ACH retry for a code R01 bounce. If Retry 2 also fails, the ACH track for this month's monthly payment is exhausted. The Repayment Agent AI triggers the Early Bucket Caller AI: the account enters the DPD 7 bucket with two failed ACH attempts and one unsuccessful tele-collections call. The Early Bucket Caller initiates the standard early-bucket contact sequence, with the outstanding monthly payment + penal charge flagged as the priority collection target.

→ Retry 2 fail: case passed to Early Bucket Caller AI · DPD 7 · Two ACH failures logged · Penal: $500 accrued
Day 8+
Escalation
Escalation to collections track

Early Bucket Caller takes over — ACH suspended until borrower confirms account availability

From Day 8, the repayment track shifts from automated ACH collection to the collections AI agents. A third ACH debit attempt is not made until the borrower explicitly confirms (via a call or WhatsApp response) that their account has sufficient funds. An unsolicited third retry that fails would add unnecessary bounce charges, worsen the borrower relationship, and provide no collection benefit. The Repayment Agent AI suspends further ACH presentations until the Early Bucket team secures a specific payment commitment.

→ No further ACH until borrower commitment confirmed · Early Bucket Caller owns the case from Day 8
8Nacha return codes handled — each with a specific response protocol · Not a single generic retry schedule
28%Code R01 bounces self-resolve in the 48-hour ACH / Zelle window — before any collection call is made
54%Code R01 Day 3 retry success rate — timing the retry to after typical salary credit maximises first-retry recovery
ZeroCode 10 (account closed) retries — reading the return code prevents futile retries that generate charges without collecting

A bounce is a signal — and different signals require different responses

An institution that retries every bounce on the same schedule — Day 3 and Day 7, regardless of the reason code — is treating code R01 (insufficient funds, likely temporary) the same as code R08 (payment stopped the mandate, likely intentional) and code 10 (account closed, definitely unresolvable by retry). The code R01 retry may succeed. The code 17 retry will fail and alert the borrower that the institution is not reading their signal. The code 10 retry will fail three times and generate three sets of bank charges on a closed account. The Repayment Agent AI reads the return code, selects the response protocol matched to that specific signal, and routes cases that cannot be resolved by ACH to the collections teams that can resolve them — rather than exhausting ACH attempts on accounts where a different approach is needed.

← Back to Repayment & ACH Agent AI