Saltar al contenido principal
GoCardless API · gocardless · 500 · 504

GoCardless internal_server_error y request_timed_out: el fallo está en GoCardless

A veces el problema no está en tu petición ni en tu cliente, sino en GoCardless: un fallo interno (500) o una petición que no termina a tiempo (504). El conector de Odoo no repite esas peticiones por su cuenta, y deja el cobro en error con el request_id. Lo importante después es no cobrar dos veces lo mismo.

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

Qué dice GoCardless

ReasonTipoTexto de GoCardless
internal_server_errorgocardlessAn internal error occurred. Report to support with request_id.
request_timed_outgocardlessRequest did not complete in time. Retry, report if persistent.

GoCardless agrupa estos reasons en el tipo gocardless, el de los errores que se producen dentro de GoCardless: «These errors occurred within GoCardless while processing your request.». Su tabla de códigos HTTP dice esto de los dos códigos:

HTTPTexto de GoCardless
500Server-side error. Retry, and report to support with the request_id if it persists.
504Request timed out. Retry, and report with request_id if it persists.

En la página de límites, GoCardless fija además cuánto puede durar una petición: 29 segundos («Request timeout 29 seconds»).

Tarjeta del error internal_server_error de GoCardless
El reason de un fallo interno de GoCardless, los códigos HTTP 500 y 504, request_timed_out y el request_id.

Tres casos que el conector no trata igual

El conector espera la respuesta de GoCardless hasta 30 segundos en cada petición. Con un cobro, un reembolso o un reintento, Odoo puede encontrarse con tres situaciones distintas:

  • GoCardless contesta con un 500 o un 504, con el reason en la respuesta.
  • GoCardless no contesta: la conexión se corta o se acaban los 30 segundos.
  • El fallo llega al aplicar un evento, cuando el conector pide a GoCardless el pago del que habla el evento.

Lo que hace el conector

Con un 500 o un 504. El conector solo repite una petición cuando se queda sin respuesta o después de un 429. Con un 500 o un 504 sí hay respuesta, así que la da por rechazada. En un cobro, la transacción pasa a «Error» con «GoCardless rechazó la solicitud.» y, debajo, el mensaje de GoCardless con el reason y el request_id entre corchetes. La tarea de cada hora no reenvía una transacción en error. Si GoCardless llegara a crear el cobro de todos modos, su primer evento lo enlaza: cada cobro lleva en sus metadatos la referencia de la transacción de Odoo, el conector la busca con ella y le aplica el estado del pago. Una transacción en error vuelve así a «Pendiente» o pasa a «Confirmado».

Sin respuesta. El conector repite la petición una vez, con la misma clave de idempotencia. Si tampoco contesta nadie, no da el cobro por perdido: la transacción queda pendiente con «GoCardless no respondió, así que aún no se sabe si aceptó la solicitud. Se volverá a enviar, de forma segura, en menos de una hora.». La tarea de cada hora la vuelve a mandar con la misma clave; si GoCardless ya la había creado, contesta 409 y el conector adopta lo que ya existe.

Al aplicar un evento. Con cada evento de un pago, el conector pide ese pago a GoCardless. Si esa consulta falla, el webhook contesta 500 para que GoCardless vuelva a mandar el envío, y los eventos que ya se aplicaron no se aplican dos veces. La recuperación de cada hora tampoco deja atrás un evento que falló.

Los mensajes de un cobro salen en el idioma de quien lo lanza. Si lo lanza una tarea programada, como la renovación de una suscripción o el reenvío del propio conector, se escriben sin nadie delante: en una base de datos creada en castellano salen así, y en una creada en inglés y pasada después a castellano, en inglés: «GoCardless rejected the request.» y «GoCardless did not answer, so it is not known yet whether it took the request. It will be sent again, safely, within the hour.».

Esquema: qué manda GoCardless con un 500 o un 504 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 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. Si el mensaje nombra internal_server_error o request_timed_out, el fallo fue de GoCardless, no del cliente ni de su mandato.
  2. Antes de volver a cobrar la factura, busca el cobro en el Dashboard de GoCardless: el conector pone como descripción de cada cobro la referencia de su transacción de Odoo. Si está, no cobres otra vez; su evento enlazará la transacción.
  3. Si no está, vuelve a cobrar la factura con el método de pago guardado del cliente. Un cobro nuevo es otra transacción, con otra clave de idempotencia: por eso conviene mirar antes.
  4. Si se repite, escribe al soporte de GoCardless con el request_id del mensaje: su documentación pide incluirlo al contactar con su soporte.

¿Por qué el conector no reintenta un 500 como hace sin respuesta?

Porque solo repite a ciegas lo que se puede repetir sin riesgo: una petición sin respuesta, con la misma clave, o una que recibió un 429 (según GoCardless, esas se pueden repetir sin problema). Un 500 o un 504 es una respuesta, y el conector la trata como un rechazo.

¿Puede quedar un cobro duplicado?

Con la misma clave, no: GoCardless contesta con un 409 y el conector adopta el cobro que ya existe. El riesgo está en cobrar otra vez desde la factura, porque eso crea otra transacción con otra clave. Por eso conviene buscar antes el cobro en el Dashboard.

Con nuestro conector

En Odoo 17, 18, 19 y 20 el conector separa un error de GoCardless de una petición sin respuesta: el primero queda en error con su request_id, la segunda queda pendiente y se reenvía con la misma clave, y en los dos casos el evento de un cobro que sí existe lo enlaza con su transacción.

Sigue leyendo

GoCardless 409 idempotent_creation_conflict: el cobro ya existíaGoCardless devuelve 409 idempotent_creation_conflict si una clave de idempotencia ya creó algo. Por qué no es un fallo y cómo evita el conector un doble cobro.GoCardless 429 rate_limit_exceeded: demasiadas peticiones por minutoGoCardless responde 429 rate_limit_exceeded al pasar de 1.600 peticiones por minuto. Cómo espera y repite el conector y qué hacer si vuelve a fallar.GoCardless access_token_revoked: Odoo ya no puede hablar con tu cuentaGoCardless rechaza con access_token_revoked, access_token_not_active o unauthorized las peticiones de un token muerto. Qué hace Odoo y cómo reconectar.
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/limits
  • Código del módulo: flexigo_payment_gocardless: models/payment_provider.py, línea 361 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 394 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 357 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 373 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 478 en 17.0 (d203ee6), línea 478 en 18.0 (e2ab18b), línea 478 en 19.0 (ce7f5a3) y línea 483 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 30 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 299 en 17.0 (d203ee6), línea 299 en 18.0 (e2ab18b), línea 299 en 19.0 (ce7f5a3) y línea 310 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: models/payment_provider.py, línea 391 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 68 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 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 281 en 17.0 (d203ee6), línea 281 en 18.0 (e2ab18b), línea 281 en 19.0 (ce7f5a3) y línea 292 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 258 en 17.0 (d203ee6), línea 258 en 18.0 (e2ab18b), línea 258 en 19.0 (ce7f5a3) y línea 269 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 115 en 17.0 (d203ee6), línea 115 en 18.0 (e2ab18b), línea 115 en 19.0 (ce7f5a3) y línea 118 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 572 en 17.0 (d203ee6), línea 572 en 18.0 (e2ab18b), línea 571 en 19.0 (ce7f5a3) y línea 590 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 697 en 17.0 (d203ee6), línea 697 en 18.0 (e2ab18b), línea 696 en 19.0 (ce7f5a3) y línea 720 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: models/payment_provider.py, línea 623 en 17.0 (d203ee6), línea 623 en 18.0 (e2ab18b), línea 623 en 19.0 (ce7f5a3) y línea 625 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 589 en 17.0 (d203ee6), línea 589 en 18.0 (e2ab18b), línea 588 en 19.0 (ce7f5a3) y línea 607 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: controllers/main.py, línea 124 en 17.0 (d203ee6), línea 124 en 18.0 (e2ab18b), línea 124 en 19.0 (ce7f5a3) y línea 127 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: models/payment_provider.py, línea 603 en 17.0 (d203ee6), línea 603 en 18.0 (e2ab18b), línea 603 en 19.0 (ce7f5a3) y línea 605 en 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)