Análise Técnica V2

Integração Zenvia → HubSpot

Arquitetura Definitiva: Forms API via Chamada de API Zenvia
Epic Digital — Equipe Técnica v2.0 — 06/03/2026
ProjetoIntegração PetLove × HubSpot × Zenvia
DocumentoAnálise Técnica V2 — Integração Zenvia × HubSpot (Forms API)
Versão2.0 (evolução da v1.0 — apenas Path C: Forms API)
Data06/03/2026
AutorEpic Digital — Equipe Técnica
ObjetivoDocumentar a arquitetura definitiva: bot Zenvia → Chamada de API → HubSpot Forms API, sem middleware e sem servidor externo

Resumo Executivo

Este documento apresenta a arquitetura definitiva de integração entre o atendimento via WhatsApp (Zenvia) e o HubSpot CRM da PetLove. A solução escolhida e o Path C — Forms API: o bot da Zenvia usa a funcionalidade nativa "Chamada de API" para enviar dados diretamente para a HubSpot Forms API.

Sem middleware. Sem servidor externo. Sem Operations Hub. O contato e criado automaticamente no HubSpot (mesmo que nunca tenha existido), e workflows disparam a partir da submissao do formulário.

PoC validada em producao: 34 propriedades criadas, formulário configurado, 6 contatos criados com sucesso em 7 cenarios E2E.

O middleware (Fluxo A da v1.0) permanece como evolução futura (V2) para cenarios que exijam regras de ownership, busca de dados complementares na Zenvia, ou tratamento de dados sensiveis.

Seção 1
1

Visão Geral & Comparação de Fluxos

Tres caminhos foram analisados para integrar Zenvia → HubSpot. O Path C (Forms API) foi escolhido como arquitetura definitiva para a V1:

Criterio Fluxo AMiddleware Fluxo BOps 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 Cria automaticamente
Autenticação? API key Webhook URL Nenhuma (público)
Tempo dev (full) 46-60 dias uteis 15-25 dias uteis 15-20 dias uteis
Prazo V1 26/03/2026 26/03/2026 26/03/2026 (15 dias uteis)
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 sao ignorados silenciosamente. A Forms API resolve isso: cria o contato automaticamente, sem middleware, sem Ops Hub, sem autenticação. PoC validada em producao com 6 contatos criados com sucesso.
Seção 2
2

Arquitetura da Solução

💬
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" esta disponível no Construtor do Bot do Zenvia (tanto Conversion quanto Customer Cloud). Suporta POST com URL, Headers e Body JSON customizaveis — exatamente o que a Forms API requer.

Documentação Zenvia: Chamada de API no conteudo do Chatbot
Seção 3
3

Configuração no Builder Zenvia (Passo a Passo)

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

Passo 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.

Passo 2 — Adicionar conteudo "Chamada de API"

Clique nos tres pontinhos do bloco → Adicionar conteudoChamada de API.

Passo 3 — Configurar Método e URL

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

Passo 4 — Configurar Cabecalho (Header)

Content-Type: application/json

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

Passo 5 — Configurar Corpo (Body)

No campo Corpo, cole o JSON da Seção 5. Substitua os valores fixos pelas variáveis do bot usando a sintaxe <? $nome_variável ?>.

Passo 6 — Tratar a Resposta

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

  • Verificar sucesso: se $resposta_api.code == 200, seguir fluxo normal
  • Em caso de erro, logar para análise ou reenviar
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.
Seção 4
4

Endpoint & Configuração

ParametroValor
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 e pública
Rate Limit100 submissoes / 10 segundos por formulário
DedupPor email — mesmo email atualiza contato existente
ProtocoloHTTPS (obrigatório)
Seção 5
5

JSON Body Completo (34 campos)

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

// ---- DADOS DO CONTATO (coletados pelo bot) ----
{
  "fields": [
    { "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 e 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 sao ignorados silenciosamente.
Seção 6
6

Mapeamento Variáveis Bot → HubSpot

Dados do Contato

#HubSpot PropertyFonte ZenviaVariável BotObrig.
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 Bot
5pet_nameColetado pelo bot<? $nome_pet ?>
6pet_speciesColetado pelo bot<? $especie_pet ?>

Dados Zenvia Core (16 campos)

#HubSpot PropertyFonteTipo
7zenvia_conversation_idmetadata.conversationIdtext
8zenvia_channelfixo: "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)

#HubSpot PropertyFonteUso
23zenvia_referral_headlinemessage.referral.headlineHeadline do anuncio CTWA
24zenvia_referral_source_typemessage.referral.source.typeTipo: ad, post
25zenvia_referral_source_urlmessage.referral.source.urlURL do anuncio
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)

#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[].reasonRazao do erro
33zenvia_channel_providermessage.channel.providerProvider do canal
34zenvia_message_payloadmessage.contents[].payloadPayload de botao clicado
Seção 7
7

cURL de Teste & Tratamento de Erros

7.1 Submissao minima (teste rapido)

POST https://api.hsforms.com/submissions/v3/integration/submit/50501903/{FORM_ID}
Content-Type: application/json

{
  "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 integração" }
  ],
  "context": {
    "pageUri":  "https://api.zenvia.io/whatsapp",
    "pageName": "Zenvia WhatsApp - PetLove"
  }
}

Form ID: a5edb59a-d033-4905-84d4-c00cbed2403e — Copiar para Postman ou terminal como cURL POST.

7.2 Respostas esperadas

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.
Seção 8
8

Workflow HubSpot

Após a submissao 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, estagio inicial
2Atribuir vendedorBaseado em round-robin ou regra de territorio
3Enviar notificaçãoEmail/Slack para vendedor atribuido
4Setar lifecycle stageLead ou MQL conforme criterios
Processamento assincrono: O contato pode levar de 5s a 3min para aparecer no CRM após o HTTP 200. O workflow dispara automaticamente quando o contato e processado.
Seção 9
9

Bloqueios & Checklist

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. Isso significa que o token pode estar expirado, revogado, ou sem os escopos necessários.

Ação necessaria: 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)

Checklist de Implementação

#TarefaQuemStatus
0 BLOCKER: Gerar novo token Zenvia API v2 (atual retorna 401). Deadline: 10/03/2026 PetLove / Zenvia Bloqueado
1 34 properties customizadas criadas no grupo "Integração Zenvia" EPIC Feito
2 Formulário criado com 34 campos (4 categorias) EPIC Feito
3 PoC validada em producao (6 contatos, 7 cenarios E2E) EPIC Feito
4 Documento de integração (este documento) EPIC Feito
5 Configurar "Chamada de API" no builder do bot (Seção 3) Zenvia / PetLove Pendente
6 Mapear variáveis do bot para campos HubSpot (Seção 6) Zenvia / PetLove Pendente
7 Garantir coleta de email no fluxo do bot (obrigatório) Zenvia / PetLove Pendente
8 Testar via Postman/cURL (Seção 7) Zenvia / PetLove Pendente
9 Implementar retry para erros 429/5xx Zenvia / PetLove Pendente
10 Workflow de atribuicao de vendedor EPIC Pendente
11 Desenvolvimento e testes (validação técnica do fluxo completo) EPIC Pendente
12 Homologação e validação dos eventos EPIC Pendente
Seção 10
10

Middleware como evolução futura (V2)

A V2 (Middleware) e opcional e sera iniciada somente após a conclusao da V1, se aprovada pela PetLove como plano de melhoria futuro.

O que a Forms API NAO faz (e o middleware resolve)

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 negocio (janela 24h, carteira 15 dias)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 idempotenciaBull/Redis com Dead Letter Queue, processamento idempotente
Dados sensiveis trafegam direto para o HubSpotMiddleware intercepta, sanitiza e transforma ANTES de gravar no CRM

Escopo V2 vs V1

ItemV1 (Forms API)V2 (Middleware)
Criação de contatoAutomaticoAutomatico
Dados do bot (34 campos)SimSim + enriquecidos
Busca dados complementares ZenviaNãoGET /contacts/{id}
Regras de ownershipNãouserId → ownerId
Regras de negocio (janela 24h)NãoLógica customizada
Cria Deal automaticamenteVia workflowVia API (middleware)
Fila com retry / DLQNãoBull/Redis
Tratamento dados sensiveisSem tratamentoMascaramento, LGPD
Transição V1 → V2 (se aprovado): A V1 (Forms API) entra em producao ate 26/03/2026. A V2 (Middleware) e opcional e só sera iniciada após aprovação da PetLove (~46-60 dias uteis). Se aprovada, a transição e transparente: o middleware passa a receber os webhooks da Zenvia no lugar da Forms API, mantendo todas as properties e workflows existentes.