Qué dice GoCardless
| Respuesta | Texto de GoCardless |
|---|---|
| 498 Token Invalid | Signature verification failed. GoCardless will log this and not retry. |
| 204 No Content | Event 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.

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ón | Odoo 17, 18 y 19 | Odoo 20 |
|---|---|---|
| Ningún secreto cuadra con la firma | 498 | 401 |
| Firma buena, ningún evento es suyo | 204 | 204 |
| Eventos aplicados | 200 | 200 |
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
- Si usas la conexión en dos clics («Conectar mi cuenta de GoCardless»), los webhooks los monta FlexigoTech Cloud: no hay secreto que copiar.
- 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.
- Si regeneras el secreto, actualízalo en Odoo enseguida; hasta entonces, cada envío fallará.
- Revisa en el Dashboard de GoCardless los envíos fallidos: desde allí se pueden relanzar a mano.

¿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
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)
