Tres eventos y cuatro filas, el mismo código
| Evento | Causa | Texto de GoCardless |
|---|---|---|
| payments · failed | mandate_cancelled | The customer cancelled their mandate at their bank. |
| payments · charged_back | mandate_cancelled | This payment was charged back by the customer's bank, because the customer disputed authorising the transaction. |
| payments · cancelled | authorisation_disputed | This payment has been cancelled because the payer disputes authorising its mandate. |
| payments · cancelled | mandate_cancelled | This payment has been cancelled because the payer disputes authorising its mandate. |
Las cuatro filas son de la tabla de SEPA Core de la documentación de GoCardless y llevan MD01; el pago cancelado sale con dos causas y el mismo texto. El mandato también se cancela, y GoCardless lo comunica con su propio evento: «A payment under this mandate failed, indicating that the mandate has been cancelled at the customer's bank. Any subscriptions and pending payments will also be cancelled.».

Qué cambia según el momento
Si el cliente anula el mandato antes de que se cobre el recibo, el pago falla: el dinero no llegó. Si lo disputa después de cobrado, es una devolución: el dinero llegó y se va. Y si había pagos esperando a presentarse, GoCardless los cancela antes de enviarlos. El conector anota en su código que vio la causa authorisation_disputed con MD01 en un pago de prueba del sandbox, como devolución de un pago ya liquidado.
Lo que hace Odoo con el conector
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. En los tres casos, la transacción acaba en «Error» con la causa a la vista. El mensaje depende del evento: «GoCardless no pudo cobrar este pago (mandate_cancelled).» para un fallo, y «GoCardless ha comunicado una devolución de este pago (mandate_cancelled). El dinero se ha retirado y se descontará de una liquidación futura.» para una devolución. Si Odoo ya tenía la factura pagada con ese cobro, el conector anula el pago y la factura vuelve a estar pendiente.
Lo importante es el mandato. mandate_cancelled y authorisation_disputed están entre las cuatro causas con las que el conector lo da por muerto, así que:
- archiva el método de pago del cliente, que deja de ofrecerse para cobrar;
- escribe en su ficha «El mandato de domiciliación de GoCardless de … ya no se puede usar (mandate_cancelled). No se puede cobrar nada más con él. Pide al cliente que firme un mandato nuevo.»;
- crea una actividad «Mandato de GoCardless perdido».
Llegan varios eventos con la misma noticia, el del pago y el del mandato, pero el aviso sale una sola vez: el segundo encuentra el mandato ya archivado.
Todos estos textos los escribe el conector al aplicar el evento, sin nadie delante. En una base de datos creada en castellano salen así; en una creada en inglés y pasada después a castellano salen en inglés: «GoCardless could not collect this payment (mandate_cancelled).», «GoCardless reported a chargeback for this payment (mandate_cancelled). The funds have been taken back and will be deducted from a future payout.», «The GoCardless direct debit mandate of … is no longer usable (mandate_cancelled). No further collection can be taken against it. Ask the customer to set up a new mandate.» y «GoCardless mandate lost».
Qué hacer
Antes de pedir un mandato nuevo, entiende por qué lo anuló. Un cliente que dejó de querer el servicio necesita una baja, no otra firma. Si fue un error suyo o un cambio en su banco, pídele que firme otra vez y cobra con el mandato nuevo las facturas que quedaron abiertas. Si dice que nunca autorizó el cargo, revisa cómo se firmó el mandato antes de seguir cobrándole.
¿Sirve de algo reintentar un pago con MD01?
No. El mandato ya no existe para su banco, y con el mandato archivado el botón «Reintentar el cobro» no sale en la transacción. Hace falta un mandato nuevo firmado por el cliente.

Con nuestro conector
En Odoo 17, 18, 19 y 20, el conector distingue el fallo de la devolución, reabre la factura si hace falta, retira el mandato y te deja la tarea de hablar con el cliente en su ficha. Lo que no hace es pedir el mandato nuevo por su cuenta: esa conversación es tuya.
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 442 en 17.0 (d203ee6), línea 442 en 18.0 (e2ab18b), línea 441 en 19.0 (ce7f5a3) y línea 456 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: const.py, línea 76 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: const.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: models/payment_transaction.py, línea 725 en 17.0 (d203ee6), línea 725 en 18.0 (e2ab18b), línea 724 en 19.0 (ce7f5a3) y línea 748 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 713 en 17.0 (d203ee6), línea 713 en 18.0 (e2ab18b), línea 712 en 19.0 (ce7f5a3) y línea 736 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 754 en 17.0 (d203ee6), línea 754 en 18.0 (e2ab18b), línea 753 en 19.0 (ce7f5a3) y línea 777 en 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: 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)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 464 en 17.0 (d203ee6), línea 464 en 18.0 (e2ab18b), línea 464 en 19.0 (ce7f5a3) y línea 469 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 570 en 17.0 (d203ee6), línea 570 en 18.0 (e2ab18b), línea 570 en 19.0 (ce7f5a3) y línea 575 en 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)
- 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/events/payment
- Código del módulo: flexigo_payment_gocardless: views/payment_transaction_views.xml, línea 13 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 63 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 418 en 17.0 (d203ee6), línea 418 en 18.0 (e2ab18b), línea 417 en 19.0 (ce7f5a3) y línea 432 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 1092 en 17.0 (d203ee6), línea 1092 en 18.0 (e2ab18b), línea 1092 en 19.0 (ce7f5a3) y línea 1113 en 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/es.po
- 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
