Se você desenvolve no CRM daHubSpot por tempo suficiente, cedo ou tarde esbarra no mesmo trio de problemas: retentativas (retries), duplicidades e visibilidade. Webhooks do HubSpot são poderosos, mas a diferença entre uma integração frágil e outra à prova de bala está em como você projeta idempotência, backoff, filas/DLQ e observabilidade.
Este guia foca em webhooks do HubSpot em duas direções:
Vamos cobrir as peças móveis, trazer exemplos de código práticos e mostrar padrões que “sobrevivem a falhas” sem vazar duplicidades ou perder eventos.
Crie um app público ou privado e assine eventos de objetos do CRM (por exemplo, contact.creation, deal.propertyChange). O HubSpot envia lotes de eventos em JSON para sua URL alvo sempre que os eventos assinados ocorrem. Excelente para streaming do CRM para seu data plane ou middleware.
Comportamento de entrega. O HubSpot reitenta entregas que falham na Webhooks API em até 10 vezes ao longo de ~24 horas, com atrasos randomizados para reduzir “thundering herds”. Essa mudança foi introduzida para melhorar a confiabilidade e suavizar picos de retentativas.
Características do payload. As mensagens incluem identificadores como eventId, subscriptionId, portalId, objectId e um contador attemptNumber — úteis para idempotência e diagnóstico. (A documentação do HubSpot referencia eventId e attemptNumber nas tabelas de payload do webhook.)
Dentro de um workflow, adicione Enviar um webhook e selecione POST ou GET. Você pode incluir todas as propriedades ou customizar o corpo com campos específicos (mais valores estáticos), além de escolher a autenticação (cabeçalho de assinatura de requisição usando um App ID, ou um API key/cabeçalho). Há também uma configuração de rate limit (BETA) para estrangular execuções.
Lógica de retentativa do workflow. Se seu endpoint falhar, o HubSpot reitenta por até três dias, começando ~1 minuto após a primeira falha, com intervalos crescentes (máximo de 8 horas entre tentativas). Workflows não reintentam em respostas 4xx, exceto 429 (seguem o cabeçalho Retry-After em milissegundos). Isso é crítico para seu plano de tratamento de erros.
Agora é possível inscrever registros quando o HubSpot recebe um webhook de um sistema de terceiros. Você define uma propriedade de correspondência única e mapeia campos do JSON recebido; o content-type deve ser application/json. Isso fecha o ciclo para webhooks entrantes que disparam automações no HubSpot.
Para requisições saindo do HubSpot (HubSpot ➜ você), o HubSpot assina com v3, usando os cabeçalhos X-HubSpot-Signature-v3 e X-HubSpot-Request-Timestamp. A verificação é direta:
O Enviar um webhook de Workflows também pode anexar um cabeçalho de assinatura (você informa o App ID, então verifica com o segredo do app no seu servidor).
A regra de ouro: processar cada evento exatamente uma vez — mesmo quando o HubSpot reenviar ou seu código rodar duas vezes.
Onde ancorar chaves de idempotência:
O HubSpot referencia um attempt ID derivado de subscriptionId + eventId + attemptNumber no monitoramento; ainda assim, sua idempotência deve se basear em eventId.
Padrão de armazenamento. Mantenha um store rápido (Redis, DynamoDB, Postgres com índice único) de eventId processados. Insira no primeiro processamento bem-sucedido; em duplicatas, acuse recebimento e pule.
Segurança a jusante. Se seu handler cria/atualiza registros em outros sistemas, faça essas chamadas idempotentes também (por exemplo, upserts por uma chave natural como email ou um ID externo) para evitar efeitos colaterais duplicados nos seus sistemas.
Workflows (HubSpot ➜ seu endpoint)
Webhooks API (assinaturas de app) (HubSpot ➜ seu endpoint)
Suas retentativas (seu receiver ➜ HubSpot/outros serviços)
Se seu receiver chamar APIs do HubSpot ou de terceiros, adote exponential backoff com jitter do seu lado e evite loops de feedback. Respeite a semântica de HTTP 429 do HubSpot se re‑chamar a API a partir do handler.
Padrão: ack rápido ➜ fila ➜ worker ➜ DLQ (dead‑letter queue)
O que isso te dá:
Reprocessamento (você pode replay a partir do DLQ/arquivos sem pedir reenvio ao HubSpot).
Adapte para qualquer stack; o ponto é o formato, não a lib específica.
Por que funciona: eventId é sua chave de idempotência; attemptNumber é telemetria. O HubSpot assina com v3, então tráfego antigo ou adulterado é descartado. Lotes são suportados iterando o array antes de enfileirar.
Ao enviar webhooks a partir de um workflow:
Retentativas: até 3 dias; sem retentativa em 4xx (exceto 429, respeitando Retry‑After). Projete seu receiver considerando isso.
Exemplo de corpo (customizado) para webhook de Negócio/Deal:
Playbook de integração (exemplo OMS):
Ação: chamar /orders/upsert idempotente no OMS.
Configuração no HubSpot
Receiver
Observabilidade
Alerta para picos de 429 e falhas 5xx.
Os webhooks do HubSpot sempre enviam o objeto completo?
Webhooks de Workflow podem incluir todas as propriedades (do tipo do objeto) ou seu corpo customizado; seja intencional para evitar payloads pesados. Webhooks de assinaturas de app enviam payloads focados no evento (você pode buscar mais via API usando objectId).
Os webhooks chegam em ordem?
Não conte com ordem estrita. Preserve ordem você mesmo se precisar (ex.: filas FIFO por objeto) e faça handlers idempotentes.
Projetar webhooks confiáveis no HubSpot não é “colocar uma URL e torcer”. É:
Faça isso e suas integrações vão sobreviver às falhas — sem duplicidades, eventos perdidos ou panes misteriosas.
Pro tip #1: trate “webhooks do HubSpot” na sua documentação interna e mensagens de commit como você trataria uma API — nomes claros, contratos explícitos e um plano para o dia em que algo sair do trilho. Seu “eu do futuro” agradece.
Pro tip #2: com webhooks do HubSpot, também é possível disparar ações com base em valores de propriedades. Cada evento entregue inclui atributos como propertyName e propertyValue. Validando esses valores contra requisitos específicos, você consegue acender sua cadeia de regras de negócio e garantir que sistemas a jusante reajam apenas quando as condições certas forem atendidas.