What GoCardless says
| Event | Cause | SEPA Core code | GoCardless text |
|---|---|---|---|
| payments · failed | insufficient_funds | AM04 | The customer's account had insufficient funds to make this payment. |
The documentation for the failed event adds a key point: GoCardless retries the payment on its own when the event's will_attempt_retry field is true (“GoCardless will automatically retry the payment if event's will_attempt_retry field is true.”). That automatic retry is Success+, and to use it you must have it enabled in the GoCardless Dashboard.
According to the Success+ guide, it only retries payments that fail due to lack of funds. In SEPA these are two codes: AM04 and MS03, and MS03 only in Austria, Belgium, Germany, Luxembourg and Slovakia. Even so, GoCardless warns that its criteria may change: what applies to each failure is the will_attempt_retry field.

Why it arrives when the invoice already looked paid
A SEPA direct debit is not settled on the spot: according to GoCardless, collecting a payment can take up to 5 business days. The customer's bank usually reports the failure one business day after the charge date, before the payment moves to confirmed. In a few cases it reports later, with the payment already marked as confirmed: this is a late failure, and the Success+ guide gives insufficient funds as an example. That is why AM04 can appear when Odoo already had the collection confirmed and the invoice reconciled. The connector takes this into account: if a collection that Odoo considered settled fails, it cancels its payment and the invoice becomes due again.
The GoCardless connector for Odoo only collects via SEPA Core and in euros, and for a failed SEPA Core payment the GoCardless documentation gives a single code with insufficient_funds: AM04. In Odoo you will see the cause and not the code, because the connector stores the cause of the event and not the SEPA code. The connector also notes in its code that the combination insufficient_funds with AM04 is the one it saw in real SEPA payments in the GoCardless sandbox.
What you see in Odoo with the connector
Each collection the connector sends asks GoCardless for retry_if_possible, the Success+ option. When the failure arrives, two things can happen, and the transaction tells you which one in its GoCardless group: “GoCardless Cause” and the checkbox “Success+ Will Retry”. The transaction is opened from the invoice, with the “Payment Transaction” button at the top; the transactions menu only appears in developer mode, and does not exist in Odoo 20.
will_attempt_retry | Status | “Message” on the transaction | “Retry collection” button |
|---|---|---|---|
| true | “Pending” | “GoCardless could not collect this payment (insufficient_funds). Success+ will retry it automatically; there is nothing to do.” | Not shown |
| false | “Error”, and the invoice becomes due again | “GoCardless could not collect this payment (insufficient_funds).” and, if GoCardless gives the reason, “It will not be retried automatically (…).” | Shown, if retries remain and the mandate is active |
The connector writes these messages when it applies the event, with no one in front of it. The connector writes these texts in English, so in an English-language Odoo they appear exactly as quoted here, whether a user or a scheduled action triggers them: “GoCardless could not collect this payment (insufficient_funds). Success+ will retry it automatically; there is nothing to do.”, “GoCardless could not collect this payment (insufficient_funds).” and “It will not be retried automatically (…).”.
The transaction is left pending on purpose when Success+ is going to retry: the money may still arrive, and an error status would make it seem the collection is lost. Each time GoCardless resubmits the collection it sends a resubmission_requested event, and the connector increases “GoCardless Retries” by one, whether the retry came from Success+ or you requested it.
What to do
- Open the transaction from the invoice and check “GoCardless Cause” and “Success+ Will Retry”.
- If Success+ is going to retry it, do nothing: the retry button does not even appear. GoCardless asks you not to charge the customer through another channel in the meantime, because they could pay twice.
- If it is not going to retry, first talk to the customer to find out when they will have funds and press “Retry collection” once they confirm. The button does not choose a date: GoCardless sets the new charge date, and the transaction stays at “Retry requested. GoCardless will confirm the new charge date.”.
- Keep track: GoCardless allows at most 3 retries per payment (“Payments can be retried up to 3 times.”), and the connector also counts Success+ retries under “GoCardless Retries”.
Does an AM04 cancel the customer's mandate?
No. The insufficient_funds cause is not among those that make the connector archive the mandate, which are mandate_cancelled, bank_account_closed, mandate_expired and authorisation_disputed. The customer still has their payment method for the next invoice.
Why doesn't Success+ retry every failure?
Because its guide limits it to payments without funds: in SEPA, AM04 and, only in five countries, MS03. A customer who refuses the charge or a closed account are not fixed by presenting the debit again. The connector does not decide this: it follows the will_attempt_retry field of each failure.

With our connector
The GoCardless connector for Odoo 17, 18, 19 and 20 turns the event into something you can manage from the invoice: it leaves the transaction pending while Success+ works, moves it to error and reopens the invoice when no retry will happen, and counts the retries so it does not offer you one that is not due. What it cannot do is put money into your customer's account: if the AM04 repeats, the conversation with the customer is what resolves the collection.
Keep reading
Checked in the connector's source code (version 17.0, 18.0, 19.0 and 20.0) and the linked sources
Sources
- docs.gocardless.com/docs/api-reference/events/payment
- docs.gocardless.com/docs/api-reference/payment
- docs.gocardless.com/docs/optimise/reduced-failed-payments-with-success-plus
- Module source code: flexigo_payment_gocardless: const.py, line 15 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) and 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: const.py, line 76 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) and 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: const.py, line 71 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) and 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: models/payment_transaction.py, line 260 in 17.0 (d203ee6), line 260 in 18.0 (e2ab18b), line 260 in 19.0 (ce7f5a3) and line 271 in 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: models/payment_transaction.py, line 729 in 17.0 (d203ee6), line 729 in 18.0 (e2ab18b), line 728 in 19.0 (ce7f5a3) and line 752 in 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: models/payment_transaction.py, line 746 in 17.0 (d203ee6), line 746 in 18.0 (e2ab18b), line 745 in 19.0 (ce7f5a3) and line 769 in 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: models/payment_transaction.py, line 732 in 17.0 (d203ee6), line 732 in 18.0 (e2ab18b), line 731 in 19.0 (ce7f5a3) and line 755 in 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: models/payment_transaction.py, line 754 in 17.0 (d203ee6), line 754 in 18.0 (e2ab18b), line 753 in 19.0 (ce7f5a3) and line 777 in 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: models/payment_transaction.py, line 680 in 17.0 (d203ee6), line 680 in 18.0 (e2ab18b), line 679 in 19.0 (ce7f5a3) and line 703 in 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: models/payment_transaction.py, line 430 in 17.0 (d203ee6), line 430 in 18.0 (e2ab18b), line 429 in 19.0 (ce7f5a3) and line 444 in 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: const.py, line 122 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) and 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: const.py, line 119 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) and 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: models/payment_transaction.py, line 461 in 17.0 (d203ee6), line 461 in 18.0 (e2ab18b), line 460 in 19.0 (ce7f5a3) and line 479 in 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: models/payment_transaction.py, line 484 in 17.0 (d203ee6), line 484 in 18.0 (e2ab18b), line 483 in 19.0 (ce7f5a3) and line 502 in 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: views/payment_transaction_views.xml, line 13 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) and 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: models/payment_transaction.py, line 63 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) and 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: models/payment_transaction.py, line 418 in 17.0 (d203ee6), line 418 in 18.0 (e2ab18b), line 417 in 19.0 (ce7f5a3) and line 432 in 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: views/payment_transaction_views.xml, line 22 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) and 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: views/payment_transaction_views.xml, line 27 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) and 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: views/payment_transaction_views.xml, line 28 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) and 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/payment/views/payment_transaction_views.xml
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/payment.pot
- Module source code: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, line 436 in 17.0 (d203ee6), line 436 in 18.0 (e2ab18b), line 436 in 19.0 (ce7f5a3) and line 438 in 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, line 1083 in 17.0 (d203ee6), line 1083 in 18.0 (e2ab18b), line 1083 in 19.0 (ce7f5a3) and line 1090 in 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, line 703 in 17.0 (d203ee6), line 703 in 18.0 (e2ab18b), line 703 in 19.0 (ce7f5a3) and line 710 in 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, line 356 in 17.0 (d203ee6), line 356 in 18.0 (e2ab18b), line 356 in 19.0 (ce7f5a3) and line 358 in 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, line 1063 in 17.0 (d203ee6), line 1063 in 18.0 (e2ab18b), line 1063 in 19.0 (ce7f5a3) and line 1070 in 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, line 408 in 17.0 (d203ee6), line 408 in 18.0 (e2ab18b), line 408 in 19.0 (ce7f5a3) and line 410 in 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, line 1016 in 17.0 (d203ee6), line 1016 in 18.0 (e2ab18b), line 1016 in 19.0 (ce7f5a3) and line 1031 in 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, line 1022 in 17.0 (d203ee6), line 1022 in 18.0 (e2ab18b), line 1022 in 19.0 (ce7f5a3) and line 1037 in 20.0 (688d86b)
- Module source code: flexigo_payment_gocardless: __manifest__.py, line 31 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) and 20.0 (688d86b)
- support.gocardless.com/hc/en-gb/articles/360001467265
- Module source code: flexigo_payment_gocardless: const.py, line 66 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) and 20.0 (688d86b)
- github.com/odoo/odoo/blob/17.0/odoo/http.py
- github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
