Entrega de webhooks
Webhook não recebido
Se o evento não chega, o problema geralmente está em rede, TLS ou tempo de resposta do seu endpoint.
Diagnóstico:
- Confirmar que o endpoint está público e acessível externamente.
- Validar certificado TLS e cadeia completa.
- Verificar se a resposta está retornando
2xx rapidamente.
Correção:
- Retornar ACK rápido e processar de forma assíncrona.
- Corrigir SSL/rota pública.
- Monitorar taxa de erro e latência no receptor.
Webhook duplicado
Duplicidade costuma acontecer por reentrega após timeout/falha transitória. Por isso, o consumo precisa ser idempotente.
Use o campo uuid do payload como chave de idempotência: ele é preservado nas reentregas do mesmo aviso. No exemplo, event_id é a coluna local que armazena esse UUID.
CREATE UNIQUE INDEX idx_webhook_evento_unico
ON webhooks_recebidos (event_id);
// Pseudocódigo: a inserção e os efeitos locais usam a mesma transação.
await banco.transaction(async (transacao) => {
// Inserção atômica pela chave única; retorna false apenas se já existe.
const novo = await registrarEventoSeAusente(transacao, payload.uuid);
if (!novo) return;
await processarEventoLocal(transacao, payload);
});
return ok();
Se o processamento falhar, a transação deve reverter também o registro do evento, permitindo nova tentativa. Responda com sucesso somente após o commit. Para processamento demorado ou efeitos externos, persista o evento em uma fila durável antes de confirmar o recebimento; o consumidor precisa controlar tentativas e idempotência desses efeitos. Uma transação local não desfaz chamadas externas.