| Projeto | Middleware de Integracao PetLove × HubSpot × Zenvia |
| Documento | Analise Tecnica — Integracao Zenvia × HubSpot |
| Versao | 1.0 (baseado no Brief Tecnico v3.2) |
| Data | 05/03/2026 |
| Autor | Epic Digital — Equipe Tecnica |
| Objetivo | Apresentar analise tecnica dos 2 fluxos viaveis de integracao Zenvia → HubSpot |
Este documento apresenta a analise tecnica da integracao entre o atendimento via WhatsApp (Zenvia) e o HubSpot CRM. O objetivo e garantir que, quando um cliente entra em contato pelo WhatsApp, os dados do atendimento — contato, negocio, conversa e vendedor responsavel — sejam registrados automaticamente no HubSpot.
Para viabilizar essa integracao, foram mapeados dois caminhos possiveis, cada um com caracteristicas, vantagens e limitacoes distintas:
Fluxo A — Middleware: a Zenvia envia eventos para um servidor intermediario (Node.js) que processa, valida e grava no HubSpot. Toda a logica — incluindo criacao de contatos novos, atribuicao de vendedor e registro de conversa — fica sob nosso controle, com versionamento via Git e sem limitacao de tempo de execucao.
Fluxo B — HubSpot Direto: a Zenvia envia webhooks diretamente para o HubSpot, que processa tudo via Workflows com Custom Code. E uma solucao mais rapida de implementar, porem depende do plano Operations Hub Professional, possui limite de 20 segundos por execucao e apresenta uma limitacao importante: contatos que ainda nao existem no HubSpot nao disparam o workflow.
Ambos os fluxos entregam o mesmo resultado para o usuario final. A diferenca esta na arquitetura, nos prazos, nas dependencias de licenciamento e no tratamento de contatos novos. As secoes a seguir detalham cada caminho, os endpoints da Zenvia envolvidos, as limitacoes identificadas e as decisoes pendentes.
Antes de falar de fluxos, um resumo rapido do que ja foi confirmado em calls anteriores com a Zenvia (15/01 e 21/01):
| O que | Status | Fonte |
|---|---|---|
| Zenvia opera em push (webhooks) | Confirmado | call-02 (15/01) — Bruno Prusch, Victor Poletti |
| 2 tipos de webhook:CONVERSATION_STATUS e CONVERSATION_MESSAGE | Confirmado | Handoff Tecnico + call-04 (21/01) |
| Payloads documentados(conversation.id, contactId, message, etc.) | Confirmado | Handoff Tecnico + call-04 |
| Webhook NAO traz dados completos do contato(so contactId → precisa GET /contacts) | Confirmado | call-02 (Bruno), call-04 (Vitor Simoes) |
| userId do vendedor = ID interno Zenvia(precisa mapear → email) | Confirmado | call-04 (Vitor Simoes alertou) |
| API v2 NAO tem rota de buscar vendedor por ID(API v1 tem, mas precisa de token separado) | Confirmado | call-04 (Vitor Simoes) |
| Regras de ownership:24h janela, 15 dias carteira, 1 negocio por vez | Confirmado | call-04 (Lucas Freire) |
| PetLove tem codigo PHP que faz Zenvia→RD Station(referencia, nao reaproveitavel direto) | Confirmado | call-04 (Anderson Casimiro) |
Neste fluxo, construimos um middleware nosso que fica entre a Zenvia e o HubSpot. Ele recebe todos os eventos, processa a logica e grava no CRM. E o plano original da Estimativa V4.1.
O middleware e uma aplicacao Node.js/Express controlada por nos. Nao depende de nenhum recurso especial do HubSpot — precisa apenas da API padrao do HubSpot (qualquer plano com acesso a API: Marketing Hub, Sales Hub, etc.).
PASSO 1 Cliente manda WhatsApp
|
PASSO 2 ZENVIA recebe a mensagem e o atendimento acontece
|
PASSO 3 Quando algo muda (novo atendimento, mensagem, vendedor atribuido, fechou)
a ZENVIA automaticamente envia um aviso (POST) para o NOSSO MIDDLEWARE
|
PASSO 4 NOSSO MIDDLEWARE recebe o aviso e faz:
a) Valida que o aviso e legitimo (autenticacao)
b) Busca dados completos do contato na ZENVIA (GET /contacts)
c) Aplica regra: esse vendedor e o dono? Ja tem negocio aberto?
d) Grava tudo no HUBSPOT: contato, negocio, conversa, vendedor
|
PASSO 5 HUBSPOT tem os dados. Equipe ve no CRM.
Uma pessoa interessada em seguro pet envia mensagem pelo WhatsApp da PetLove. A Zenvia e quem recebe essa mensagem na plataforma de atendimento.
O vendedor da PetLove atende pelo painel da Zenvia. O atendimento pode passar por fila, ser distribuido a um vendedor, receber mensagens, e eventualmente ser encerrado.
Cada vez que algo muda (nova conversa, mensagem, vendedor atribuido, conversa fechada), a Zenvia automaticamente faz um POST para a URL do nosso middleware. Esse POST contem: ID da conversa, tipo do evento, ID do contato.
Nosso middleware recebe o POST e executa toda a logica:
A equipe comercial abre o HubSpot e ve tudo atualizado: contato com dados do WhatsApp, negocio criado, conversa registrada na timeline, vendedor correto como owner.
+----------+ POST webhook +-------------------------+ POST API +-----------+
| | ------------------> | | ----------------> | |
| ZENVIA | | MIDDLEWARE (Node.js) | | HUBSPOT |
| | <------------------ | | | CRM |
+----------+ GET /contacts/{id}| * Valida webhook | | |
| * Busca contato Zenvia | | * Contact |
(chamado pelo | * Regras ownership | | * Deal |
Middleware) | * Idempotencia / fila | | * Comm. |
| * Cria objetos HubSpot | | * Owner |
+-------------------------+ +-----------+
| Quem | Faz o que | Chama quem |
|---|---|---|
| Cliente | Manda mensagem no WhatsApp | → Zenvia (automatico) |
| Zenvia | Recebe, processa o atendimento, e quando algo muda envia POST automaticamente para nosso middleware |
→ Middleware (POST) |
| Middleware (nosso) |
Recebe o POST, valida, busca dados na Zenvia, aplica regras de negocio, e grava no HubSpot |
→ Zenvia (GET) → HubSpot (POST) |
| HubSpot | Recebe os dados via API e grava no CRM (contato, negocio, conversa, associacoes, vendedor) |
— (so recebe) |
Neste fluxo, a Zenvia envia webhooks diretamente para o HubSpot, que processa tudo internamente usando Workflows com Custom Code. Nao existe middleware externo — e 100% Zenvia + HubSpot.
Analise baseada na documentacao oficial do HubSpot (developers.hubspot.com + knowledge.hubspot.com). Tres capacidades-chave:
O HubSpot gera uma URL propria que aceita POST de qualquer app externo. Quando recebe o POST, dispara um Workflow automaticamente.
Dentro de um Workflow, e possivel rodar codigo Node.js ou Python como serverless function (AWS Lambda). Pode chamar APIs externas (ex: Zenvia GET /contacts) e a API do HubSpot internamente.
| Limitacao | Valor |
|---|---|
| Timeout por execucao | 20 segundos (maximo) |
| Memoria | 128 MB |
| Plano necessario | Operations Hub Professional ou Enterprise |
| Bibliotecas Node.js disponiveis | @hubspot/api-client, axios, lodash, mongoose, mysql, redis, aws-sdk, googleapis, bluebird, request |
Uma acao dentro do Workflow que faz POST ou GET para qualquer URL externa, com autenticacao (API key ou HMAC), retry automatico por ate 3 dias.
Para contatos que JA EXISTEM no HubSpot (ex: ja foram importados, ja vieram por formulario, ja foram cadastrados manualmente), o fluxo funciona 100% sem nenhum middleware externo.
PASSO 1 Cliente manda WhatsApp (contato JA EXISTE no HubSpot)
|
PASSO 2 ZENVIA recebe a mensagem e o atendimento acontece
|
PASSO 3 Quando algo muda (novo atendimento, mensagem, vendedor atribuido, fechou)
a ZENVIA envia POST diretamente para a URL do HUBSPOT
|
PASSO 4 HUBSPOT recebe o webhook, encontra o contato pela propriedade unica
(ex: telefone), e DISPARA o WORKFLOW automaticamente
|
PASSO 5 Dentro do Workflow, um CUSTOM CODE (Node.js) roda:
a) Busca dados completos na ZENVIA (GET /contacts)
b) Aplica regras de negocio (ownership, janela 24h)
c) Cria o negocio, grava a conversa, seta o vendedor
|
PASSO 6 HUBSPOT tem os dados. Equipe ve no CRM.
Uma pessoa interessada em seguro pet envia mensagem pelo WhatsApp da PetLove. A Zenvia e quem recebe essa mensagem na plataforma de atendimento. Esse cliente ja foi cadastrado no HubSpot anteriormente (importacao, formulario, etc.).
O vendedor da PetLove atende pelo painel da Zenvia. O atendimento pode passar por fila, ser distribuido a um vendedor, receber mensagens, e eventualmente ser encerrado.
Cada vez que algo muda (nova conversa, mensagem, vendedor atribuido, conversa fechada), a Zenvia faz um POST diretamente para a URL gerada pelo HubSpot. Esse POST contem: ID da conversa, tipo do evento, telefone do contato.
O HubSpot recebe o webhook, procura um contato com a propriedade unica correspondente (ex: campo phone = numero do WhatsApp). Como o contato JA EXISTE, o Workflow e disparado automaticamente.
Dentro do Workflow, um bloco de Custom Code (Node.js) roda:
Tudo acontece DENTRO do HubSpot, zero middleware externo.
A equipe comercial abre o HubSpot e ve tudo atualizado: contato, negocio, conversa registrada, vendedor correto. Igual ao Fluxo A — o resultado final e o mesmo.
CENARIO: Contato NOVO (primeira conversa no WhatsApp - nunca esteve no HubSpot)
PASSO 1 Cliente NOVO manda WhatsApp
|
PASSO 2 ZENVIA recebe e atende normalmente
|
PASSO 3 ZENVIA envia POST para a URL do HUBSPOT
|
PASSO 4 HUBSPOT recebe, procura contato com phone = +5511999...999
→ NAO ENCONTRA (contato nunca existiu)
→ WEBHOOK IGNORADO
→ Nenhum workflow dispara
→ Dados perdidos silenciosamente
POST webhook (direto)
+----------+ +-------------------------------------+
| | ---------------------> | HUBSPOT (Operations Hub) |
| ZENVIA | | |
| | | 1. Recebe webhook |
+----------+ | 2. Busca contato por prop. unica |
^ | Encontrou → Workflow dispara |
| | Nao encontrou → IGNORA |
| | 3. Custom Code (Node.js): |
| | * axios: GET Zenvia /contacts |
| GET /contacts/{id} | * Regras ownership (24h/15 d) |
+------------------------------+ * Cria Deal, Communication |
(chamado pelo Custom Code) | * Seta Owner (vendedor) |
| 4. Resultado: |
| * Contact (existente, atualiz.) |
| * Deal + Communication + Owner |
+-------------------------------------+
| Quem | Faz o que | Chama quem |
|---|---|---|
| Cliente | Manda mensagem no WhatsApp | → Zenvia (automatico) |
| Zenvia | Recebe, processa o atendimento, e quando algo muda envia POST diretamente para o HubSpot |
→ HubSpot (POST webhook) |
| HubSpot Workflow + Custom Code |
1) Recebe webhook e dispara workflow (somente se contato existir) 2) Custom Code busca dados na Zenvia 3) Aplica regras e cria objetos CRM |
→ Zenvia (GET /contacts) → HubSpot (interno - API) |
| Criterio | Fluxo AZenvia → Middleware → HubSpot | Fluxo BZenvia → HubSpot (direto) |
|---|---|---|
| Precisa de Operations Hub? | NAO | SIM (Professional) |
| Precisa de middleware externo? | SIM (middleware completo) | NAO (zero middleware) |
| Contato novo (nunca existiu no HS)? | Cria sem problema | IGNORADO silenciosamente |
| Quem processa webhooks Zenvia? | Middleware (nosso codigo) | HubSpot Workflow direto |
| Quem chama GET /contacts Zenvia? | Middleware (axios/fetch) | Custom Code no HubSpot (axios) |
| Logica de ownership (24h/15 dias)? | Middleware (sem limite) | Custom Code (limite 20s) |
| Idempotencia? | Controle total | Precisa implementar no Custom Code |
| Fila / DLQ / retry? | Fila propria (Bull, SQS) | Retry do HubSpot (3 dias) |
| Timeout? | Sem limite | 20 segundos por execucao |
| Memoria? | Sem limite | 128 MB |
| Onde fica a logica principal? | Codigo (Git, testavel) | HubSpot UI (visual, sem Git) |
| Tempo de desenvolvimento | 46-60 dias uteis (V4.1) | ~15-25 dias uteis (estimativa) |
| Complexidade de manutencao | Media (codigo versionado) | Baixa (so HubSpot UI) |
| Padrao ja usado na Epic? | Novo para este projeto | Similar ao iFood e outros |
O HubSpot tem integracao nativa com WhatsApp via Meta Cloud API. As mensagens aparecem direto na Inbox. Porem, isso exige migrar o numero do Zenvia para o Meta diretamente, eliminando o Zenvia como plataforma de atendimento (filas, roteamento, chatbot, distribuicao). Nao e viavel sem redesenhar a operacao da PetLove.
Sao plataformas de middleware visual (no-code). Funcionam para fluxos simples, mas a logica da PetLove e complexa: ownership com janela 24h/15 dias, idempotencia, multiplas APIs encadeadas (GET Zenvia → POST Contact → POST Deal → POST Communication → POST Association → Set Owner). Zapier/Make ficam frageis com essa complexidade, cobram por execucao (escala limitada), e nao oferecem fila/DLQ/retry adequado.
API que faz mensagens da Zenvia aparecerem na Inbox de Conversas do HubSpot (como se fosse WhatsApp nativo). MAS: requer backend igualmente (e middleware). Nao e necessario para o MVP, que foca no CRM (contatos, negocios, timeline). Pode ser evolucao pos-MVP se quiserem conversas na Inbox.
| # | Endpoint | Metodo | API | Token | Status nosso |
|---|---|---|---|---|---|
| 1 | WebhookCONVERSATION_STATUS | POST (inbound) | v2 | Setup plataforma | Sem acesso |
| 2 | WebhookCONVERSATION_MESSAGE | POST (inbound) | v2 | Setup plataforma | Sem acesso |
| 3 | GET /contacts/{contactId} | GET (outbound) | v2 | Token v2 | Sem token |
| 4 | POST /subscriptions | POST (outbound) | v2 | Token v2 | Sem token |
| 5 | Listar vendedores | GET (outbound) | v1 (?) | Token v1 | Incerto |
| Quando | O que fazer | Depende de |
|---|---|---|
| AGORA | Scaffolding, config HubSpot sandbox, custom objects, event defs | Nada da Zenvia |
| Com token v2 | ZenviaService, WebhookValidator, cadastrar subscriptions, testar | Token v2 + acesso plataforma |
| Com token v1 ou definicao G1 | OwnerMappingService (userId → email → ownerId) | Token v1 ou alternativa |
| Com tudo acima | Testes integrados, handlers completos, homologacao | Todos os tokens + staging |
Existem dois caminhos reais para integrar Zenvia → HubSpot. Ambos entregam o mesmo resultado para o usuario final (contato, negocio, conversa e vendedor no CRM). A diferenca esta em quem faz o trabalho pesado e quais requisitos de licenca sao necessarios:
| Fluxo AZenvia → Middleware → HubSpot | Fluxo BZenvia → HubSpot (direto) | |
|---|---|---|
| Resumo | Toda logica no nosso middleware Node.js/Express |
Zero middleware — tudo no HubSpot Custom Code Workflows |
| Precisa Ops Hub? | NAO | SIM |
| Middleware externo? | SIM (completo) | NAO |
| Contato novo? | Cria sem problema | Ignorado (limitacao do HS) |
| Tempo estimado | ~46-60 dias uteis | ~15-25 dias uteis |
| Melhor para | Logica complexa, controle total, sem dependencia de Ops Hub |
Contatos ja existem no HS, equipe ja usa Ops Hub |