Saltar al contenido principal
GoCardless · SEPA Core · pago fallido

GoCardless refer_to_payer: MS02, MS03, RR04 y SL01 en un cobro SEPA

Con refer_to_payer GoCardless te dice que el problema está en el lado del pagador y que hay que hablar con él. En SEPA Core la causa llega con uno de cuatro códigos: MS02 si el cliente rechazó el cobro, MS03 o RR04 si el banco no explica el motivo y SL01 si su cuenta limita los adeudos directos.

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

Una causa, cuatro códigos

Código SEPA CoreTexto de GoCardless
MS02The customer refused to accept this payment.
MS03, RR04The payment failed but the reason for the failure was not provided, usually for regulatory reasons.
SL01The 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.

Tarjeta de la causa refer_to_payer de GoCardless
La causa, sus cuatro códigos SEPA Core y el texto de GoCardless para MS02.

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_retry viene a true, 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_payer no 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ódigoPrimer paso
MS02Pregunta al cliente por qué rechazó el recibo: importe, fecha o un desacuerdo con la factura.
MS03Mira «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.
RR04Pide al cliente que consulte a su banco: GoCardless no recibe el motivo.
SL01El 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.

Esquema: qué manda GoCardless con refer_to_payer 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; lo tachado es lo que el conector no hace con esta causa.

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

GoCardless insufficient_funds (AM04): la cuenta del cliente no tenía saldoUn adeudo de GoCardless falla con insufficient_funds y el código SEPA AM04. Qué significa, cuándo lo reintenta Success+ y qué hace Odoo con la factura.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.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

  • 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