ARUDD code 0 is a failed payment you can try again. ADDACS code 0 is a cancelled mandate you must stop debiting. Both are one character from the same scheme, so a handler that switches on the character alone will eventually collect against an instruction that no longer exists.
Bacs Direct Debit reports trouble through separate report types, each with its own code table and clock, and providers then squash those codes into their own API enums. Below are the full tables, the codes that are safe to re-present, the arithmetic that limits you to about two retries, and how GoCardless and Stripe expose all of it. On sourcing: the Bacs Service User's Guide and DDIC challenge guide are login-only, so some timings come from bureau and participant documentation, and I name those. Confirm them with your sponsor bank.
What Are Bacs ARUDD, ADDACS and AUDDIS Reports?
| Report | Fires when | Typical arrival |
|---|---|---|
| AUDDIS | A new instruction (0N) is rejected | About 3 working days after submission (GoCardless) |
| ARUDD | A collection goes unpaid | 1 to 2 working days after the collection date |
| ADDACS | The payer's bank cancels or changes a mandate | Early on the working day after the bank's input |
| DDIC | The payer claims under the Direct Debit Guarantee | Any time, with no published limit |
AWACS is the Direct Credit counterpart, so it concerns payroll and supplier payments. You get three working days to act on an AWACS or ADDACS advice, and receiving an AWACS is itself your authority to update the details.
Reports expire. Most stay on the Bacs Payment Services Website for 37 calendar days, ADDACS and AWACS for 60, so an ingestion job that fails quietly for six weeks loses data for good. Bacs's guide to maintaining payment details gives each advice record a sequential A0SN reference, which is the field to watch for gaps. If you normalise to ISO 20022 internally, Bacs's 2017 translation guide maps ARUDD to camt.054, AUDDIS returns to pain.012 and ADDACS to pain.010 and pain.011.
ARUDD Reason Codes: Which Unpaid Direct Debits Can You Retry?
| Code | Meaning | Handling |
|---|---|---|
0 | Refer to payer | Re-present |
1 | Instruction cancelled | Stop, new mandate needed |
2 | Payer deceased | Stop permanently |
3 | Account transferred | Get new details or a new mandate |
4 | Advance notice disputed | Stop until resolved |
5 | No account (or wrong account type) | Fix details or new mandate |
6 | No instruction | Check your records, new mandate |
7 | Amount differs | Stop until resolved |
8 | Amount not yet due | Stop until resolved |
9 | Presentation overdue | Fresh advance notice |
A | Service user differs | Fix your submission |
B | Account closed | Stop, new mandate needed |
Only 0 is worth retrying automatically. Access Paysuite's auto-represent and GoCardless Success+ act on that code alone. Codes 4 and 7 need a person, because the payer is telling their bank your notice or amount was wrong, and another automated debit turns a billing query into an indemnity claim. A is your own bug.
Advance notice is where 4 usually starts. Bacs's default is at least 10 working days plus postal time unless you have agreed something else with the payer, and providers shorten it: GoCardless works to 3 days, Stripe to 2 working days, and Adyen recommends 8. Whatever you agreed has to match what your emails actually do, because a changed amount sent late produces the same code as no notice at all.
A failure can also turn up late. GoCardless says around 1% of failure notices arrive a day after the rest, and ClearBank's participant docs put the paying bank's deadline at entry day or the next working day before 15:30 UTC. ClearBank also shows returned items swapping transaction codes 01, 17, 18 and 19 for U1, U7, U8 and U9, which matters if you parse the files yourself. Treat a payment as provisional for at least two working days after collection, and check how each provider counts them: GoCardless numbers the cycle Day 0, 1 and 2 where Bacs uses Day 1, 2 and 3. For the wider cycle, see my Faster Payments vs Bacs vs CHAPS guide.
ADDACS Codes List: Mandate Cancellations and Amendments
| Code | Meaning | Handling |
|---|---|---|
0 | Instruction cancelled, refer to payer | Stop collecting |
1 | Instruction cancelled by payer | Stop collecting |
2 | Payer deceased | Stop permanently |
3 | Account transferred | Lodge a new 0N |
B | Account closed | Stop, new mandate needed |
C | Transferred to a different branch | Update records |
D | Advance notice disputed | Stop, contact payer |
E | Instruction amended | Update records |
R | Instruction reinstated | Reactivate the mandate |
For C and E, Access Paysuite says to update your records without sending a 0C/0N pair. Current Account Switch Service moves generate these advices, so an amendment can simply mean a customer changed banks.
R is the row that breaks data models. A bank can reinstate a mandate within two months of cancelling it, and GoCardless raises a reinstated event with the cause mandate_reinstated. If cancelled is a terminal state in your schema, that event has nowhere to go.
AUDDIS Rejection Codes: Why a New Direct Debit Mandate Fails
| Code | Meaning | Code | Meaning |
|---|---|---|---|
1 | Instruction cancelled | H | Instruction has expired |
2 | Payer deceased | I | Payer reference not unique |
3 | Account transferred | K | Cancelled by paying bank |
5 | No account | L | Incorrect payer account details |
6 | No instruction | M | Transaction code / user status incompatible |
7 | DDI amount not zero | N | Transaction disallowed at payer's branch |
B | Account closed | O | Invalid reference |
C | Transferred to a different branch | P | Payer's name not present |
F | Invalid account type | Q | Service user's name blank |
G | Bank will not accept Direct Debits |
Nuapay notes that 7 and L to Q come only from Bacs validation, so no bank made those decisions. Alert on them as defects in your file generation. F, G and N mean the account cannot take Direct Debits at all, and the fix is asking the customer for a different account.
The AUDDIS service guide sets a minimum of two working days between lodging a 0N and the first 01 collection, and recommends five. GoCardless says AUDDIS responses take about three working days, so if you use the two-day minimum you collect before you have heard back. Use five. Bacs will also stop issuing new non-AUDDIS Service User Numbers from 1 July 2027, though existing ones keep working.
How Long Do You Have to Re-present a Failed Direct Debit in the UK?
Nuapay's documentation states the constraints plainly: re-presentation must happen within one month of the first presentation, for the same amount, with at least five working days' notice to the payer. CIPP describes the notice as recommended. The transaction code is 18, and a re-presentation outside the month comes back as ARUDD 9.
Here is what that leaves you, counted in working days if you move as fast as the rules allow:
| Step | Working day |
|---|---|
| Original processing day | 0 |
| Entry day | 1 |
ARUDD 0 received, notice sent | 3 |
| First re-presentation enters | 8 |
ARUDD 0 received, notice sent | 10 |
| Second re-presentation enters | 15 |
ARUDD 0 received, notice sent | 17 |
| Third re-presentation would enter | 22 |
A calendar month holds about 21 working days, so a third attempt lands on or past the boundary. That is my arithmetic, and I could not read a scheme-level cap on attempts, but the commercial limits agree with it: Access Paysuite allows two retries, and Stripe makes up to two within 30 days, for insufficient funds only. GoCardless's Success+ FAQ puts the earliest retry after a standard failure at day 4 and recommends a four-week window, and a late insufficient-funds failure remains retryable.
DDIC Reason Codes: How Direct Debit Indemnity Claims Work in 2026
| Code | Meaning |
|---|---|
1 | Amount and/or date differ from advance notice |
2 | No advance notice received by payer |
3 | DDI cancelled by paying bank |
4 | Payer cancelled DDI directly with service user |
5 | No instruction held (AUDDIS service users only) |
6 | Signature fraudulent or not per mandate (AUDDIS only) |
7 | Claim raised at service user's request |
8 | Service user name disputed |
The claim itself has no public time limit, but your response does. Modulr's documentation gives the sequence: advice on working day 1, challenge by the end of day 9, the paying bank responds by day 11, and settlement follows around day 13. An unchallenged claim is accepted automatically at day 9, and evidence is capped at five files of 5 MB each. Nuapay documents the automatic debit on day 14. So you have nine working days to act on something that takes fourteen to reach your bank statement, and a monthly reconciliation will find it too late. Keep the signed or electronic instruction retrievable as well: Bacs expects you to supply a copy of a DDI within 7 working days of a request, and codes 5 and 6 turn on exactly that document.
Code 7 is the one to build for. GoCardless calls a merchant-requested claim "the safest way to refund a payment taken by Direct Debit", because it closes off a later claim on the same payment. Stripe's docs warn of the alternative: since the indemnity period is indefinite, a customer can dispute after a refund and you lose both amounts.
I could not find a published indemnity-claim rate that triggers a review of a service user. Ask your sponsor what theirs is before you need to know.
GoCardless vs Stripe: How Bacs Failure Codes Reach Your API
GoCardless exposes the raw code. Bank-origin events carry details.reason_code and details.scheme alongside details.cause, and its docs tell you to branch on cause:
Payment failed cause | reason_code values |
|---|---|
refer_to_payer | ARUDD-0 |
mandate_cancelled | ARUDD-1 |
bank_account_closed | ARUDD-2, ARUDD-B |
bank_account_transferred | ARUDD-3 |
authorisation_disputed | ARUDD-4, ARUDD-7 |
invalid_bank_details | ARUDD-5, ARUDD-Y, ARUDD-E |
other | ARUDD-6, ARUDD-8 |
ARUDD-Y and ARUDD-E appear in no public Bacs code table I read, and ARUDD-9 and ARUDD-A are missing from this page. Expect values outside any list you copy. Retries through Success+ need retry_if_possible, and the failed event carries will_attempt_retry. Indemnity claims arrive as charged_back with DDICA- codes, and challenging one requires the Protect+ product.
Stripe hides the scheme. charge.failure_code returns insufficient_funds or generic_could_not_process (both retryable), or account_closed, bank_ownership_changed, debit_not_authorized or invalid_account_number (not retryable). Mandate state lives in network_status (pending, revoked, refused, accepted) with a revocation_reason. A failure after success becomes a dispute, a DDIC arrives as charge.dispute.created, and there is no evidence stage. I found no raw Bacs code documented anywhere in its API.
The trade-off: GoCardless suits a finance team that reconciles to Bacs reports or needs to challenge claims. Stripe is less work if you already run on it and can accept six failure codes and no appeal.
Bacs Reason Codes vs ACH Return Codes and SEPA R-Transactions
| Bacs Direct Debit | ACH debit | SEPA Core | |
|---|---|---|---|
| Code format | One character, scoped by report | Rnn | ISO codes |
| Insufficient funds | ARUDD 0 | R01 | AM04 |
| Account closed | ARUDD B | R02 | AC04 |
| No authority | ARUDD 6 | R10 | MD01 |
| Refund of authorised debit | Guarantee, no published limit | None equivalent | 8 weeks |
| Unauthorised claim | Guarantee, no published limit | 60 calendar days | 13 months |
MS03, which can stand in for other codes in some countries. Bacs is the only one of the three where the same symbol means different things depending on which file it arrived in, and the only one with an open-ended consumer claim.
What This Means for Developers Integrating Bacs Direct Debit in the UK
1. Key on report and code together. Default every unknown pair to a hold so an unlisted code queues for review.
2. Model mandates with a way back. cancelled has to accept reinstated.
3. Poll reports daily and alert on gaps. Use the A0SN sequence, and remember the 37-day expiry.
4. Run a DDIC clock. Page someone well before working day 9 if you intend to challenge.
5. Refund through the indemnity route where your provider supports it, and keep the original payment reference forever, since the claim window never closes.
type Action = "represent" | "hold" | "update_details"
| "new_mandate" | "close_mandate" | "fix_submission";
const policy: Record = {
"ARUDD:0": "represent",
"ARUDD:4": "hold",
"ARUDD:B": "new_mandate",
"ADDACS:0": "close_mandate",
"ADDACS:E": "update_details",
"AUDDIS:L": "fix_submission",
};
const actionFor = (report: string, code: string): Action =>
policy[${report}:${code}] ?? "hold";
My position, and this is opinion: automate one re-presentation, not two. The table above shows two only fit if you fire at the earliest legal moment, which is rarely when the customer has money. I would use the single attempt on a date near the customer's likely payday, then hand off to a human or a different payment method. Every extra debit against a struggling account risks a claim that you cannot contest cheaply and that stays open indefinitely.
If you are working through a Bacs integration, more of my writing on UK payment rails is at Tom Wang.