Skip to main content

Garantia de entrega

A entrega é at-least-once: o mesmo evento pode chegar mais de uma vez em falha de rede, timeout ou reenvio manual. Seu sistema precisa ser idempotente — use o campo id do evento para descartar duplicatas.
Guarde os ids em armazenamento persistente (Redis, Postgres). Um Set em memória some no restart e a deduplicação vai junto.

Timeout e resposta esperada

A SocialSell aguarda 10 segundos. Passou disso, a entrega conta como falha e entra na fila de retentativa.
  • Sucesso: qualquer 2xx (200, 201, 202, 204).
  • Falha: qualquer outro status, timeout ou erro de conexão.
  • Redirects não são seguidos. Um 3xx conta como falha — um 302 apontando para IP interno seria um caminho de SSRF, então a requisição para ali.
Responda 200 imediatamente e processe em background (BullMQ, Celery, SQS). Processar antes de responder é a causa nº 1 de timeout em integração de webhook.

Retentativas

Cada entrega tem até 5 tentativas, com backoff exponencial de base 60 segundos: Depois da 5ª, a entrega é marcada como failed e conta uma falha para a assinatura.
A janela total de recuperação automática é de cerca de 15 minutos. Se o seu endpoint fica fora por mais tempo que isso, use o reenvio manual depois de restabelecer o serviço — o log guarda as entregas dos últimos 15 dias.

Cadência por organização

Para que um volume grande de uma organização não atrase as entregas das outras, cada organização tem uma cadência própria: 100 entregas por minuto. O que passa disso não é descartado — ganha um atraso e sai em seguida, na ordem. Uma importação de 5.000 contatos, por exemplo, é entregue ao longo de cerca de 50 minutos, e nesse meio-tempo os webhooks de outras organizações seguem saindo normalmente.
Reenvio manual e evento de teste não entram nessa cadência: são ações pontuais e saem na hora.

Pausa automática

Depois de 10 falhas consecutivas (10 entregas que esgotaram as 5 tentativas), a assinatura é pausada automaticamente e a organização recebe uma notificação no painel. Uma entrega bem-sucedida zera o contador. A assinatura também é pausada se o plano da organização deixar de incluir o módulo Webhooks ou tiver o limite de endpoints reduzido a zero. Para reativar, corrija o endpoint e mande:
Reativar zera o contador de falhas.

Acompanhando a saúde

O objeto da assinatura traz o estado atual:

Log de entregas

Toda entrega fica registrada por 15 dias, com o payload enviado e cada tentativa:
O log guarda o payload completo, que inclui dados pessoais do contato. Ele é apagado automaticamente após 15 dias.

Reenvio manual

Qualquer entrega do log pode ser reenviada. O reenvio cria um novo ciclo — com as 5 tentativas — usando o payload original, e aponta para a entrega de origem em redelivery_of:
O id do evento é preservado — do seu lado, a deduplicação por id continua funcionando e um reenvio não vira registro duplicado.
Reenvio exige assinatura ativa. Endpoint pausado devolve 409 WEBHOOK_PAUSED.

Ordem de entrega

Eventos são despachados na ordem em que acontecem, mas a ordem de chegada não é garantida — retentativas e concorrência entre entregas reordenam. Não assuma sequência: use o created_at do evento para reconstruir a linha do tempo e descarte atualizações mais velhas que o estado que você já tem.

Testando durante o desenvolvimento

A URL precisa ser HTTPS pública. Para receber localmente, exponha sua máquina com um túnel:
Use a URL gerada como endpoint da assinatura. Para conferir a validação sem escrever código, o endpoint POST /v1/webhooks/{id}/test dispara uma entrega assinada de verdade e devolve na hora o status HTTP e a duração do seu endpoint.