Skip to main content
GoCardless API · invalid_state · reinstate

GoCardless mandate_not_inactive: the mandate cannot be reinstated

Reinstating a mandate means submitting a cancelled or expired one back to the banks. GoCardless rejects it with mandate_not_inactive if the mandate is already active or already being submitted. With the connector, you can only request it outside production, because GoCardless restricts that function in production.

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

ReasonTypeGoCardless text
mandate_not_inactiveinvalid_state“Mandate could not be reinstated” and “it is already active or being submitted.”

GoCardless separates the two parts of the text with a dash. The API reference details it: “This will fail with a mandate_not_inactive error if the mandate is already being submitted, or is active.”. It is an invalid_state error, and for those GoCardless asks you to inform the user and not retry (“invalid_state → inform the end user, do not allow retry.”).

GoCardless mandate_not_inactive error card
The reason, its invalid_state type, the reinstate action (actions/reinstate) and the GoCardless text.

Which mandates can be reinstated

Reinstatement has more conditions than the status:

  • It is a restricted function: “Restricted this endpoint requires approved custom payment pages”.
  • It only applies to a mandate cancelled from the Dashboard or the API: “A mandate can only be reinstated if it has been cancelled through the dashboard or the API.”. One cancelled by the bank cannot: “Any mandate that has been cancelled by the bank cannot be reinstated.”.
  • It works for cancelled or expired mandates (“Reinstates a cancelled or expired mandate to the banks.”), and a mandate can be resubmitted up to 10 times (“Mandates can be resubmitted up to 10 times.”).

After requesting it, the process is that of a new setup: resubmission_requested arrives and then, as GoCardless puts it, “so you will receive a submitted webhook, followed by a reinstated or failed webhook up to two working days later.”.

What Odoo does with the connector

On the customer's payment method form, the connector shows the button “Reinstate mandate (sandbox)”. It only appears if the mandate is from GoCardless, the provider is not in production (in Odoo 17, 18 and 19, the provider state; in Odoo 20, the production checkbox) and “Mandate Status” is cancelled, failed or expired.

When you press it:

  1. The connector asks GoCardless to reinstate that mandate.
  2. If GoCardless accepts it, the state changes to reinstate_requested and the customer form shows “Reinstatement of the GoCardless mandate requested. It stays unusable until the bank confirms it.”. The payment method stays archived.
  3. When reinstated arrives, the connector marks it as valid again: it reactivates it and writes “The GoCardless mandate is usable again (reinstated).”.

If GoCardless replies mandate_not_inactive, the connector does not catch it: Odoo shows “GoCardless rejected the request.” with the GoCardless message, the reason and the request_id, and the mandate stays as it was. This happens when Odoo thinks the mandate is dead but in GoCardless it is already active or being submitted, because its events have not yet reached Odoo. After an accepted request, the button no longer appears, because the state changes to reinstate_requested.

The note that the mandate is usable again is written by the connector when applying the event, with no one present. 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 mandate is usable again (reinstated).”.

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

What to do

  1. If mandate_not_inactive appears, look up the mandate in the GoCardless Dashboard. If it is active or being submitted, there is nothing to reinstate: wait for its events to arrive. The scheduled task that recovers lost events every hour brings them in.
  2. If the bank cancelled the mandate, do not try: GoCardless does not reinstate those. Ask the customer for a new mandate.
  3. In production, the connector does not offer reinstatement: the path is a new mandate signed by the customer.
  4. To test it, use the GoCardless sandbox with the provider in test mode.

Why does the button only appear outside production?

Because GoCardless restricts reinstatement to those with approved custom payment pages, and the connector only offers it outside production.

How long until the mandate is valid again?

As long as the banks take: according to GoCardless, after resubmission_requested comes submitted and, up to two working days later, reinstated or failed depending on the banks' response. Until then, the connector does not use it.

With our connector

In Odoo 17, 18, 19 and 20 the connector only offers to reinstate a cancelled, failed or expired mandate, and only outside production, and it does not use it again until GoCardless confirms the reinstatement with its event.

Keep reading

GoCardless mandate_expired: the mandate expired from not being usedGoCardless marks a mandate as expired when no collection has been attempted with it during the whole dormancy period. What Odoo does and how to keep collecting.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.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.
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/responses-and-errors
  • docs.gocardless.com/docs/api-reference/mandate
  • docs.gocardless.com/docs/api-reference/events/mandate
  • Module source code: flexigo_payment_gocardless: const.py, line 134 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) and 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: views/payment_token_views.xml, line 22 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 176 in 17.0 (d203ee6), line 176 in 18.0 (e2ab18b), line 176 in 19.0 (ce7f5a3) and line 175 in 20.0 (688d86b)
  • Module source code: flexigo_payment_gocardless: models/payment_token.py, line 173 in 17.0 (d203ee6), line 173 in 18.0 (e2ab18b), line 173 in 19.0 (ce7f5a3) and line 172 in 20.0 (688d86b)
  • Module source code: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, line 1004 in 17.0 (d203ee6), line 1004 in 18.0 (e2ab18b), line 1004 in 19.0 (ce7f5a3) and line 1019 in 20.0 (688d86b)
  • Module source code: flexigo_payment_gocardless: models/payment_token.py, line 170 in 17.0 (d203ee6), line 170 in 18.0 (e2ab18b), line 170 in 19.0 (ce7f5a3) and line 169 in 20.0 (688d86b)
  • Module source code: flexigo_payment_gocardless: models/payment_provider.py, line 397 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) and 20.0 (688d86b)
  • Module source code: flexigo_payment_gocardless: models/payment_provider.py, line 462 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 521 in 17.0 (d203ee6), line 521 in 18.0 (e2ab18b), line 521 in 19.0 (ce7f5a3) and line 523 in 20.0 (688d86b)
  • Module source code: flexigo_payment_gocardless: const.py, line 158 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 77 in 17.0 (d203ee6), line 77 in 18.0 (e2ab18b), line 77 in 19.0 (ce7f5a3) and line 76 in 20.0 (688d86b)
  • Module source code: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, line 1157 in 17.0 (d203ee6), line 1157 in 18.0 (e2ab18b), line 1157 in 19.0 (ce7f5a3) and line 1164 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: const.py, line 117 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) and 20.0 (688d86b)
  • github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
  • github.com/odoo/odoo/blob/17.0/odoo/http.py
  • Module source code: flexigo_payment_gocardless: __manifest__.py, line 31 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) and 20.0 (688d86b)