Qué dice GoCardless
| Evento | Causa | Código SEPA Core | Texto de GoCardless |
|---|---|---|---|
| payments · failed | insufficient_funds | AM04 | The customer's account had insufficient funds to make this payment. |
La documentación del evento failed añade una pieza clave: GoCardless reintenta el pago por su cuenta cuando el campo will_attempt_retry del evento viene a true («GoCardless will automatically retry the payment if event's will_attempt_retry field is true.»). Ese reintento automático es Success+, y para usarlo hay que tenerlo activado en el Dashboard de GoCardless.
Según la guía de Success+, solo reintenta pagos que fallan por falta de fondos. En SEPA son dos códigos: AM04 y MS03, y MS03 solo en Austria, Bélgica, Alemania, Luxemburgo y Eslovaquia. Aun así, GoCardless avisa de que sus criterios pueden cambiar: lo que vale para cada fallo es el campo will_attempt_retry.

Por qué llega cuando la factura ya parecía cobrada
Un adeudo SEPA no se resuelve en el acto: según GoCardless, cobrar un pago puede llevar hasta 5 días hábiles. Casi siempre el banco del cliente avisa del fallo un día hábil después de la fecha de cargo, antes de que el pago pase a confirmed. En pocos casos avisa más tarde, con el pago ya marcado como confirmed: es un fallo tardío (late failure), y la guía de Success+ pone como ejemplo uno por falta de fondos. Por eso AM04 puede aparecer cuando en Odoo el cobro ya estaba confirmado y la factura, conciliada. El conector lo tiene en cuenta: si un cobro que Odoo daba por hecho falla, anula su pago y la factura vuelve a estar pendiente.
El conector de GoCardless para Odoo solo cobra por SEPA Core y en euros, y para un pago fallido de SEPA Core la documentación de GoCardless da un solo código con insufficient_funds: AM04. En Odoo verás la causa y no el código, porque el conector guarda la causa del evento y no el código SEPA. El conector anota además en su código que la combinación insufficient_funds con AM04 es la que vio en pagos SEPA reales del sandbox de GoCardless.
Lo que ves en Odoo con el conector
Cada cobro que manda el conector pide a GoCardless retry_if_possible, la opción de Success+. Cuando llega el fallo pueden pasar dos cosas, y la transacción te dice cuál en su grupo GoCardless: «Causa según GoCardless» y la casilla «Success+ reintentará». 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.
will_attempt_retry | Estado | «Mensaje» de la transacción | Botón «Reintentar el cobro» |
|---|---|---|---|
| true | «Pendiente» | «GoCardless no pudo cobrar este pago (insufficient_funds). Success+ lo reintentará automáticamente; no hay que hacer nada.» | No sale |
| false | «Error», y la factura vuelve a estar pendiente | «GoCardless no pudo cobrar este pago (insufficient_funds).» y, si GoCardless da el motivo, «No se reintentará automáticamente (…).» | Sale, si quedan reintentos y el mandato está activo |
Esos mensajes los escribe el conector al aplicar el evento, sin nadie delante. En una base de datos creada en castellano salen como en la tabla; en una creada en inglés y pasada después a castellano salen en inglés: «GoCardless could not collect this payment (insufficient_funds). Success+ will retry it automatically; there is nothing to do.», «GoCardless could not collect this payment (insufficient_funds).» y «It will not be retried automatically (…).».
La transacción queda pendiente a propósito cuando Success+ va a reintentar: el dinero todavía puede llegar, y un estado de error haría creer que el cobro está perdido. Cada vez que GoCardless vuelve a presentar el cobro manda un evento resubmission_requested, y el conector sube en uno «Reintentos de GoCardless», tanto si el reintento es de Success+ como si lo pediste tú.
Qué hacer
- Abre la transacción desde la factura y mira «Causa según GoCardless» y «Success+ reintentará».
- Si Success+ lo va a reintentar, no hagas nada: el botón de reintentar ni siquiera sale. GoCardless pide no cobrar al cliente por otra vía mientras tanto, porque podría pagar dos veces.
- Si no lo va a reintentar, habla antes con el cliente para saber cuándo tendrá saldo y pulsa «Reintentar el cobro» cuando te lo confirme. El botón no elige fecha: la nueva fecha de cargo la pone GoCardless, y la transacción queda en «Reintento solicitado. GoCardless confirmará la nueva fecha de cargo.».
- Lleva la cuenta: GoCardless admite como mucho 3 reintentos por pago («Payments can be retried up to 3 times.»), y el conector cuenta también los de Success+ en «Reintentos de GoCardless».
¿Un AM04 cancela el mandato del cliente?
No. La causa insufficient_funds no está entre las que hacen que el conector archive el mandato, que son mandate_cancelled, bank_account_closed, mandate_expired y authorisation_disputed. El cliente sigue teniendo su método de pago para la próxima factura.
¿Por qué Success+ no reintenta todos los fallos?
Porque su guía lo limita a los pagos sin fondos: en SEPA, AM04 y, solo en cinco países, MS03. Un cliente que rechaza el cobro o una cuenta cerrada no se arreglan presentando el adeudo otra vez. El conector no lo decide: sigue el campo will_attempt_retry de cada fallo.

Con nuestro conector
El conector de GoCardless para Odoo 17, 18, 19 y 20 traduce el evento en algo que se puede gestionar desde la factura: deja la transacción pendiente mientras Success+ trabaja, la pasa a error y reabre la factura cuando ya no habrá reintento, y cuenta los reintentos para no ofrecerte uno que no toca. Lo que no puede hacer es poner dinero en la cuenta de tu cliente: si el AM04 se repite, la conversación con él es la que resuelve el cobro.
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
- docs.gocardless.com/docs/optimise/reduced-failed-payments-with-success-plus
- 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 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 260 en 17.0 (d203ee6), línea 260 en 18.0 (e2ab18b), línea 260 en 19.0 (ce7f5a3) y línea 271 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 746 en 17.0 (d203ee6), línea 746 en 18.0 (e2ab18b), línea 745 en 19.0 (ce7f5a3) y línea 769 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 732 en 17.0 (d203ee6), línea 732 en 18.0 (e2ab18b), línea 731 en 19.0 (ce7f5a3) y línea 755 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_transaction.py, línea 680 en 17.0 (d203ee6), línea 680 en 18.0 (e2ab18b), línea 679 en 19.0 (ce7f5a3) y línea 703 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 430 en 17.0 (d203ee6), línea 430 en 18.0 (e2ab18b), línea 429 en 19.0 (ce7f5a3) y línea 444 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: const.py, línea 119 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 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)
- Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 484 en 17.0 (d203ee6), línea 484 en 18.0 (e2ab18b), línea 483 en 19.0 (ce7f5a3) y línea 502 en 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: 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 22 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 27 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 28 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/payment/views/payment_transaction_views.xml
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/es.po
- 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 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 765 en 17.0 (d203ee6), línea 765 en 18.0 (e2ab18b), línea 765 en 19.0 (ce7f5a3) y línea 776 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 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 432 en 17.0 (d203ee6), línea 432 en 18.0 (e2ab18b), línea 432 en 19.0 (ce7f5a3) y línea 437 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)
- 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/17.0/odoo/http.py
- github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
