Agente de Follow-up de Leads com IA
Quase todo lead que entra hoje não responde de primeira. Sem follow-up consistente, você perde dinheiro que já pagou pra entrar. Esse agente cuida disso sozinho, com mensagens diferentes a cada toque.
O que esse agente faz
- Lê leads novos do seu banco em tempo real
- Cria uma régua de 3 toques (dia 1, dia 3 e dia 7) pra cada lead
- Gera o texto de cada mensagem com IA usando dados do lead (nome, origem, último interesse)
- Envia via WhatsApp (Baileys) ou email (Resend) conforme o canal cadastrado
- Para a régua automaticamente se o lead responder
- Marca o status de cada mensagem no banco pra você ter relatório
Stack
- Node.js 22 com TypeScript
- Drizzle ORM com Postgres no Neon
- Baileys para WhatsApp (sem custo, sem WhatsApp Business API)
- Resend para email (3 mil envios grátis por mês)
- Anthropic Claude API para gerar texto variado
- Vercel Cron ou Railway Cron pra rodar a cada hora
Régua padrão (3 mensagens)
- Dia 1 (24h depois do lead entrar): toque amigável lembrando do interesse, pergunta aberta no fim
- Dia 3 (3 dias depois): traz um caso real ou um número, oferece ajudar com algo específico
- Dia 7 (7 dias depois): mensagem curta, dá saída elegante, pergunta se faz sentido conversar agora ou em outro momento
Prompt completo para Claude Code
Cole no Claude Code dentro de uma pasta vazia:
Crie um agente de follow-up de leads em Node.js + TypeScript.
Schema (Drizzle + Neon Postgres):
leads (
id text primary key,
name text not null,
phone text,
email text,
source text, // organic | meta_ads | google_ads | indicacao
product_interest text,
status text default 'novo', // novo | em_followup | respondeu | qualificado | descartado
created_at timestamp default now()
)
followup_messages (
id text primary key,
lead_id text references leads(id),
step integer not null, // 1, 2 ou 3
channel text not null, // whatsapp | email
scheduled_for timestamp not null,
sent_at timestamp,
message_body text,
status text default 'agendada', // agendada | enviada | cancelada | falhou
created_at timestamp default now()
)
Worker (roda a cada hora via cron):
1. Buscar leads com status = 'novo' e sem followup_messages cadastradas.
Para cada um, criar 3 followup_messages:
step 1: scheduled_for = created_at + 24h
step 2: scheduled_for = created_at + 72h
step 3: scheduled_for = created_at + 168h
channel: whatsapp se tem phone, senão email
Atualizar status do lead para 'em_followup'
2. Buscar followup_messages com scheduled_for <= now()
e status = 'agendada'. Para cada uma:
a) Gerar mensagem com Claude:
const prompt = `Você escreve mensagens de follow-up para leads.
Lead: ${lead.name}, origem ${lead.source}, interesse em ${lead.product_interest}.
Este é o toque ${step} de uma régua de 3.
Regras:
- Português, sem jargão
- Máximo 4 linhas
- Sem "tudo bem?", sem "espero te encontrar bem"
- Toque 1: lembre o interesse, pergunta aberta no fim
- Toque 2: traga um número ou caso real, ofereça ajudar com algo específico
- Toque 3: saída elegante, pergunta se faz sentido agora ou em outro momento
Escreva só a mensagem, sem aspas, sem assinatura.`
b) Se channel = 'whatsapp', enviar via Baileys
c) Se channel = 'email', enviar via Resend
d) Atualizar followup_messages: sent_at = now(), status = 'enviada', message_body = texto
e) Se falhar: status = 'falhou', log do erro
3. Para cada lead com status = 'em_followup', verificar se há resposta nova
(mensagem do lead chegando no Baileys ou webhook do Resend reply).
Se sim:
- Atualizar lead.status = 'respondeu'
- Cancelar todas followup_messages agendadas desse lead
Estrutura do projeto:
src/
db/schema.ts // tabelas Drizzle
db/client.ts // conexão Neon
workers/scheduler.ts // cria régua para novos leads
workers/sender.ts // envia mensagens agendadas
workers/listener.ts // escuta respostas e cancela régua
channels/whatsapp.ts // Baileys client com sessão persistida
channels/email.ts // Resend client
ai/generate-message.ts // chamada Claude
Variáveis de ambiente:
DATABASE_URL
ANTHROPIC_API_KEY
RESEND_API_KEY
BAILEYS_SESSION_PATH (caminho local pra sessão WhatsApp)
Deploy: Railway com Dockerfile Node 22. Volume persistente pra
manter a sessão do Baileys entre restarts.Como conectar ao seu WhatsApp Business
- Instale o app e abra Configurações > Aparelhos conectados
- Rode o agente uma vez localmente, ele imprime QR no terminal
- Escaneie com o aparelho conectado, pronto
- Depois disso a sessão fica salva em arquivo, o agente reconecta sozinho
- Em produção (Railway/VPS) você sobe a pasta de sessão como volume persistente
Monitoramento
- Dashboard simples em /admin mostrando leads em régua, taxas por toque e total de respostas
- Logs estruturados (pino ou winston) pra cada envio
- Alerta no seu WhatsApp pessoal se 3 envios falharem seguidos
- Métrica de resposta por toque (geralmente toque 1 puxa 40%, toque 2 mais 25%, toque 3 mais 10%)
Perguntas frequentes
Não fica robótico mandar mensagem gerada por IA?
Não, porque cada mensagem é gerada com o nome do lead, a origem dele e o produto de interesse. O Claude varia o texto a cada chamada, então não fica copy paste. A regra do prompt limita a 4 linhas e proíbe "tudo bem?" pra soar humano.
O Baileys é seguro? Não bane meu número?
O Baileys é uma biblioteca não oficial que conecta como aparelho secundário. Para volume pessoal e de pequeno negócio (até 200 mensagens por dia, com intervalo de 30 segundos entre cada uma), não há registro de banimento. Para volumes altos, migre para a WhatsApp Business API oficial.
Posso usar só email se eu não tiver WhatsApp?
Pode. O campo channel da tabela followup_messages decide o canal por lead. Se você só usa email, simplifica o agente removendo a parte do Baileys e configura só o Resend. O fluxo da régua é idêntico.
O agente para de mandar quando o lead responde?
Para. O listener do Baileys escuta mensagens recebidas e quando identifica resposta de um lead em régua, atualiza o status e cancela as mensagens agendadas que ainda não foram enviadas. Pra email, o Resend dispara webhook ao receber reply.
Quanto custa rodar isso por mês?
Railway hobby fica em torno de R$ 25/mês. Neon e Resend têm plano grátis. Anthropic cobra centavos por mensagem gerada (cerca de R$ 0,02 cada). Pra 100 leads novos por mês com 3 toques cada, o custo total fica abaixo de R$ 35.
Quer implementar isso?
Me chama no WhatsApp. Ajudo você a configurar ou implemento pra você.
Quero ajuda no WhatsAppGastão Matos
@gastaomatos