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 campoid 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
3xxconta como falha — um 302 apontando para IP interno seria um caminho de SSRF, então a requisição para ali.
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.
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: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 emredelivery_of:
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 ocreated_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: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.
