Saltar al contenido principal
GoCardless · webhooks

Webhook de GoCardless: 498 Token Invalid, 204 y la firma Webhook-Signature

Los eventos de GoCardless llegan a Odoo por un webhook firmado, y la respuesta de Odoo le dice a GoCardless si debe volver a intentarlo. Dos códigos tienen un significado especial: 498 para una firma que no cuadra y 204 para un evento que no se reconoce. Con los dos, GoCardless deja de reintentar.

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

Qué dice GoCardless

RespuestaTexto de GoCardless
498 Token InvalidSignature verification failed. GoCardless will log this and not retry.
204 No ContentEvent type is not recognised. GoCardless will not retry.

Cualquier otra respuesta que no sea 2xx hace que GoCardless vuelva a intentarlo: 9 intentos de entrega en total, el primero más 8 reintentos, cada vez más espaciados. Además, espera la respuesta como mucho 10 segundos.

Tarjeta de las respuestas 498 y 204 al webhook de GoCardless
Los dos códigos que paran los reintentos de GoCardless y el texto con el que los documenta.

Cómo se comprueba la firma

GoCardless firma cada envío con un HMAC SHA256 en hexadecimal del cuerpo tal cual, con el secreto del endpoint, y lo manda en la cabecera Webhook-Signature. Si el secreto que tiene Odoo no es el del endpoint, ninguna firma cuadra. Pasa al copiar mal el secreto, al regenerarlo en el Dashboard sin actualizarlo en Odoo, o al mandar a un Odoo los eventos de otra cuenta.

El conector no se queda con la primera configuración de GoCardless que encuentra: busca la que tiene el secreto que firma ese envío. Así, una configuración de pruebas olvidada no rechaza los eventos reales.

Qué contesta Odoo con el conector

SituaciónOdoo 17, 18 y 19Odoo 20
Ningún secreto cuadra con la firma498401
Firma buena, ningún evento es suyo204204
Eventos aplicados200200

La diferencia de Odoo 20 no es una elección del conector: su servidor HTTP no deja contestar un código que no sea estándar, y 498 no lo es. Lo que pasa después depende de cómo llegan los eventos. En el modo avanzado van directos de GoCardless a Odoo: con 401, GoCardless reintenta un envío que seguirá sin cuadrar, y un secreto mal puesto se nota como una serie de reintentos fallidos en el Dashboard de GoCardless. Con la conexión en dos clics llegan a través de FlexigoTech Cloud, que trata ese 401 como final, igual que un 498.

Si un evento no llega

GoCardless garantiza que cada evento llega al menos una vez, no exactamente una: puede repetirse. El conector guarda cada evento que aplica, uno por evento y por configuración de GoCardless, y si el mismo llega otra vez no lo aplica dos veces. Esto importa con el dinero: un pago confirmado dos veces no debe registrar dos cobros en la factura. Y si un evento se pierde, la tarea programada que cada hora pide a GoCardless los eventos que faltan lo recupera, hasta 100 por pasada.

Qué hacer

  1. Si usas la conexión en dos clics («Conectar mi cuenta de GoCardless»), los webhooks los monta FlexigoTech Cloud: no hay secreto que copiar.
  2. En el modo avanzado («Pegar un token de acceso (avanzado)»), el endpoint y su secreto los creas tú en el Dashboard de GoCardless: copia el secreto exacto en la configuración de GoCardless en Odoo.
  3. Si regeneras el secreto, actualízalo en Odoo enseguida; hasta entonces, cada envío fallará.
  4. Revisa en el Dashboard de GoCardless los envíos fallidos: desde allí se pueden relanzar a mano.
Esquema: qué manda GoCardless al webhook y qué contesta 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.

¿Por qué no contestar 500 cuando la firma falla?

Porque GoCardless reintentaría un envío que nunca va a cuadrar. El 498 le dice que pare; en Odoo 20, donde no se puede mandar, el conector contesta 401, y a través de FlexigoTech Cloud ese 401 también cuenta como final.

Con nuestro conector

En Odoo 17, 18, 19 y 20 el conector comprueba la firma de cada envío contra el secreto de cada configuración de GoCardless, contesta con los códigos que GoCardless entiende y, por si algo se pierde, recupera los eventos cada hora.

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.Error mandate_is_inactive de GoCardless al crear un cobro desde OdooGoCardless responde mandate_is_inactive al crear un pago con un mandato cancelado, fallido o caducado. Por qué pasa y cómo lo resuelve el conector en Odoo.GoCardless invalid_bank_details: AC01 y BE06, la cuenta indicada no existeGoCardless invalid_bank_details con AC01 o BE06: la cuenta del mandato no existe. Por qué llega en el pago y en el mandato, y qué hace Odoo con 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/webhooks
  • Código del módulo: flexigo_payment_gocardless: models/gocardless_webhook_event.py, línea 7 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: controllers/main.py, línea 110 en 17.0 (d203ee6), 18.0 (e2ab18b) y 19.0 (ce7f5a3)
  • Código del módulo: flexigo_payment_gocardless: controllers/main.py, línea 113 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: controllers/main.py, línea 128 en 17.0 (d203ee6), línea 128 en 18.0 (e2ab18b), línea 128 en 19.0 (ce7f5a3) y línea 131 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: controllers/main.py, línea 103 en 17.0 (d203ee6), línea 103 en 18.0 (e2ab18b), línea 103 en 19.0 (ce7f5a3) y línea 106 en 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)
  • Código del módulo: flexigo_payment_gocardless: models/payment_provider.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: __manifest__.py, línea 6 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: models/payment_token.py, línea 83 en 17.0 (d203ee6), línea 83 en 18.0 (e2ab18b), línea 83 en 19.0 (ce7f5a3) y línea 82 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/api-reference/responses-and-errors
  • Código del módulo: flexigo_payment_gocardless: controllers/main.py, línea 95 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 958 en 17.0 (d203ee6), línea 958 en 18.0 (e2ab18b), línea 958 en 19.0 (ce7f5a3) y línea 979 en 20.0 (688d86b)
  • Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 153 en 17.0 (d203ee6), línea 153 en 18.0 (e2ab18b), línea 153 en 19.0 (ce7f5a3) y línea 158 en 20.0 (688d86b)