Qué dice GoCardless
| Reason | Tipo | Texto de GoCardless |
|---|---|---|
mandate_is_inactive | invalid_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.

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:
- Reconoce el reason
mandate_is_inactiveen la respuesta. - Pregunta a GoCardless por ese mandato para confirmar su estado.
- 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».
- 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.

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
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
