Saltar al contenido principal
GoCardless API · invalid_state

Error mandate_is_inactive de GoCardless al crear un cobro desde Odoo

mandate_is_inactive no viene del banco del cliente sino de la propia API de GoCardless: Odoo ha intentado crear un cobro con un mandato que ya no está activo. Es un error de tipo invalid_state, y la documentación de GoCardless es clara sobre qué hacer: avisar a quien usa el sistema y no reintentar.

FlexigoTech · Responsable: Víctor Gómez · Actualizado el 6 de noviembre de 2026

Lo esencial

Módulo
GoCardless
Versiones
Odoo 17, 18, 19 y 20
Comprobado
en el código del conector, versión 17.0, 18.0, 19.0 y 20.0 · en las fuentes enlazadas al final
Lectura
4 min

Qué dice GoCardless

ReasonTipoTexto de GoCardless
mandate_is_inactiveinvalid_state«Payment could not be created» y «mandate is cancelled, failed, or expired.»

GoCardless separa las dos partes del texto con una raya. Los errores invalid_state significan, según GoCardless, que la acción no vale en el estado actual del recurso. Aquí el recurso es el mandato: cancelado, fallido o caducado, ya no admite cobros.

Tarjeta del error mandate_is_inactive de GoCardless
El reason, su tipo invalid_state y el texto con el que lo documenta GoCardless.

Cómo se llega a este error

Lo normal es que Odoo se entere de que un mandato ha muerto por un evento de GoCardless antes de intentar cobrar con él. Este error aparece cuando no ha sido así: el aviso no llegó o llegó tarde, o el mandato se canceló justo antes del cobro. El cobro puede venir de una suscripción que se renueva o de un pago registrado con el método de pago guardado del cliente. Los avisos de GoCardless llegan por webhook: con la conexión en dos clics, a través de FlexigoTech Cloud; en el modo avanzado, al endpoint que creaste tú en el Dashboard de GoCardless. Si ese camino falla, Odoo no se entera a tiempo.

Lo que hace el conector

Sin un tratamiento especial, verías el error tal cual, con el texto de la API, y el mandato seguiría ofreciéndose para la siguiente factura. El conector hace otra cosa:

  1. Reconoce el reason mandate_is_inactive en la respuesta.
  2. Pregunta a GoCardless por ese mandato para confirmar su estado.
  3. Si está cancelado, fallido, caducado, consumido o bloqueado, lo archiva en Odoo. Si es la primera noticia de ese mandato muerto, lo escribe en la ficha del cliente, con el estado del mandato entre paréntesis («El mandato de domiciliación de GoCardless de … ya no se puede usar (cancelled). No se puede cobrar nada más con él. Pide al cliente que firme un mandato nuevo.»), y crea la actividad «Mandato de GoCardless perdido».
  4. Pasa la transacción a «Error» con su propio mensaje, en lugar del error en crudo: «El mandato de GoCardless del cliente está en estado …, así que no se puede cobrar. Pide al cliente un mandato nuevo.».

Si el mandato resultara estar activo, el conector no lo toca y la transacción muestra el error de GoCardless: «GoCardless rechazó la solicitud.» seguido del mensaje de la API y su request_id. El mismo tratamiento tiene el botón de reintentar un cobro cuando GoCardless contesta mandate_is_inactive.

Estos textos salen en el idioma de quien lanza el cobro. Si lo lanza una tarea programada, como la renovación de una suscripción, se escriben sin nadie delante: en una base de datos creada en castellano salen así, y en una creada en inglés y pasada después a castellano, en inglés: «The GoCardless direct debit mandate of … is no longer usable (cancelled). No further collection can be taken against it. Ask the customer to set up a new mandate.», «GoCardless mandate lost», «The customer's GoCardless mandate is …, so it cannot be charged. Ask the customer for a new mandate.» y «GoCardless rejected the request.».

Por qué no conviene reintentar

GoCardless lo pone en la descripción de los errores invalid_state: hay que informar al usuario y no dejar que reintente. Un mandato cancelado no vuelve a estar activo porque se insista; necesita una firma nueva del cliente o, en algunos casos y solo con permisos especiales de GoCardless, una reactivación.

Esquema: qué responde GoCardless con mandate_is_inactive y qué hace Odoo con el conector
Esquema hecho a partir del código del conector (17.0, 18.0, 19.0 y 20.0) y de la documentación de GoCardless.

Qué hacer

  • Mira el mensaje de la transacción y la nota del conector en la ficha del cliente. La transacción se abre desde la factura, con el botón «Transacción de pago» de arriba; el menú de transacciones solo sale en modo desarrollador, y en Odoo 20 no existe. Los dos textos dicen en qué estado está el mandato.
  • Pide al cliente un mandato nuevo y cobra con él la factura pendiente.
  • Si pasa a menudo, revisa que los webhooks de GoCardless lleguen a tu Odoo: son los que avisan antes de que llegue el cobro. Aun así, el conector pide cada hora los eventos que se hayan perdido.

¿Por qué el conector consulta el mandato en vez de archivarlo sin más?

Porque solo archiva lo que GoCardless confirma muerto. Si la consulta dice que el mandato está activo, archivarlo obligaría al cliente a firmar sin necesidad.

Con nuestro conector

En Odoo 17, 18, 19 y 20 el conector convierte un error de API en una tarea clara: el mandato muerto sale de la lista de métodos de pago, el cliente queda avisado en su ficha y la factura sigue pendiente hasta que haya un mandato que funcione.

Sigue leyendo

GoCardless MD01: mandate_cancelled y authorisation_disputed en un cobro SEPAEl código SEPA MD01 llega en GoCardless como mandate_cancelled o authorisation_disputed, en un cobro fallido, devuelto o cancelado. Qué hace Odoo con ello.GoCardless bank_account_closed: AC04 y MD07, la cuenta ya no existeGoCardless bank_account_closed con AC04 (cuenta cerrada) o MD07 (titular fallecido): el mandato queda cancelado. Qué hace Odoo con la factura y con el cliente.Error retry_failed de GoCardless al reintentar un cobro desde OdooGoCardless responde retry_failed si el pago no ha fallado o ya no admite reintentos. Cuándo sale en Odoo el botón «Reintentar el cobro» y qué hace el conector.
Comprobado en el código del conector (versión 17.0, 18.0, 19.0 y 20.0) y en las fuentes enlazadas

Fuentes

  • Código del módulo: flexigo_payment_gocardless: const.py, línea 15 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 247 en 17.0 (d203ee6), línea 247 en 18.0 (e2ab18b), línea 247 en 19.0 (ce7f5a3) y línea 258 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: models/payment_provider.py, línea 71 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: __manifest__.py, línea 6 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
  • docs.gocardless.com/docs/api-reference/mandate
  • Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 278 en 17.0 (d203ee6), línea 278 en 18.0 (e2ab18b), línea 278 en 19.0 (ce7f5a3) y línea 289 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: const.py, línea 33 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: models/payment_token.py, línea 131 en 17.0 (d203ee6), línea 131 en 18.0 (e2ab18b), línea 131 en 19.0 (ce7f5a3) y línea 130 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: const.py, línea 134 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: models/payment_provider.py, línea 397 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 469 en 17.0 (d203ee6), línea 469 en 18.0 (e2ab18b), línea 468 en 19.0 (ce7f5a3) y línea 487 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: const.py, línea 117 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 1241 en 17.0 (d203ee6), línea 1241 en 18.0 (e2ab18b), línea 1241 en 19.0 (ce7f5a3) y línea 1252 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 527 en 17.0 (d203ee6), línea 527 en 18.0 (e2ab18b), línea 527 en 19.0 (ce7f5a3) y línea 532 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 560 en 17.0 (d203ee6), línea 560 en 18.0 (e2ab18b), línea 560 en 19.0 (ce7f5a3) y línea 565 en 20.0 (688d86b)
  • docs.gocardless.com/docs/api-reference/events/mandate
  • Código del módulo: flexigo_payment_gocardless: __manifest__.py, línea 31 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
  • docs.gocardless.com/docs/api-reference/responses-and-errors
  • Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 321 en 17.0 (d203ee6), línea 321 en 18.0 (e2ab18b), línea 321 en 19.0 (ce7f5a3) y línea 332 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 1343 en 17.0 (d203ee6), línea 1343 en 18.0 (e2ab18b), línea 1343 en 19.0 (ce7f5a3) y línea 1354 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: models/payment_token.py, línea 83 en 17.0 (d203ee6), línea 83 en 18.0 (e2ab18b), línea 83 en 19.0 (ce7f5a3) y línea 82 en 20.0 (688d86b)
  • github.com/odoo/odoo/blob/20.0/addons/payment/i18n/es.po
  • Código del módulo: flexigo_payment_gocardless: models/payment_provider.py, línea 462 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 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