Agentes IA
Comente FOLLOWUP no Instagram @gastaomatos

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:

prompt
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 WhatsApp
DT

Gastão Matos

@gastaomatos