Outbound B2B
Comente COLDMAIL no Instagram @gastaomatos

Cold Email B2B Personalizado por IA

Cold email genérico cai no spam ou ofende. Cold email personalizado pelo que a empresa fez no último mês abre. A IA faz a pesquisa por você, em escala, sem perder a personalização real.

O que muda quando o email é personalizado

  • Taxa de abertura sai de 12% (genérico) para 45 a 60% (personalizado real)
  • Taxa de resposta sai de 0,5% para 4 a 8%
  • Você fala com decisor sênior porque o email tem contexto
  • Você não precisa de Apollo, Lemlist nem ferramenta paga
  • Você não dispara em massa, dispara 20 cuidados por semana

Stack

  • Node.js 22 + TypeScript
  • Cheerio para scraping leve do site público
  • Anthropic Claude API para gerar o email
  • Resend ou Postmark para envio com bom IP de envio
  • Postgres (Neon ou Supabase) pra registrar quem recebeu o quê
  • Vercel Cron pra disparar no horário programado

Prompt completo para Claude Code

Cole no Claude Code dentro de uma pasta vazia:

prompt
Crie um sistema de cold email B2B personalizado em Node.js + TypeScript.

Schema (Drizzle + Neon):

target_companies (
  id text primary key,
  name text not null,
  website text not null,
  industry text,
  contact_email text not null,
  contact_name text,
  contact_role text,
  research_summary text,  // resumo do que a IA descobriu
  scheduled_send_at timestamp,
  sent_at timestamp,
  status text default 'pendente',  // pendente | pesquisada | aprovada | enviada | respondeu | descartada
  created_at timestamp default now()
)

email_drafts (
  id text primary key,
  company_id text references target_companies(id),
  subject text not null,
  body text not null,
  approved boolean default false,
  created_at timestamp default now()
)

Pipeline em 4 fases:

FASE 1, INGESTAO:
Endpoint POST /api/companies que recebe um array de até 20 empresas
[{ name, website, contact_email, contact_name, contact_role }]
e insere todas com status = 'pendente'.

FASE 2, PESQUISA:
Worker /workers/research.ts que pega empresas com status = 'pendente'.
Para cada uma:
1. fetch(website) com timeout 10s
2. Cheerio extrai: title, meta description, headlines (h1, h2),
   links de menu, bloco "sobre" se existir
3. Passa o texto extraído pro Claude com prompt:
   "Você analisa sites B2B pra ajudar a personalizar outbound.
    Site: ${url}. Conteúdo extraído: ${textoLimpo}.

    Retorne JSON com:
    {
      'foco_principal': 'em 1 frase o que a empresa faz',
      'momento_atual': 'evidência do site de algo recente (lancamento, prêmio, vaga)',
      'angulo_personalizacao': 'gancho específico pra abertura de email'
    }"
4. Salvar em research_summary, status = 'pesquisada'

FASE 3, GERACAO:
Worker /workers/generate.ts que pega empresas com status = 'pesquisada'.
Para cada uma, chama Claude:

   "Escreva um cold email B2B em português.
    Para: ${contact_name}, ${contact_role} da ${company.name}
    Pesquisa: ${research_summary}
    Quem envia: [SEU NOME, sua empresa]
    Oferta: [SUA OFERTA EM 1 LINHA]

    Regras:
    - 5 linhas no corpo (não conte assunto)
    - Linha 1: gancho específico do momento_atual
    - Linha 2: ponte da pesquisa pra dor
    - Linha 3: solução em 1 frase, sem jargão
    - Linha 4: prova rápida (cliente real ou número)
    - Linha 5: pergunta de 1 linha pedindo 15 minutos
    - Sem 'espero que esteja bem', sem 'tudo bem?'
    - Sem 'líder', 'expert', 'guru', 'transformar'

    Retorne JSON: { subject, body }"

Salvar em email_drafts.

FASE 4, ENVIO:
Endpoint /admin com lista de drafts pra aprovação manual (1 minuto por draft).
Você marca approved = true.

Cron de envio (terça e quarta às 8h30):
- SELECT drafts WHERE approved = true AND company.sent_at IS NULL LIMIT 10
- Pra cada um: enviar via Resend
  From: 'Seu Nome <seu@dominio.com>'
  Reply-To: mesmo
  To: contact_email
  Headers: List-Unsubscribe + mailto:unsubscribe@dominio.com
  Body: corpo do draft + assinatura padronizada + linha "Se preferir não receber, responda SAIR"
- Atualizar sent_at, status = 'enviada'

Compliance:
- Domínio com SPF, DKIM e DMARC configurados antes do primeiro envio
- Header List-Unsubscribe obrigatório
- Linha de opt-out manual em todo email
- Endpoint webhook /api/email-reply: se body contém "SAIR", marca empresa
  como 'descartada' e nunca mais envia

Variáveis de ambiente:
DATABASE_URL
ANTHROPIC_API_KEY
RESEND_API_KEY
SEND_FROM_EMAIL
SEND_FROM_NAME

Deploy: Vercel para o app web + workers via Vercel Cron.

Como montar a lista de 20 empresas

  • Defina o ICP (Ideal Customer Profile) em 3 critérios: setor, porte e cargo do decisor
  • Use LinkedIn Sales Navigator (versão grátis dá conta) para listar empresas que batem
  • Para cada empresa, encontre o email do decisor: Hunter, Apollo grátis, ou padrão no site
  • Bata 20 contas como meta semanal, foco em qualidade não quantidade
  • Coloque tudo num CSV: name, website, contact_email, contact_name, contact_role
  • POST esse CSV no endpoint /api/companies do agente

Régua de envio (terça e quarta cedo)

  • Terça e quarta entre 8h e 9h30 são os horários de maior abertura para B2B no Brasil
  • Nunca dispare segunda (caixa cheia) nem sexta (modo desligando)
  • Limite 10 envios por dia, no máximo. Volume maior queima reputação do domínio
  • Espace 90 segundos entre cada envio para o servidor de destino
  • Se um destinatário responder, o agente para automaticamente os próximos toques pra ele

Compliance (RFC 5322, opt-out)

  • RFC 5322 exige From, To, Date e Subject válidos, sem aspas estranhas no nome do remetente
  • Header List-Unsubscribe permite que o Gmail e Outlook ofereçam botão de cancelamento na própria caixa
  • Frase de opt-out no fim ("responda SAIR pra não receber mais") é exigência da LGPD em mensagens comerciais
  • Domínio com SPF + DKIM + DMARC reduz cair em spam em 80%
  • Quem disser SAIR vai para uma blacklist permanente, nunca mais recebe nada seu

Perguntas frequentes

Não é spam mandar cold email B2B sem opt-in?

A LGPD permite contato B2B com finalidade legítima (oferta comercial relacionada à atividade da empresa), desde que tenha identificação clara do remetente e canal de opt-out fácil. Não é spam quando o email é personalizado, individual e o destinatário tem caminho claro para sair.

Posso disparar 200 emails por dia em vez de 10?

Pode tecnicamente, mas a reputação do seu domínio cai e os emails vão pro spam. Provedores como Resend e Postmark limitam contas novas justamente pra você crescer devagar. 10 por dia bem feitos rendem mais resposta que 200 mal feitos.

Por que aprovação manual em vez de envio automático?

Porque cold email ruim queima sua marca. A IA gera um rascunho bom, você revisa em 1 minuto, ajusta uma linha se precisar e aprova. Esse passo manual elimina 90% dos casos em que a IA inventa um detalhe ou erra a personalização.

Resend ou Postmark, qual escolher?

Resend é melhor pra começar, plano grátis de 3 mil envios por mês e API limpa. Postmark é melhor pra volume médio em diante, reputação de IP histórica e suporte mais maduro. Para os primeiros 6 meses, Resend resolve.

O Claude não inventa detalhes da empresa?

Pode inventar se você passar pouco contexto. Por isso a fase de pesquisa extrai texto real do site (Cheerio) antes da geração, e o prompt instrui a usar só o que está no resumo. Se não tiver evidência clara, o Claude é instruído a deixar a linha 1 mais genérica em vez de inventar.

Quer implementar isso?

Me chama no WhatsApp. Ajudo você a configurar ou implemento pra você.

Quero ajuda no WhatsApp
DT

Gastão Matos

@gastaomatos