Saltar al contenido principal
GoCardless API · invalid_state · reembolsos

GoCardless refund_payment_invalid_state: ese cobro aún no se puede reembolsar

Un reembolso de GoCardless devuelve al cliente el dinero de un cobro, y GoCardless solo lo acepta si ese cobro está confirmado o ya liquidado. Si no, responde refund_payment_invalid_state. Además, GoCardless tiene un periodo de reembolso seguro de 7 días naturales, y el conector de Odoo añade su propia regla de 2 días.

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

Qué dice GoCardless

ReasonTipoTexto de GoCardless
refund_payment_invalid_stateinvalid_statePayment must be confirmed or paid_out before it can be refunded.

En la referencia de los reembolsos, GoCardless añade un plazo: «A refund can only be created once it is outside the safer refund period (7 calendar days after the charge date) otherwise an error is returned.». Ese periodo se puede quitar: «The safer refund period can be disabled by contacting GoCardless.». Y recuerda por qué existe: «A payment that has been (partially) refunded can still receive a late failure or chargeback from the customer's bank.».

Los reembolsos por la API, además, vienen apagados: «This endpoint is disabled by default. To enable it, you will need to enable refunds on your GoCardless Dashboard.».

Tarjeta del error refund_payment_invalid_state de GoCardless
El reason, su tipo invalid_state y los estados confirmed y paid_out que pide GoCardless para reembolsar.

Las reglas de plazo, de un vistazo

Días desde el cobroGoCardless, por defectoEl conector
Menos de 2dentro del periodo seguro: devuelve un errorno manda el reembolso
2 o más, pero menos de 7dentro del periodo seguro: devuelve un errorlo manda y deja un aviso en el registro del servidor
7 o másfuera del periodo segurolo manda

Los dos no cuentan desde el mismo sitio. GoCardless cuenta desde la fecha de cargo del pago. El conector cuenta desde el último cambio de estado de la transacción del cobro en Odoo. Si GoCardless te ha quitado el periodo seguro, entre 2 y 7 días el reembolso puede salir adelante.

Cuándo sale refund_payment_invalid_state con el conector

Odoo solo deja reembolsar una transacción confirmada, y el conector la confirma cuando GoCardless dice confirmed o paid_out. Así que, con el conector, este reason quiere decir que el pago ha cambiado en GoCardless y Odoo todavía no lo sabe: un fallo tardío, que GoCardless puede comunicar con el pago ya confirmado, o una devolución del cliente cuyo evento aún no ha llegado.

Lo que hace el conector

  1. Con menos de 2 días, no manda nada: Odoo para con «GoCardless no puede reembolsar un cobro hasta que se haya liquidado. Este se cargó hace … día(s); se puede reembolsar a partir de 2 días.».
  2. Si no, manda el reembolso a GoCardless con su clave de idempotencia. Si GoCardless lo rechaza, por este reason, por el periodo seguro o por cualquier otro motivo, la transacción del reembolso pasa a «Error» con «GoCardless rechazó la solicitud.» y, debajo, el mensaje de GoCardless con el reason y el request_id.
  3. Si lo acepta, la transacción queda en «Pendiente» con «Reembolso enviado. GoCardless lo descontará de una liquidación futura.», y pasa a «Confirmado» cuando GoCardless lo paga o lo descuenta de una liquidación.

Desde la versión 1.1.5, un reembolso en error no enseña el botón «Reintentar el cobro»: un reembolso no es un cobro, y no hay nada que GoCardless pueda reintentar. Si GoCardless no consigue que el dinero llegue al cliente, el conector pasa el reembolso a error con «GoCardless no pudo devolver este reembolso (…).». Ese texto lo escribe al aplicar el evento, sin nadie delante: en una base de datos creada en castellano sale así, y en una creada en inglés y pasada después a castellano, en inglés: «GoCardless could not pay this refund back (…).».

Esquema: qué responde GoCardless al reembolsar 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.

Qué hacer

  1. Abre la transacción del cobro 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. Desde ella, el botón de reembolsos lleva a la transacción del reembolso y a su mensaje.
  2. Si el reason es refund_payment_invalid_state, mira el pago en el Dashboard de GoCardless. Si falló tarde o el cliente lo devolvió, no hay nada que reembolsar: el dinero ya no está contigo. Odoo lo reflejará cuando llegue el evento; la tarea que cada hora recupera los eventos perdidos lo trae.
  3. Si el rechazo viene del periodo seguro, espera a que pasen 7 días desde la fecha de cargo, o pide a GoCardless que lo quite.
  4. Para reembolsar otra vez, hazlo desde el pago del cobro, con su botón de reembolso. El conector admite reembolsos parciales.

¿Por qué el conector deja reembolsar desde los 2 días si GoCardless habla de 7?

Los 2 días son el mínimo del conector: por debajo no manda nada. GoCardless permite quitar su periodo seguro, y mientras está activo es GoCardless quien rechaza el reembolso antes de 7 días. Entre 2 y 7 días el conector avisa en el registro, porque un fallo SEPA todavía puede llegar.

¿Un cobro reembolsado puede fallar después?

Sí. GoCardless lo advierte: un pago reembolsado, del todo o en parte, todavía puede recibir un fallo tardío o una devolución del banco del cliente. En ese caso habrías devuelto un dinero que no llegaste a quedarte.

Con nuestro conector

En Odoo 17, 18, 19 y 20 el conector no manda reembolsos de cobros de menos de 2 días, deja en error con su request_id los que GoCardless rechaza y no ofrece reintentar un reembolso, que no es un cobro.

Sigue leyendo

GoCardless total_amount_confirmation_invalid: el total reembolsado no cuadraGoCardless rechaza un reembolso con total_amount_confirmation_invalid si el total reembolsado no cuadra, o con number_of_refunds_exceeded tras 5.GoCardless MD06: el cliente pide a su banco que le devuelva un cobroEl cliente pide a su banco que le devuelva un adeudo de GoCardless: charged_back, refund_requested y MD06. Qué pasa en Odoo con la factura y el mandato.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.
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/responses-and-errors
  • docs.gocardless.com/docs/api-reference/refund
  • support.gocardless.com/hc/en-gb/articles/360001467265
  • Código del módulo: flexigo_payment_gocardless: const.py, línea 41 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
  • github.com/odoo/odoo/blob/20.0/addons/payment/models/payment_transaction.py
  • github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_payment_views.xml
  • Código del módulo: flexigo_payment_gocardless: models/payment_provider.py, línea 256 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 106 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 361 en 17.0 (d203ee6), línea 361 en 18.0 (e2ab18b), línea 360 en 19.0 (ce7f5a3) y línea 375 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 365 en 17.0 (d203ee6), línea 365 en 18.0 (e2ab18b), línea 364 en 19.0 (ce7f5a3) y línea 379 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 440 en 17.0 (d203ee6), línea 440 en 18.0 (e2ab18b), línea 440 en 19.0 (ce7f5a3) y línea 445 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 371 en 17.0 (d203ee6), línea 371 en 18.0 (e2ab18b), línea 370 en 19.0 (ce7f5a3) y línea 385 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 397 en 17.0 (d203ee6), línea 397 en 18.0 (e2ab18b), línea 396 en 19.0 (ce7f5a3) y línea 411 en 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_provider.py, línea 462 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 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)
  • Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 413 en 17.0 (d203ee6), línea 413 en 18.0 (e2ab18b), línea 412 en 19.0 (ce7f5a3) y línea 427 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 605 en 17.0 (d203ee6), línea 605 en 18.0 (e2ab18b), línea 604 en 19.0 (ce7f5a3) y línea 625 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: models/payment_provider.py, línea 352 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 1060 en 17.0 (d203ee6), línea 1060 en 18.0 (e2ab18b), línea 1060 en 19.0 (ce7f5a3) y línea 1081 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 611 en 17.0 (d203ee6), línea 611 en 18.0 (e2ab18b), línea 610 en 19.0 (ce7f5a3) y línea 631 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 470 en 17.0 (d203ee6), línea 470 en 18.0 (e2ab18b), línea 470 en 19.0 (ce7f5a3) y línea 475 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 424 en 17.0 (d203ee6), línea 424 en 18.0 (e2ab18b), línea 423 en 19.0 (ce7f5a3) y línea 438 en 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: 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: const.py, línea 117 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/account_payment/views/account_move_views.xml
  • github.com/odoo/odoo/blob/17.0/odoo/http.py
  • 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)