Skip to main content
GoCardless · mandates · expired

GoCardless mandate_expired: the mandate expired from not being used

A GoCardless mandate does not stay alive forever if it is not used. When the dormancy period passes without any collection attempt, GoCardless marks it as expired and no longer lets you collect with it. It reports this in an event on the mandate and, if a collection was still pending submission, also in the payment event, which is cancelled.

FlexigoTech · Editor in charge: Víctor Gómez · Updated 6 November 2026

Key facts

Versions
Odoo 17, 18, 19 and 20
Checked
in the connector's source code, version 17.0, 18.0, 19.0 and 20.0 · against the sources linked at the end
Reading time
4 min

What GoCardless says

EventCauseGoCardless text
mandates · expiredmandate_expiredThe mandate is being marked as expired, because no payments have been collected against it for the dormancy period of your service user number. If you have access to the mandate reinstation API endpoint, you can use this to attempt to set this mandate up again.
payments · cancelledmandate_expiredThe mandate expired before the payment could be collected.

The event description makes it clear: “No collection attempts were made against the mandate within the dormancy period of your service user number.”. And the consequence: “As a result it has expired, and no further collections can be taken against it.”. The mandate status changes to expired, which GoCardless defines as expired due to dormancy.

GoCardless mandate_expired cause card
The cause, the expired mandate event, the cancelled payment and the GoCardless text.

When it happens

It happens to a mandate that was signed and then stopped being used: a customer who no longer buys, or one charged so infrequently that the whole dormancy period passes between one collection and the next. What counts is the time without collection attempts, not the signing date.

If a collection was waiting to be submitted when the mandate expired, GoCardless cancels it with the same cause: “The mandate expired before the payment could be collected.”.

What Odoo does with the connector

  • The expired mandate event retires it. The connector treats an expired mandate as dead: it archives the customer's payment method, writes in its record that the mandate can no longer be used and creates the activity “GoCardless mandate lost”. It only does this the first time; if another event brings the same news, it finds it already archived.
  • The cancelled payment sets its transaction to “Error”, which you can open from the invoice with the “Payment Transaction” button above, with “GoCardless could not collect this payment (mandate_expired).”. If the invoice was already paid with that collection, it reverses the payment and the invoice becomes outstanding again. And since mandate_expired is one of the causes for which the connector archives the mandate, that event also retires it, as expired.
  • In the payment method record, “Mandate Status” shows expired.

The connector writes these texts when it applies the event, with nobody in front of the screen. 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: “The GoCardless direct debit mandate of … is no longer usable (mandate_expired). No further collection can be taken against it. Ask the customer to set up a new mandate.”, “GoCardless mandate lost” and “GoCardless could not collect this payment (mandate_expired).”.

If Odoo tries to collect with the mandate before it learns of the expiry, because the event was lost along the way, GoCardless replies mandate_is_inactive. The connector then fetches the mandate, archives it and puts its own message in the transaction: “The customer's GoCardless mandate is expired, so it cannot be charged. Ask the customer for a new mandate.”. The task that recovers lost events every hour also ends up bringing in the mandate event.

Diagram: what GoCardless sends with mandate_expired and what Odoo does with the connector
Diagram based on the connector's code (17.0, 18.0, 19.0 and 20.0) and the GoCardless documentation.

Reinstate it or ask for another?

GoCardless offers two paths. To keep collecting from that customer, it says, you should request their permission and use the reinstatement. But that endpoint is restricted: it requires custom payment pages approved by GoCardless (“Restricted this endpoint requires approved custom payment pages”).

The connector does not reinstate mandates in production: the “Reinstate mandate (sandbox)” button on the payment method record only appears with the provider in test mode and the mandate cancelled, failed or expired. In production, the way forward is a new mandate.

What to do

  1. Talk to the customer: if they are still a customer, ask them to sign a new mandate. In Odoo it will be a new payment method.
  2. Collect the outstanding invoices with them. Collections that GoCardless cancelled because of the expiry will not be submitted on their own.
  3. If a customer is charged very infrequently, expect that their mandate may expire between one collection and the next.

Can I collect with an expired mandate if the customer agrees?

Not with that mandate: GoCardless does not let you create collections with it. You need a new one or, where it can be used, GoCardless reinstatement.

Can reinstatement be tested?

Yes, in the GoCardless sandbox. With the provider in test mode, the payment method record shows “Reinstate mandate (sandbox)” when the mandate is expired.

With our connector

In Odoo 17, 18, 19 and 20 the connector retires the expired mandate as soon as GoCardless reports it, leaves the collection cancelled in error with its cause, and flags it on the customer's record, so you can ask for a new mandate before the next invoice.

Keep reading

GoCardless mandate_not_inactive: the mandate cannot be reinstatedGoCardless returns mandate_not_inactive when you reinstate an active or already submitted mandate. When you can reinstate one and what Odoo does.GoCardless mandate_is_inactive error when creating a collection from OdooGoCardless returns mandate_is_inactive when a payment is created against a cancelled, failed or expired mandate. Why it happens and how Odoo handles it.GoCardless MD01: mandate_cancelled and authorisation_disputed in a SEPA collectionSEPA code MD01 reaches GoCardless as mandate_cancelled or authorisation_disputed, on a failed, charged-back or cancelled collection. What Odoo does with it.
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/mandate
  • docs.gocardless.com/docs/api-reference/events/payment
  • docs.gocardless.com/docs/api-reference/mandate
  • Module source code: flexigo_payment_gocardless: const.py, line 33 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) and 20.0 (688d86b)
  • Module source code: flexigo_payment_gocardless: models/payment_token.py, line 83 in 17.0 (d203ee6), line 83 in 18.0 (e2ab18b), line 83 in 19.0 (ce7f5a3) and line 82 in 20.0 (688d86b)
  • Module source code: flexigo_payment_gocardless: models/payment_token.py, line 131 in 17.0 (d203ee6), line 131 in 18.0 (e2ab18b), line 131 in 19.0 (ce7f5a3) and line 130 in 20.0 (688d86b)
  • Module source code: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, line 1148 in 17.0 (d203ee6), line 1148 in 18.0 (e2ab18b), line 1148 in 19.0 (ce7f5a3) and line 1155 in 20.0 (688d86b)
  • Module source code: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, line 495 in 17.0 (d203ee6), line 495 in 18.0 (e2ab18b), line 495 in 19.0 (ce7f5a3) and line 497 in 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: models/payment_transaction.py, line 914 in 17.0 (d203ee6), line 914 in 18.0 (e2ab18b), line 913 in 19.0 (ce7f5a3) and line 937 in 20.0 (688d86b)
  • Module source code: flexigo_payment_gocardless: models/payment_transaction.py, line 725 in 17.0 (d203ee6), line 725 in 18.0 (e2ab18b), line 724 in 19.0 (ce7f5a3) and line 748 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: 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: models/payment_transaction.py, line 278 in 17.0 (d203ee6), line 278 in 18.0 (e2ab18b), line 278 in 19.0 (ce7f5a3) and line 289 in 20.0 (688d86b)
  • Module source code: flexigo_payment_gocardless: models/payment_transaction.py, line 321 in 17.0 (d203ee6), line 321 in 18.0 (e2ab18b), line 321 in 19.0 (ce7f5a3) and line 332 in 20.0 (688d86b)
  • docs.gocardless.com/docs/api-reference/responses-and-errors
  • Module source code: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, line 1233 in 17.0 (d203ee6), line 1233 in 18.0 (e2ab18b), line 1233 in 19.0 (ce7f5a3) and line 1240 in 20.0 (688d86b)
  • Module source code: flexigo_payment_gocardless: views/payment_token_views.xml, line 15 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) and 20.0 (688d86b)
  • Module source code: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, line 785 in 17.0 (d203ee6), line 785 in 18.0 (e2ab18b), line 785 in 19.0 (ce7f5a3) and line 800 in 20.0 (688d86b)
  • Module source code: flexigo_payment_gocardless: views/payment_token_views.xml, line 23 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) and 20.0 (688d86b)
  • Module source code: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, line 998 in 17.0 (d203ee6), line 998 in 18.0 (e2ab18b), line 998 in 19.0 (ce7f5a3) and line 1013 in 20.0 (688d86b)
  • Module source code: flexigo_payment_gocardless: models/payment_token.py, line 162 in 17.0 (d203ee6), line 162 in 18.0 (e2ab18b), line 162 in 19.0 (ce7f5a3) and line 161 in 20.0 (688d86b)
  • Module source code: flexigo_payment_gocardless: const.py, line 117 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/payment/i18n/payment.pot
  • github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
  • Module source code: flexigo_payment_gocardless: __manifest__.py, line 31 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) and 20.0 (688d86b)