PoC Validada • 34 Campos

Integração Zenvia → HubSpot

Guia completo: Chamada de API no bot Zenvia → HubSpot Forms API

PetLove • Portal 50501903 • PETLOVE-ZENVIA-001 • Versão 2.0 • 06/03/2026 • 34 campos
Elaborado por EPIC Digital • Para: Time Zenvia + PetLove

Índice

  1. Visão Geral & Comparação de Fluxos
  2. Arquitetura da Solução
  3. Configuração no Builder Zenvia (Passo a Passo)
  4. Endpoint & Configuração
  5. JSON Body Completo (34 campos)
  6. Mapeamento Variáveis Bot → HubSpot
  7. cURL de Teste (Postman-ready)
  8. Tratamento de Erros
  9. Workflow HubSpot
  10. Checklist de Implementação

1. Visão Geral

A integração permite que o bot da Zenvia envie dados de leads capturados via WhatsApp diretamente para o HubSpot CRM da PetLove, sem middleware, sem servidor externo e sem Operations Hub.

Comparação de Fluxos

Critério Fluxo A
Middleware
Fluxo B
Ops Hub Direto
Path C (Recomendado)
Forms API
Precisa Ops Hub? Não Sim (já contratado) Não
Precisa servidor? Sim (Node.js) Não Não
Contato novo? Cria Ignorado (necessita tratamento via código) Cria automaticamente
Autenticação? API key Webhook URL Nenhuma (público)
Tempo de dev (full) 46-60 dias úteis 15-25 dias úteis 15-20 dias úteis
Prazo V1 26/03/2026 (15 dias úteis) 26/03/2026 (15 dias úteis) 26/03/2026 (15 dias úteis)
Quem implementa? EPIC (código) EPIC (workflow) Time Zenvia/PetLove (builder) + EPIC (workflow)
Por que Forms API (Path C)? Workflows do HubSpot com trigger "When a webhook is received" só disparam para contatos que já existem no CRM. Contatos novos são ignorados silenciosamente. A Forms API resolve isso: cria o contato automaticamente, sem middleware, sem Ops Hub, sem autenticação. PoC validada em produção com 6 contatos criados com sucesso.
BLOCKER DE CRONOGRAMA — Token Zenvia API

O token fornecido pela PetLove (knWv****************************cyBp) retorna HTTP 401 (Unauthorized) ao testar contra a API v2 da Zenvia (GET https://api.zenvia.com/v2/subscriptions). Isso significa que:

  • O token pode estar expirado ou revogado
  • O token pode ter sido gerado para um ambiente/sandbox diferente do produção
  • O token pode não ter os escopos necessários (webhooks, subscriptions)
  • A conta Zenvia da PetLove pode estar em processo de migração (Conversion → Customer Cloud)

Impacto: Sem um token válido, não é possível configurar webhooks, validar subscriptions existentes, nem testar o fluxo end-to-end com dados reais.

Ação necessária: PetLove/Zenvia devem gerar um novo token válido em https://app.zenvia.com/home/api e compartilhar com a EPIC.
Responsável: Diogo Paulino (PetLove) / Anderson Casimiro (PetLove)
Deadline: Segunda-feira 10/03/2026 — bloqueio crítico para o cronograma V1 (26/03)

2. Arquitetura

💬
WhatsApp
Lead envia mensagem
🤖
Bot Zenvia
Coleta dados do lead
📤
Chamada de API
POST → Forms API
👤
Contato CRM
Criado ou atualizado
⚙️
Workflow
Deal + vendedor
Chamada de API no Zenvia Conversion A funcionalidade "Chamada de API" está disponível no Construtor do Bot do Zenvia (tanto Conversion quanto Customer Cloud). Suporta POST com URL, Headers e Body JSON customizáveis — exatamente o que a Forms API requer.
Documentação Zenvia: Chamada de API no conteúdo do Chatbot

3. Configuração no Builder Zenvia

Passo a passo para configurar a "Chamada de API" no Construtor do Bot da Zenvia Conversion.

1 Criar bloco "Enviar para HubSpot"

No Construtor do Bot, crie um novo bloco após a coleta de dados do lead. Nomeie-o como EnviarParaHubSpot ou similar.

2 Adicionar conteúdo "Chamada de API"

Clique nos três pontinhos do bloco → Adicionar conteúdoChamada de API.

3 Configurar Método e URL

CampoValor
MétodoPOST
URL https://api.hsforms.com/submissions/v3/integration/submit/50501903/a5edb59a-d033-4905-84d4-c00cbed2403e

4 Configurar Cabeçalho (Header)

No campo Cabeçalho, adicione:

Content-Type: application/json

Não é necessário nenhum token de autenticação. A Forms API é pública por design.

5 Configurar Corpo (Body)

No campo Corpo, cole o JSON abaixo. Substitua os valores fixos pelas variáveis do bot usando a sintaxe <? $nome_variavel ?>.

Veja a Seção 5 para o JSON completo e a Seção 6 para o mapeamento de variáveis.

6 Tratar a Resposta

A resposta fica disponível em <? $resposta_api.body ?>. No bloco seguinte, você pode:

Ordem de execução no Zenvia A Chamada de API executa após o salvamento de variáveis do bloco. Para usar as variáveis da resposta, crie um novo bloco após o bloco da Chamada de API.

4. Endpoint & Configuração

ParâmetroValor
URL completahttps://api.hsforms.com/submissions/v3/integration/submit/50501903/a5edb59a-d033-4905-84d4-c00cbed2403e
Portal ID50501903
Form IDa5edb59a-d033-4905-84d4-c00cbed2403e
MétodoPOST
Content-Typeapplication/json
AutenticaçãoNenhuma — Forms API é pública
Rate Limit100 submissões / 10 segundos por formulário
DedupPor email — mesmo email atualiza contato existente
ProtocoloHTTPS (obrigatório)

5. JSON Body Completo (34 campos)

Copiar e colar no campo Corpo da Chamada de API. Substituir valores fixos por variáveis do bot.

{
  "fields": [
    // ---- DADOS DO CONTATO (coletados pelo bot) ----
    { "name": "email",       "value": "<? $email_lead ?>" },
    { "name": "firstname",   "value": "<? $primeiro_nome ?>" },
    { "name": "lastname",    "value": "<? $sobrenome ?>" },
    { "name": "phone",       "value": "<? $telefone ?>" },

    // ---- DADOS DO PET ----
    { "name": "pet_name",    "value": "<? $nome_pet ?>" },
    { "name": "pet_species", "value": "<? $especie_pet ?>" },

    // ---- DADOS ZENVIA CORE ----
    { "name": "zenvia_conversation_id",   "value": "<? $conversation_id ?>" },
    { "name": "zenvia_channel",           "value": "whatsapp" },
    { "name": "first_message",            "value": "<? $primeira_mensagem ?>" },
    { "name": "zenvia_event_id",          "value": "<? $event_id ?>" },
    { "name": "zenvia_subscription_id",   "value": "sub_petlove_whatsapp" },
    { "name": "zenvia_event_type",        "value": "MESSAGE" },
    { "name": "zenvia_message_id",        "value": "<? $message_id ?>" },
    { "name": "zenvia_direction",         "value": "IN" },
    { "name": "zenvia_from",              "value": "<? $telefone_lead ?>" },
    { "name": "zenvia_to",                "value": "551140042500" },
    { "name": "zenvia_content_type",      "value": "text" },
    { "name": "zenvia_timestamp",         "value": "<? $timestamp ?>" },
    { "name": "zenvia_message_status",    "value": "delivered" },
    { "name": "zenvia_whatsapp_name",     "value": "<? $whatsapp_name ?>" },
    { "name": "zenvia_bot_flow_id",       "value": "<? $flow_id ?>" },
    { "name": "zenvia_metadata",          "value": "<? $metadata_json ?>" },

    // ---- REFERRAL / CLICK-TO-WHATSAPP ADS ----
    { "name": "zenvia_referral_headline",    "value": "<? $referral_headline ?>" },
    { "name": "zenvia_referral_source_type", "value": "<? $referral_type ?>" },
    { "name": "zenvia_referral_source_url",  "value": "<? $referral_url ?>" },
    { "name": "zenvia_referral_ctwa_id",     "value": "<? $ctwa_id ?>" },
    { "name": "zenvia_contact_id",           "value": "<? $zenvia_contact_id ?>" },
    { "name": "zenvia_flow_response_data",   "value": "<? $flow_response ?>" },

    // ---- STATUS & ERROS ----
    { "name": "zenvia_visitor_picture",      "value": "<? $visitor_picture ?>" },
    { "name": "zenvia_status_description",   "value": "<? $status_desc ?>" },
    { "name": "zenvia_status_error_code",    "value": "<? $error_code ?>" },
    { "name": "zenvia_status_error_reason",  "value": "<? $error_reason ?>" },
    { "name": "zenvia_channel_provider",     "value": "<? $channel_provider ?>" },
    { "name": "zenvia_message_payload",      "value": "<? $msg_payload ?>" }
  ],
  "context": {
    "pageUri": "https://api.zenvia.io/whatsapp",
    "pageName": "Zenvia WhatsApp - PetLove"
  }
}
Campos opcionais Apenas email é obrigatório. Se algum campo não estiver disponível no bot, remova a linha do JSON ou envie com valor vazio (""). Campos não reconhecidos são ignorados silenciosamente.

6. Mapeamento Variáveis Bot → HubSpot

Dados do Contato

#HubSpot PropertyFonte ZenviaVariável Bot (exemplo)Obrig.
1emailColetado pelo bot / metadata<? $email_lead ?>Sim
2firstnameColetado / metadata.contactName<? $primeiro_nome ?>Não
3lastnameColetado / metadata.contactName<? $sobrenome ?>Não
4phonemessage.from / metadata<? $telefone ?>Não

Dados do Pet

#HubSpot PropertyFonteVariável BotObrig.
5pet_nameColetado pelo bot<? $nome_pet ?>Não
6pet_speciesColetado pelo bot<? $especie_pet ?>Não

Dados Zenvia Core (22 campos)

#HubSpot PropertyFonteTipo
7zenvia_conversation_idmetadata.conversationId / conversation.idtext
8zenvia_channelchannel (fixo: "whatsapp")text
9first_messagemessage.contents[0].texttext
10zenvia_event_ididtext
11zenvia_subscription_idsubscriptionIdtext
12zenvia_event_typetype (MESSAGE, MESSAGE_STATUS)text
13zenvia_message_idmessage.idtext
14zenvia_directiondirection (IN/OUT)text
15zenvia_frommessage.fromtext
16zenvia_tomessage.totext
17zenvia_content_typemessage.contents[0].typetext
18zenvia_timestamptimestamptext
19zenvia_message_statusmessageStatus.codetext
20zenvia_whatsapp_namemessage.visitor.nametext
21zenvia_bot_flow_idmetadata (custom)text
22zenvia_metadatametadata (JSON string)text

Dados Referral / Click-to-WhatsApp Ads (6 campos novos)

#HubSpot PropertyFonteUso
23zenvia_referral_headlinemessage.referral.headlineHeadline do anúncio CTWA
24zenvia_referral_source_typemessage.referral.source.typeTipo: ad, post
25zenvia_referral_source_urlmessage.referral.source.urlURL do anúncio
26zenvia_referral_ctwa_idmessage.referral.ctwaIdID do Click-to-WhatsApp Ad
27zenvia_contact_idconversation.contactIdID do contato na Zenvia
28zenvia_flow_response_dataflow_response.dataDados do WhatsApp Flow (JSON)

Dados de Status & Enriquecimento (6 campos novos)

#HubSpot PropertyFonteUso
29zenvia_visitor_picturemessage.visitor.pictureURL foto perfil WhatsApp
30zenvia_status_descriptionmessageStatus.descriptionDescrição do status
31zenvia_status_error_codemessageStatus.causes[].channelErrorCodeCódigo de erro do canal
32zenvia_status_error_reasonmessageStatus.causes[].reasonRazão do erro
33zenvia_channel_providermessage.channel.providerProvider do canal
34zenvia_message_payloadmessage.contents[].payloadPayload de botão clicado

7. cURL de Teste

Copiar e colar no Postman (Import → Raw Text) ou executar no terminal para validar.

7.1 — Submissão mínima (teste rápido)

curl -X POST \
  "https://api.hsforms.com/submissions/v3/integration/submit/50501903/a5edb59a-d033-4905-84d4-c00cbed2403e" \
  -H "Content-Type: application/json" \
  -d '{
  "fields": [
    { "name": "email", "value": "teste.zenvia@petlove.com" },
    { "name": "firstname", "value": "Teste" },
    { "name": "phone", "value": "+5511999887766" },
    { "name": "zenvia_channel", "value": "whatsapp" },
    { "name": "first_message", "value": "Teste de integracao" }
  ],
  "context": {
    "pageUri": "https://api.zenvia.io/whatsapp",
    "pageName": "Zenvia WhatsApp - PetLove"
  }
}'

7.2 — Resposta esperada

// HTTP 200 OK
{
  "inlineMessage": "Thanks for submitting the form."
}

7.3 — Resposta de erro (campo obrigatório ausente)

// HTTP 400 Bad Request
{
  "status": "error",
  "message": "The request is not valid",
  "errors": [
    { "message": "Required field 'email' is missing" }
  ]
}

8. Tratamento de Erros

HTTPCausaAção
200Sucesso. Contato criado/atualizado.Nenhuma.
400Campo obrigatório ausente ou validação falhou.Verificar errors[].message. Não reenviar.
404Form ID ou Portal ID incorreto.Verificar IDs na URL.
429Rate limit (100 req/10s).Backoff exponencial. Esperar 10s.
5xxErro interno HubSpot.Retry com backoff. Se persistir, contatar HubSpot.

9. Workflow HubSpot

Após a submissão via Forms API, o HubSpot dispara automaticamente workflows com trigger "Contact submits a form" filtrado pelo formulário Zenvia.

Ações recomendadas no workflow

#AçãoDetalhes
1Criar DealPipeline de vendas PetLove, estágio inicial
2Atribuir vendedorBaseado em round-robin ou regra de território
3Enviar notificaçãoEmail/Slack para vendedor atribuído
4Setar lifecycle stageLead ou MQL conforme critérios
Processamento assíncrono O contato pode levar de 5s a 3min para aparecer no CRM após o HTTP 200. O workflow dispara automaticamente quando o contato é processado.

10. Checklist de Implementação

#TarefaQuemStatus
0BLOCKER: Gerar novo token Zenvia API v2 (atual retorna 401). Deadline: 10/03/2026PetLove / ZenviaBloqueado
134 properties customizadas criadas no grupo "Integração Zenvia"EPICFeito
2Formulário criado com 34 campos (4 categorias)EPICFeito
3PoC validada em produção (6 contatos, 7 cenários E2E)EPICFeito
4Documento de integração (este documento)EPICFeito
5Configurar "Chamada de API" no builder do bot (Seção 3)Zenvia / PetLovePendente
6Mapear variáveis do bot para campos HubSpot (Seção 6)Zenvia / PetLovePendente
7Garantir coleta de email no fluxo do bot (obrigatório)Zenvia / PetLovePendente
8Testar via Postman/cURL (Seção 7)Zenvia / PetLovePendente
9Implementar retry para erros 429/5xxZenvia / PetLovePendente
10Workflow de atribuição de vendedorEPICPendente
11Desenvolvimento e testes (validação técnica do fluxo completo com dados reais)EPICPendente
12Homologação e validação dos eventos (confirmar que todos os eventos Zenvia chegam corretamente no HubSpot e disparam workflows)EPICPendente

Cronograma V1 — Gantt (02/03 → 26/03/2026)

Tarefa 0203040506 0910111213 1617181920 23242526
segterquaquisex segterquaquisex segterquaquisex segterquaqui
1-4. Properties, Form, PoC, Doc
0. BLOCKER Token Zenvia
5-7. Config bot Zenvia (Chamada API)
8-9. Testes e retry (Zenvia/PetLove)
10. Workflow HubSpot (EPIC)
11. Dev e testes EPIC
12. Homologação e validação
GO-LIVE V1
Blocker
Concluído
Zenvia / PetLove
EPIC
Homologação
Milestone
Dependências críticas O token Zenvia (BLOCKER #0) trava TODAS as atividades Zenvia/PetLove (itens 5-9). O workflow EPIC (item 10) e dev/testes (item 11) podem iniciar em paralelo após o token. A homologação (item 12) só inicia após ambas as trilhas concluídas.

11. Roadmap — Middleware (V2)

Escopo opcional — plano de melhoria futura A V2 (Middleware) é opcional e será iniciada somente após a conclusão da V1, se aprovada pela PetLove como plano de melhoria futuro. Baseado na Análise Técnica v3.2 (Jonathan Lima, 05/03/2026).

Por que um middleware?

A Forms API cria contatos e dispara workflows, mas não permite:

Limitação da V1 (Forms API)Como o middleware resolve
Não busca dados complementares do contato na ZenviaGET /contacts/{id} na Zenvia API para enriquecer o contato
Não aplica regras de ownership (vendedor dono)Mapeia userId Zenvia → email → ownerId HubSpot
Não aplica regras de negócio (janela 24h, carteira 15 dias, 1 negócio por vez)Lógica customizada antes de gravar no HubSpot
Não cria Deal, Communication e Atendimento automaticamenteCria todos os objetos e associações via HubSpot API
Sem fila de retry e idempotênciaBull/Redis com Dead Letter Queue, processamento idempotente
Sem log centralizado e auditoriaCódigo versionado em Git, logging, healthcheck, alertas
Dados sensíveis trafegam direto para o HubSpot — sem camada de tratamentoMiddleware intercepta, sanitiza e transforma os dados ANTES de gravar no HubSpot — dados sensíveis podem ser mascarados, filtrados ou redirecionados sem nunca tocar o CRM
Tratamento de Dados Sensíveis Na V1 (Forms API), todos os dados coletados pelo bot Zenvia são enviados diretamente ao HubSpot sem nenhuma camada intermediária de tratamento. Isso significa que dados sensíveis (CPF, dados de saúde do pet, informações financeiras, etc.) chegam ao CRM como foram capturados.

Com o middleware (V2), a EPIC controla uma camada de processamento que permite:
  • Mascarar dados sensíveis antes de gravar no HubSpot (ex: CPF parcialmente oculto)
  • Filtrar campos que não devem ser armazenados no CRM
  • Redirecionar dados sensíveis para um armazenamento seguro separado, gravando apenas referências no HubSpot
  • Validar e sanitizar inputs antes da persistência (prevenir injeção de dados malformados)
  • Compliance — aplicar regras de LGPD/retenção de dados antes que cheguem ao CRM

Arquitetura do Middleware (Fluxo A — Análise Técnica v3.2)

💬
WhatsApp
Cliente envia msg
🤖
Zenvia
Atendimento + webhook
⚙️
Middleware
Node.js (EPIC)
💾
HubSpot
Contact + Deal + Communication

O que o middleware faz (passo a passo)

PassoAçãoDetalhe
1Recebe POST da Zenvia (webhook)Endpoint HTTP próprio com autenticação
2Valida e coloca na filaAutenticação + Bull/Redis para idempotência
3Busca dados completos na ZenviaGET /contacts/{id} — nome, email, telefone, histórico
4Aplica regras de negócioOwnership (userId → email → ownerId), janela 24h, carteira 15 dias, 1 negócio/vez
5Grava no HubSpot via APICria/atualiza Contact, Deal, Communication, Atendimento, Owner

Capacidades técnicas

CapacidadeDetalhe
StackNode.js/Express, controlado pela EPIC
Chamadas externasIlimitadas (Zenvia GET, HubSpot API, etc.)
TimeoutSem limite (diferente dos 20s do Custom Code HubSpot)
Fila de processamentoBull/Redis com retry, Dead Letter Queue, idempotência
VersionamentoGit — testável, debugável, auditável
HospedagemRailway, Render, AWS, GCP ou qualquer cloud
Ops HubNÃO precisa de Operations Hub nem de nenhum add-on

Prós e Contras

PrósContras
  • Funciona com QUALQUER plano HubSpot
  • Sem limite de timeout — lógica complexa sem pressa
  • Cria contatos novos sem problema
  • Fila com retry e Dead Letter Queue
  • Código em Git — testável e auditável
  • Toda a lógica em UM lugar
  • Precisa construir e manter infraestrutura
  • ~46-60 dias úteis (projeto full, Estimativa V4.1)
  • Precisa de CI/CD, logging, alertas, healthcheck
  • EPIC/PetLove precisam manter o código (updates, bug fixes)

Escopo V2 vs V1

ItemV1 (Forms API)V2 (Middleware)
Criação de contatoAutomáticoAutomático
Dados do bot (34 campos)SimSim + enriquecidos
Busca dados complementares ZenviaNãoGET /contacts/{id}
Regras de ownershipNãouserId → ownerId
Regras de negócio (janela 24h)NãoLógica customizada
Cria Deal automaticamenteVia workflowVia API (middleware)
Communication / AtendimentoNãoCria e associa
Fila com retry / DLQNãoBull/Redis
Auditoria / GitNãoVersionado
Tratamento de dados sensíveisSem tratamento — dados vão direto ao CRMMascaramento, filtragem, redirecionamento (LGPD)
Transição V1 → V2 (se aprovado) A V1 (Forms API) entra em produção até 26/03/2026. A V2 (Middleware) é opcional e só será iniciada após aprovação da PetLove (~46-60 dias úteis de desenvolvimento). Se aprovada, a transição é transparente: o middleware passa a receber os webhooks da Zenvia no lugar da Forms API, mantendo todas as properties e workflows existentes.

Referência: Análise Técnica — Integração Zenvia × HubSpot v1.0 (baseado no Brief Técnico v3.2), Jonathan Lima, 05/03/2026.

Suporte

PapelNomeContato
Arquitetura da IntegraçãoFabio Munhoz (Arquiteto de Receita)munhoz@epic.digital
Suporte TécnicoJonathan Limajonathan.lima@epic.digital