CRM moderno sem WhatsApp é CRM cego — o canal mais usado pelo brasileiro fica fora do funil. Cliente vira "fantasma" entre o lead capturado no formulário e o contato real no chat. Quem integra os dois fecha o ciclo: cada conversa vira atividade no CRM, cada mudança de estágio dispara mensagem proativa, e o vendedor nunca mais pergunta "esse lead falou com a gente?".
Este guia mostra os 3 padrões de integração e o passo a passo para RD Station, HubSpot e Pipedrive.
Os 3 padrões de integração
| Padrão | Direção | Quando usar |
|---|---|---|
| Lead-in | WhatsApp → CRM | Capturar leads vindos do WhatsApp (formulário "Receba pelo WhatsApp") |
| Trigger-out | CRM → WhatsApp | Disparar mensagem quando lead muda de estágio (qualificou? proposta enviada?) |
| Full-sync | Bidirecional | Cada mensagem WhatsApp vira atividade no CRM; cada nota no CRM dispara WhatsApp |
A maioria das empresas começa com trigger-out (mais simples, ROI rápido) e evolui para full-sync ao longo de 3–6 meses.
RD Station: integração via webhook + automação
Trigger-out: mensagem ao mudar estágio
Cenário: quando lead vira "Oportunidade", manda mensagem WhatsApp do vendedor responsável.
- RD Station: em Automações → Nova automação, gatilho "Lead atinge estágio" → "Oportunidade".
- Ação: "Enviar para webhook externo" → URL do seu n8n / endpoint próprio.
- Payload (RD Station envia automaticamente):
{ "lead": { "name": "...", "phone": "+5511999999999", "owner": { "email": "[email protected]" } }, "stage": "Oportunidade" } - Seu webhook mapeia vendedor → instância e dispara:
POST /v1/instances/{instanceId}/send Authorization: Bearer tk_xxx { "phone": "+5511999999999", "type": "text", "body": "Olá [NOME], aqui é o [VENDEDOR] da [EMPRESA]. Vi que tem interesse em [PRODUTO]. Posso te explicar mais?" }
Lead-in: criar lead no RD a partir do WhatsApp
Capture o opt-in inicial e gere o lead automaticamente:
// webhook handler (recebe mensagem nova)
async function processarInbound(event) {
// Já existe no CRM?
const existing = await rdStation.contacts.find({ phone: event.from });
if (existing) return; // só atualiza atividade
// Cria novo lead
await rdStation.contacts.create({
name: 'Contato WhatsApp',
phone: event.from,
tags: ['origem-whatsapp', `instancia-${event.instanceId}`],
custom_fields: {
cf_first_message: event.body,
cf_first_contact_at: event.timestamp
}
});
// Dispara mensagem de boas-vindas
await zapApi.send({
phone: event.from,
type: 'text',
body: 'Olá! Recebemos sua mensagem. Em até 5 minutos, um especialista responde.'
});
}
HubSpot: integração via workflow + private app
Setup inicial
- Crie Private App em HubSpot: Settings → Integrations → Private Apps.
- Permissões mínimas:
crm.objects.contacts.read/write,crm.engagements.write. - Guarde o token gerado.
Trigger-out via Workflow
HubSpot Workflow → ação "Webhook" → endpoint próprio que chama a ZAP API.
// Endpoint que recebe o webhook do HubSpot
app.post('/hubspot/lead-qualified', async (req, res) => {
const { contactId } = req.body;
// Busca dados completos do contact
const contact = await hubspot.crm.contacts.basicApi.getById(
contactId,
['firstname', 'phone', 'hs_owner_id']
);
// Mapeia owner → instância
const instanceId = mapOwnerToInstance(contact.properties.hs_owner_id);
// Envia mensagem
const msg = await zapApi.send({
phone: contact.properties.phone,
type: 'text',
body: `Olá ${contact.properties.firstname}! ...`
});
// Registra engagement no HubSpot
await hubspot.crm.engagements.create({
properties: {
hs_engagement_type: 'NOTE',
hs_body: `WhatsApp enviado: ${msg.id}`,
hubspot_owner_id: contact.properties.hs_owner_id
},
associations: [
{
to: { id: contactId },
types: [{
associationCategory: 'HUBSPOT_DEFINED',
associationTypeId: 202 // contact_to_engagement
}]
}
]
});
res.json({ ok: true });
});
Full-sync: cada mensagem WhatsApp vira engagement
No webhook da ZAP API (message.received e message.sent), crie um Note no HubSpot:
// webhook ZAP API
async function onWhatsAppMessage(event) {
const contact = await hubspot.crm.contacts.searchApi.doSearch({
filterGroups: [{
filters: [{ propertyName: 'phone', operator: 'EQ', value: event.from }]
}]
});
if (!contact.results.length) return;
await hubspot.crm.engagements.create({
properties: {
hs_engagement_type: 'NOTE',
hs_body: `[${event.direction === 'in' ? 'Recebido' : 'Enviado'}]: ${event.body}`,
hs_timestamp: new Date(event.timestamp).getTime()
},
associations: [{
to: { id: contact.results[0].id },
types: [{
associationCategory: 'HUBSPOT_DEFINED',
associationTypeId: 202
}]
}]
});
}
Pipedrive: integração via webhook bidirecional
Setup
- Pegue API token em Settings → Personal preferences → API.
- Configure webhooks em Settings → Tools and apps → Webhooks.
Trigger-out: deal mudou de estágio
Webhook Pipedrive (updated.deal) → seu endpoint:
app.post('/pipedrive/deal-updated', async (req, res) => {
const { current, previous } = req.body;
// Só dispara se mudou de estágio
if (current.stage_id === previous.stage_id) return res.end();
const stage = await pipedrive.stages.get(current.stage_id);
const person = await pipedrive.persons.get(current.person_id);
const phone = person.phone[0]?.value;
if (!phone) return res.end();
await zapApi.send({
phone,
type: 'text',
body: `Olá ${person.name}, estamos avançando seu processo: ${stage.name}.`
});
// Registra atividade
await pipedrive.activities.create({
subject: 'WhatsApp enviado',
type: 'whatsapp',
deal_id: current.id,
person_id: current.person_id,
note: `Mensagem automática ao entrar em ${stage.name}`,
done: 1
});
res.json({ ok: true });
});
Lead-in: WhatsApp inbound vira deal
// webhook ZAP API — primeira mensagem de número desconhecido
async function onPrimeiroContato(event) {
// Cria pessoa se não existe
const person = await pipedrive.persons.create({
name: `Lead WhatsApp ${event.from.slice(-4)}`,
phone: [{ value: event.from, primary: true }]
});
// Cria deal no estágio "Lead frio"
await pipedrive.deals.create({
title: `Lead via WhatsApp - ${event.body.slice(0, 40)}`,
person_id: person.id,
stage_id: STAGE_LEAD_FRIO,
custom_fields: {
'first_message': event.body,
'first_contact_at': event.timestamp,
'origem': 'WhatsApp Inbound'
}
});
}
Field mapping — o que sincronizar
| Campo | Origem (WhatsApp) | Destino (CRM) |
|---|---|---|
| Telefone | event.from | phone primary |
| Nome (se exibido) | event.pushName | firstname |
| Foto de perfil | event.profilePicUrl | Custom field URL |
| Origem | event.instanceId + tag | source ou tag |
| Primeira mensagem | event.body | Custom field |
| Timestamp | event.timestamp | created_at |
| Owner | Lookup por instância → vendedor | owner / hs_owner_id |
Padrões que evitam dor de cabeça
- Idempotência: use
event.idcomo chave única ao gravar atividade no CRM. Webhook pode chegar duplicado. - Throttle no CRM: CRMs cobram por API call. Não crie 1 atividade por mensagem se o cliente manda 30 mensagens em 5 min — agrupe.
- Owner mapping table: mapeie cada instância para um vendedor (ex:
inst_xxx → "Joao") para roteamento automático. - Failover: se o CRM cair, não perca a mensagem. Persista em fila local primeiro.
FAQ
- Posso usar n8n para fazer essa integração sem código?
Sim — a ZAP API tem template oficial para RD Station. Para HubSpot e Pipedrive, n8n tem nodes prontos. Veja em/dashboard/integrations/templates. - O CRM precisa estar exposto na internet?
Não — você chama a API deles a partir do seu backend. Eles podem disparar webhooks para uma URL pública sua (use HMAC para autenticar). - E se um lead estiver em múltiplos pipelines?
Use um campo "instância principal" no contato para evitar mandar 3 WhatsApp no mesmo dia. - Mensagens via app pessoal aparecem no CRM?
Não — só mensagens via API. Se o vendedor responde pelo celular pessoal, o CRM não vê. Padronize o atendimento via API + dashboard de chat. - Quanto tempo leva o setup completo?
Trigger-out: 2–4 horas. Lead-in: 4–8 horas. Full-sync: 1–2 semanas (com testes).
Criar conta com integração CRM — trial 7 dias.