Webhooks
Receba eventos das conversas em tempo real no seu sistema — ou por e-mail.
O que são
Webhooks avisam o seu sistema quando algo acontece no Take Sales, sem você precisar ficar consultando a plataforma.
Configurando
- Acesse Webhooks no menu lateral
- Clique em Adicionar Webhook
- Escolha o tipo:
- Endpoint HTTP — Envia um POST para a sua URL
- E-mail — Notifica endereços de e-mail (até 10), com limite diário configurável
- Selecione os eventos
- Opcional: restrinja a agentes específicos (vazio = todos)
- Salve e use Enviar teste para validar
| Campo | Observação |
|---|---|
| URL | Precisa ser HTTPS; localhost não é aceito |
| Segredo | Mínimo de 16 caracteres; usado para assinar o payload (há um botão para gerar) |
| Nome do header de assinatura | Padrão X-Webhook-Signature |
| Ativo | Desligue para pausar sem perder a configuração |
Eventos disponíveis
| Evento | Quando dispara |
|---|---|
conversation.started | Uma nova conversa é iniciada |
conversation.ended | A conversa é finalizada (inclui mensagens e duração) |
lead.captured | O visitante fornece dados de contato |
visit.scheduled | Uma visita/reunião é agendada por integração |
sentiment.negative | A conversa é classificada como negativa |
visitor.identified | O visitante passa a ser identificado |
Eventos de tracking configurados no agente também podem ser enviados, com o nome no formato tracking.<nome_do_evento>.
Formato do payload
Todo webhook é um POST com JSON:
{
"event": "conversation.ended",
"timestamp": "2026-09-18T14:30:00.000Z",
"data": {
"conversation_id": "7c1f…",
"workspace_id": "H2609…",
"agent_id": "b1e5…",
"visitor_email": "joao@empresa.com",
"visitor_full_name": "João Silva",
"visitor_phone": "+5511999999999",
"started_at": "2026-09-18T14:22:10.000Z",
"ended_at": "2026-09-18T14:30:00.000Z",
"duration_seconds": 470,
"messages": [],
"visitor_info": {
"origin_url": "https://seusite.com/precos",
"referrer": "https://google.com",
"device": { "type": "desktop", "os": "macOS", "browser": "Chrome" },
"language": "pt-BR",
"timezone": "America/Sao_Paulo"
},
"extracted_variables": {}
}
}Campos como messages, visitor_contact_data, tracking_data e extracted_variables aparecem conforme o evento e o que foi coletado na conversa.
Headers
| Header | Conteúdo |
|---|---|
Content-Type | application/json |
X-Webhook-Event | Nome do evento |
X-Webhook-Timestamp | Mesmo timestamp do corpo |
X-Webhook-Signature | Assinatura HMAC (só quando há segredo; o nome do header é configurável) |
Verificando a assinatura
A assinatura é o HMAC-SHA256 do corpo bruto, em hexadecimal, usando o segredo cadastrado:
const crypto = require('crypto');
function verifyWebhook(rawBody, signature, secret) {
const expected = crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
// aceita tanto "<hex>" quanto "sha256=<hex>"
const received = signature.replace(/^sha256=/, '');
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(received));
}Use o corpo bruto (antes do parse JSON) no cálculo. Reserializar o objeto muda bytes e quebra a verificação. Os envios de teste feitos pelo painel prefixam a assinatura com sha256= — por isso o exemplo acima aceita os dois formatos.
Reenvio em caso de falha
Se o seu endpoint não responder com sucesso, a plataforma tenta novamente:
- Até 3 tentativas por evento
- Backoff exponencial entre elas (≈2s e ≈4s)
- Timeout de 10 segundos por tentativa
Depois disso o evento é descartado e a falha fica registrada.
Responda 200 o mais rápido possível e processe de forma assíncrona (fila). Endpoint lento vira timeout, timeout vira retry, e retry vira evento duplicado.
Idempotência
O mesmo evento pode chegar mais de uma vez. Use conversation_id + event + timestamp como chave de idempotência e ignore o que já foi processado.
Testando em desenvolvimento
ngrok
ngrok http 3000Use a URL gerada (HTTPS) como destino do webhook e dispare Enviar teste.
webhook.site
Para inspecionar o payload sem escrever código: copie a URL gerada em webhook.site, cadastre como destino e dispare um teste.
Depurando entregas com falha
- Confirme que a URL é pública e HTTPS com certificado válido
- Verifique o tempo de resposta — acima de 10s vira timeout
- Responda 2xx — qualquer outro status conta como falha
- Cheque a assinatura do seu lado antes de culpar o payload
- Confirme o filtro de agentes — o webhook pode estar restrito a outro agente
Ferramentas no-code
O fluxo é sempre o mesmo: a plataforma de automação gera uma URL e você a cadastra como destino.
- Make.com — cenário com o trigger "Webhook"
- Zapier — "Webhooks by Zapier (Catch Hook)"
- n8n — node "Webhook" como trigger
Para reagir a eventos dentro da plataforma (mandar e-mail, chamar uma API com template), considere Automações em vez de um webhook externo.

