Una causa, cuatro códigos
| Código SEPA Core | Texto de GoCardless |
|---|---|
| MS02 | The customer refused to accept this payment. |
| MS03, RR04 | The payment failed but the reason for the failure was not provided, usually for regulatory reasons. |
| SL01 | The payment failed due to a restriction on Direct Debit payments from the payer's bank account. |
Las tres filas vienen de la tabla de fallos de pago (payments · failed) de la documentación de GoCardless para SEPA Core. A diferencia de otras causas, ninguna dice que el mandato se cancele: el cliente sigue autorizado a que le cobres, aunque este adeudo concreto no haya pasado.

Qué hay detrás de cada código
MS02 es la respuesta más clara: el cliente le dijo a su banco que no pagara ese recibo. El conector anota en su código que es la combinación que vio en un pago SEPA de prueba del sandbox de GoCardless. MS03 y RR04 son lo contrario: el pago falla y el banco no da el motivo, normalmente por razones regulatorias, así que la única forma de saber qué pasa es preguntar al cliente. SL01 apunta a la cuenta: su banco limita los adeudos directos que se le pueden cargar, y eso solo lo puede cambiar el titular con su banco.
Con MS02, RR04 y SL01, volver a presentar el adeudo sin hablar antes con el cliente suele acabar igual y puede costar otra comisión. MS03 tiene una excepción: según la guía de Success+, en Austria, Bélgica, Alemania, Luxemburgo y Eslovaquia MS03 cuenta como falta de fondos, y Success+ puede reintentarlo. Si es así, el evento llega con will_attempt_retry a true.
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. El conector guarda la causa en el campo «Causa según GoCardless», no el código SEPA, y enseña «GoCardless no pudo cobrar este pago (refer_to_payer).». Después sigue lo que diga el evento:
- Si
will_attempt_retryviene atrue, la transacción queda «Pendiente», la casilla «Success+ reintentará» se marca y el mensaje lo dice: «Success+ lo reintentará automáticamente; no hay que hacer nada.». El botón de reintentar no sale. - Si no, la transacción pasa a «Error» y sale el botón «Reintentar el cobro», si quedan reintentos. Si Odoo ya daba el cobro por hecho, el conector anula su pago y la factura vuelve a estar pendiente de cobro.
- El mandato no se toca.
refer_to_payerno está entre las causas con las que el conector archiva un mandato, así que el método de pago del cliente sigue disponible para el siguiente cobro.
Este último punto es deliberado: archivar el mandato por un rechazo puntual obligaría al cliente a firmar otro sin motivo.
Los dos mensajes 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 (refer_to_payer).» y «Success+ will retry it automatically; there is nothing to do.».
Qué hacer según el código
Odoo no te dice cuál de los cuatro códigos llegó: el conector solo guarda la causa. El código lo ves en GoCardless. Según su centro de ayuda, el motivo de cada fallo sale en la cronología del pago, en el Dashboard («You are able to view the reason for a payment failure in the status timeline of the payment in your GoCardless dashboard.»). En el modo avanzado, el código exacto también va en el evento (details.reason_code), y el Dashboard guarda los envíos de los últimos 3 meses en Developers > Webhooks, con su contenido.
| Código | Primer paso |
|---|---|
| MS02 | Pregunta al cliente por qué rechazó el recibo: importe, fecha o un desacuerdo con la factura. |
| MS03 | Mira «Success+ reintentará»: en Austria, Bélgica, Alemania, Luxemburgo y Eslovaquia, Success+ puede reintentar MS03 como falta de fondos. Si no está marcada, pide al cliente que consulte a su banco. |
| RR04 | Pide al cliente que consulte a su banco: GoCardless no recibe el motivo. |
| SL01 | El cliente tiene que levantar la limitación de adeudos de su cuenta, o darte otra. |
Cuando el cliente confirme que el cobro pasará, usa «Reintentar el cobro» en la transacción y confirma el aviso de la comisión. El conector responde «Reintento solicitado. GoCardless confirmará la nueva fecha de cargo.» y la deja pendiente. Recuerda el límite: un pago se puede reintentar como mucho 3 veces («Payments can be retried up to 3 times.»).
¿Se cancela el mandato si el cliente rechaza un cobro?
No. Ni la documentación de GoCardless lo dice para esta causa ni el conector archiva el mandato con refer_to_payer. Si el cliente quiere dejar de pagarte por domiciliación, cancelará el mandato en su banco y eso llega con otra causa, mandate_cancelled.

Con nuestro conector
En Odoo 17, 18, 19 y 20 el conector convierte refer_to_payer en una factura pendiente con la causa a la vista y un mandato que sigue valiendo. No adivina el código SEPA: Odoo guarda la causa en la transacción, y el código lo consultas en GoCardless. La decisión de volver a cobrar es tuya, después de hablar con el cliente.
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
- docs.gocardless.com/docs/api-reference/events/payment
- docs.gocardless.com/docs/api-reference/payment
- 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: const.py, línea 79 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 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 729 en 17.0 (d203ee6), línea 729 en 18.0 (e2ab18b), línea 728 en 19.0 (ce7f5a3) y línea 752 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: const.py, línea 122 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
- 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: 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 380 en 17.0 (d203ee6), línea 380 en 18.0 (e2ab18b), línea 380 en 19.0 (ce7f5a3) y línea 385 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)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 1098 en 17.0 (d203ee6), línea 1098 en 18.0 (e2ab18b), línea 1098 en 19.0 (ce7f5a3) y línea 1119 en 20.0 (688d86b)
- 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/optimise/reduced-failed-payments-with-success-plus
- 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: views/payment_transaction_views.xml, línea 27 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/es.po
- github.com/odoo/odoo/blob/20.0/addons/payment/views/payment_transaction_views.xml
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 1163 en 17.0 (d203ee6), línea 1163 en 18.0 (e2ab18b), línea 1163 en 19.0 (ce7f5a3) y línea 1174 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 1141 en 17.0 (d203ee6), línea 1141 en 18.0 (e2ab18b), línea 1141 en 19.0 (ce7f5a3) y línea 1152 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 618 en 17.0 (d203ee6), línea 618 en 18.0 (e2ab18b), línea 618 en 19.0 (ce7f5a3) y línea 623 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 461 en 17.0 (d203ee6), línea 461 en 18.0 (e2ab18b), línea 460 en 19.0 (ce7f5a3) y línea 479 en 20.0 (688d86b)
- docs.gocardless.com/docs/api-reference/webhooks
- github.com/odoo/odoo/blob/17.0/odoo/http.py
- support.gocardless.com/hc/en-gb/articles/360001467265
- Código del módulo: flexigo_payment_gocardless: const.py, línea 66 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
