Lo que suele pasar
- Se hace escritura lenta al destino antes de responder.
- Se valida la firma y luego se ejecutan multiples llamadas externas en linea.
- No hay cola o worker interno del lado receptor.
Operacion
La mayoria de fallos cae en unos pocos patrones: configuracion incompleta, firma mal validada, endpoint lento, dedupe ausente o confusion entre la ruta org-level y la via legacy.
Diagnostico rapido
| Sintoma | Causa probable | Primer chequeo |
|---|---|---|
| No llega ningun webhook | Webhook apagado, URL vacia o usuario sin organizacion | Revisar `webhookEnabled`, `webhookUrl`, `webhookSecret` y `organizationId` |
| Llega `record.created` pero no `expedient.completed` | `webhookEvents` sin `expedient.completed` o no se dio la transicion correcta | Revisar array de eventos y condiciones de `onExpedientWrite` |
| Firma invalida | Body mutado antes de validar o secret incorrecto | Comparar raw body, header y secret exacto |
| Duplicados en el destino | Falta de idempotencia en el receptor | Persistir `event + id` como llave de dedupe |
| El destino marca timeouts | Respuesta despues de 5 segundos | Responder `2xx` antes y procesar asincronamente |
| Payload distinto al esperado | Se esta leyendo la ruta legacy en vez del org-level | Buscar `eventId/eventType/data` para detectar envelope legacy |
Caso 1
Caso 2
El framework parsea JSON y luego se vuelve a serializar para calcular HMAC. Ese body ya no coincide byte a byte con el original.
Loguea por separado `x-kapture-signature`, longitud del raw body y digest calculado localmente para comparar.
Caso 3
La estrategia segura es que el receptor siempre sea idempotente. La forma minima es guardar `event:id` y rechazar o ignorar repeticiones.
Caso 4
Caso 5
| Senal | Org-level | Legacy |
|---|---|---|
| Body | Payload publico directo | Envelope con `eventId`, `eventType`, `timestamp`, `data` |
| User-Agent | `Kapture-Webhooks/1.0` | `Kapture-Webhook-Bot/1.0` |
| Config fuente | `organizations/{orgId}` | `users/{userId}/integrations/{integrationId}` |
| Evento legacy disponible | N/A | Solo `expedient.completed` |
Soporte