Triagem Automática de WhatsApp com IA
Você acorda com 80 mensagens não lidas. 5 são urgentes, 20 importantes, o resto pode esperar. Em vez de você procurar, o robô lê tudo às 7h e te manda 5 linhas com o que importa.
Por que triagem é melhor que ler tudo
- Ler tudo te tira 40 minutos por manhã, atenção fragmentada e cansaço cognitivo
- Você responde primeiro o que aparece, não o que importa
- Mensagens urgentes ficam soterradas embaixo de grupos com conversa solta
- Você decide o dia só depois de processar tudo. Com triagem, você decide antes
- Filtra ruído sem deixar passar o que era pra responder rápido
Stack
- Node.js 22 + TypeScript
- Baileys para ler o histórico de mensagens das últimas 12h
- Anthropic Claude para classificar e resumir
- WhatsApp Cloud API para enviar o resumo pro seu próprio número
- Cron node-cron (ou Vercel Cron) rodando às 7h
- Sem banco, sem estado, só leitura e envio
Prompt completo para Claude Code
Cole no Claude Code dentro de uma pasta vazia:
Crie um robô de triagem de WhatsApp em Node.js + TypeScript.
Estrutura:
src/
baileys/client.ts // conecta como aparelho secundário, sessão persistida
baileys/read-recent.ts // lê últimas 12h de todas as conversas
ai/classify.ts // chama Claude pra classificar
ai/summarize.ts // chama Claude pra gerar resumo final
channels/send.ts // dispara resumo via WhatsApp Cloud API
cron.ts // dispara todo dia às 7h
config/categorias.ts // regras de classificação editáveis
Fluxo (executa às 7h via cron):
1. baileys/client.ts: conecta como aparelho secundário do seu WhatsApp
2. baileys/read-recent.ts:
- Lê store de mensagens das últimas 12 horas
- Filtra fora: status, broadcast, mensagens enviadas por você
- Agrupa por conversa, mantém timestamp original
- Retorna array: [{ conversa, autor, timestamp, texto }]
3. ai/classify.ts: pra cada conversa, chama Claude com prompt:
"Você classifica conversas de WhatsApp pelo nível de urgência.
Conversa com ${nome}:
${mensagens}
Categorias:
- URGENTE: pede resposta hoje, tem prazo, é cliente pagante ou família
- IMPORTANTE: precisa resposta nos próximos 2 dias, oportunidade
- PODE_ESPERAR: grupo aleatório, marketing, oferta, sem prazo
Retorne JSON: {
categoria: 'URGENTE' | 'IMPORTANTE' | 'PODE_ESPERAR',
motivo: 'em 1 linha por que essa categoria',
acao_sugerida: 'em 1 frase o que fazer'
}"
4. ai/summarize.ts: agrega resultado e gera resumo final:
"Monte um resumo de manhã pra um operador ocupado.
URGENTES:
${listaUrgentes}
IMPORTANTES:
${listaImportantes}
Regras:
- Português, 5 linhas no total
- Comece com 'Bom dia, hoje cedo:'
- Liste só urgentes e importantes (pode esperar fica de fora)
- Pra cada item: nome (categoria) e ação em 1 frase
- Termine com contagem: 'PODE_ESPERAR: X conversas'"
5. channels/send.ts: enviar o resumo via WhatsApp Cloud API
pro seu próprio número (auto envio)
Cron:
cron.ts usa node-cron expressão '0 7 * * *' (7h todo dia).
Em produção, rodar em Railway com Dockerfile Node 22.
Variáveis de ambiente:
ANTHROPIC_API_KEY
WHATSAPP_CLOUD_TOKEN
WHATSAPP_CLOUD_PHONE_ID
SEU_NUMERO_WHATSAPP
BAILEYS_SESSION_PATH
Tratamento de erro:
- Se Baileys cair, manda mensagem 'Robô caiu, vai precisar reconectar'
- Se Claude falhar em alguma conversa, marca como PODE_ESPERAR e segue
- Log estruturado de cada execução pra auditoriaComo conectar ao WhatsApp
- Use o Baileys, biblioteca não oficial que conecta como aparelho secundário
- Rode o robô uma vez localmente, ele imprime QR code no terminal
- Abra WhatsApp no celular: Configurações > Aparelhos conectados > Conectar
- Escaneie o QR, a sessão fica salva em arquivo
- Em produção, suba o arquivo de sessão como volume persistente
Como definir suas categorias
- O prompt vem com URGENTE, IMPORTANTE e PODE_ESPERAR como padrão
- Você adapta os critérios no arquivo config/categorias.ts
- Exemplo: pra advogado, "cliente com audiência hoje" sempre URGENTE
- Pra agência, "cliente pagante pedindo ajuste" sempre URGENTE
- Quanto mais específico o critério, melhor a IA classifica
Configurar cron 7h
- Em Node local: node-cron com expressão "0 7 * * *"
- Em Railway: definir CRON_SCHEDULE no painel ou rodar como worker contínuo
- Em Vercel: criar arquivo vercel.json com schedule "0 7 * * *" (timezone America/Sao_Paulo)
- Testar antes em horário acessível mudando pra "*/5 * * * *" (a cada 5 min)
- Depois de validar, volta pra 7h e fica rodando sozinho
Perguntas frequentes
O robô lê mensagem pessoal sem eu saber?
Ele lê o histórico que já está no seu próprio WhatsApp (conectado via Baileys como aparelho secundário, com seu QR code). Nenhum dado vai pra fora exceto o texto cru enviado pra Anthropic, que não armazena prompts via API. Nada fica salvo em banco.
Funciona com grupos?
Funciona. O Baileys lê grupos do mesmo jeito que conversas individuais. Mas pra grupos com muita gente, o robô tende a classificar como PODE_ESPERAR porque dificilmente um grupo tem prazo urgente pra você. Você pode forçar um grupo específico como URGENTE no config.
O Claude classifica errado às vezes?
Erra em casos ambíguos, principalmente quando a mensagem é vaga ("oi, tudo bem?"). A taxa de erro fica abaixo de 8% na prática. Como o resumo agrega só urgentes e importantes, mesmo um erro de classificação raramente esconde algo crítico.
Posso configurar pra rodar mais de uma vez por dia?
Pode. Edite o cron pra "0 7,12,18 * * *" e o robô roda às 7h, meio dia e 18h. Cada execução cobre as últimas 12h de mensagens. Útil pra quem opera fora de horário comercial.
Por que WhatsApp Cloud API pra enviar e Baileys pra ler?
O Baileys lê o seu histórico real, com todas as conversas. A Cloud API é o canal oficial e estável pra enviar o resumo de manhã, sem risco de cair. Você usa cada ferramenta no que ela faz melhor.
Quer implementar isso?
Me chama no WhatsApp. Ajudo você a configurar ou implemento pra você.
Quero ajuda no WhatsAppGastão Matos
@gastaomatos