Demonstração
Gere uma lista de demonstração de ~10 contatos enriquecidos com exemplos de mensagens personalizadas, acionada por um prompt de webhook.
Leia ~/.claude/skills/gtm-pipeline/_shared/conventions.md antes de executar.
Quando Usar
- Gatilho de webhook: o usuário envia um formulário de demonstração gratuito descrevendo seu público-alvo
- Objetivo: provar que o agente de IA escreve prospecção autêntica e não genérica usando leads reais
- Escopo: ~10 contatos, enriquecidos com LinkedIn + e-mail, 2–4 exemplos de mensagens
Restrições da Demonstração
- Sem enriquecimento de telefone — apenas e-mail
- ~10 contatos (solicite 10–15, espere perda por enriquecimento)
- A geração de mensagens é opcional, mas recomendada
- A busca de sinais é opt-in — desligada por padrão. Ative via flag
--with-signalsou solicitação explícita do usuário. Veja Etapa 5.5. - Barreira de custo: antes da primeira chamada paga a um provedor, informe o gasto esperado (pesquisas no Finder por People-Source Cadence são principalmente gratuitas; ~10–15 créditos de enriquecimento de e-mail; sinais <$0,50 se ativados). Interativo: confirme com o usuário primeiro. Autônomo: registre a estimativa em
run_log.mde prossiga, nunca bloqueie.
Etapa 1 — Analisar o Prompt e Estabelecer o ICP
O prompt do webhook descreve o público-alvo do usuário. Extraia:
Obrigatório:
- O que você vende / oferece?
- Quem é seu cliente ideal? (setor, cargo, porte da empresa, localização)
- Qual é sua proposta de valor?
- Qual tom? (formal vs. casual, exemplos se possível)
- Isso é para recrutamento OU venda para clientes?
Se não estiver no prompt, infira (não pare):
- Cargos-alvo, localização, porte/tipo de empresa
Resolva automaticamente o solicitante antes de interpretar o público (corrige a lacuna recorrente "o que eles vendem / por que querem esse público"):
- Resolva o próprio domínio do solicitante a partir do e-mail dele (ex.:
[email protected]→acme.de), faça scraping/enriquecimento e estabeleça o que eles vendem. Empresas com múltiplas ofertas: confirme qual linha de produto a demonstração é para — o produto declarado no prompt pode não corresponder ao real. - Determine o relacionamento com o público-alvo — um termo-alvo (ex.: "centrais de atendimento") geralmente é um segmento para o qual vendem, não o que eles são. Classifique: vender-para / comprar-de / adquirir / fazer-parceria / recrutar. As palavras-chave de persona derivam disso, não de um palpite.
Interativo vs. implantado (autônomo):
- Interativo: se um campo obrigatório for genuinamente ambíguo após a resolução automática, faça uma pergunta esclarecedora concisa. Caso contrário, prossiga.
- Implantado / autônomo (invocado via
claude -pdo webhook — veja Implantação): nunca bloqueie com perguntas. Infira cada campo a partir do prompt + pesquisa do domínio do solicitante, registre as suposições emcontext/icp.mdsob um título "Suposições" e prossiga de ponta a ponta.
NÃO prossiga para a pesquisa até que o ICP esteja claro o suficiente para construir um filtro significativo.
Salve ICP em: {slug-do-cliente}-gtm/context/icp.md (inclua a oferta, a classificação de relacionamento e quaisquer suposições autônomas).
Etapa 2 — Criar Diretório de Trabalho
Crie a estrutura de diretórios {slug-do-cliente}-gtm/ conforme definido em conventions.md. Escreva a definição do ICP em context/icp.md.
Etapa 3 — Pesquisa de Pessoas (10 contatos)
Use a skill people-search para encontrar ~10–15 contatos.
Seleção de provedor para demonstração: siga o cadence do finder em conventions.md → People-Source Cadence — FullEnrich Finder → BetterContact → Pipe0 → Amplemarket/Crustdata (último recurso) , máximo 2 tentativas/fonte, FE-first para segmentos de PME/liderados por proprietário/não-inglês. Tanto FE quanto BC retornam URLs do LinkedIn diretamente (necessário para enriquecimento de e-mail). Se não houver lista de empresas (prompt baseado em persona), use Parallel FindAll ou BC Search. Para listas de empresas provenientes de diretório/scraping, pesquise pelo nome da empresa + localização, nunca pelo domínio exato (conventions #11).
Campos principais a coletar:
nome_completo, primeiro_nome, último_nome,
cargo, nome_empresa, domínio_empresa,
url_perfil_linkedin, localização
Siga o protocolo de execução do people-search: sandbox → teste → revisão → execução.
Etapa 4 — Filtro de Contatos (Classificação por ICP)
Execute contact-filter nos 10–15 contatos encontrados. Mesmo lotes pequenos se beneficiam da classificação por ICP — ela garante que a etapa de enriquecimento foque nos contatos com melhor ajuste.
- Aplica classificação de cargo, setor, localização e porte da empresa
- Rejeita contratos que não se encaixam no ICP (rejeição forte)
- Classifica contatos aprovados por prioridade
- Saída:
csv/intermediate/contacts_filtered.csv
Para demonstrações: use um limite de rejeição forte relaxado (permita que níveis 1–5 passem), priorize a classificação sobre a filtragem.
Etapa 5 — Enriquecimento de Pessoas (Apenas E-mail)
Execute people-enrichment nos contatos filtrados. Modo demonstração: apenas e-mail, sem telefone.
Fluxo recomendado:
- FullEnrich v2 (e-mail) — todos os contatos
- Pipe0 waterfall — apenas para falhas do FE
Enriquecimento adicional para personalização de mensagens (se disponível):
- Título e resumo do LinkedIn (via scraping do LinkedIn com PhantomBuster)
- Postagens recentes no LinkedIn (2–3 por contato) — melhora significativamente a qualidade da mensagem
Campos mínimos viáveis para geração de mensagens:
nome, cargo, nome_empresa, url_perfil_linkedin,
título (opcional), resumo (opcional), postagens_recentes (opcional)
Baixo rendimento: se menos de ~8 contatos sobreviverem à filtragem + enriquecimento, execute uma passagem adicional do finder (próxima fonte no People-Source Cadence) antes de prosseguir para as mensagens.
Etapa 5.5 — Busca de Sinais (Opcional)
Padrão: DESLIGADO. Ative quando:
- O usuário pedir explicitamente por mensagens ancoradas em sinais
- O prompt do webhook mencionar gatilhos de compra (financiamento, contratação, transformação, notícias recentes)
- A oferta do cliente depender de sinais de timing para fazer sentido (ex.: "ajudamos empresas pós-Série A a escalar operações")
- Uma flag
--with-signalsfor passada na invocação da demonstração
Nota de custo: adiciona ~$0,01–0,05 por empresa única (pesquisa web + pontuação). Em uma demonstração de 10 contatos, normalmente são 5–10 empresas únicas, portanto <$0,50.
Entradas necessárias para busca de sinais
A busca de sinais precisa de três arquivos de contexto:
context/icp.md— já coletado na Etapa 1context/offering.md— o bloco de proposta de valor da Etapa 1 (escreva agora se ainda não foi salvo)context/signal_criteria.md— lista com marcadores dos tipos de sinal relevantes para a oferta
Se signal_criteria.md não existir, pergunte ao usuário: "O que uma empresa estaria fazendo agora que sugere que ela precisa do que você oferece?" — capture 5–10 marcadores e salve.
Execução
# Construir lista de empresas a partir de empresas únicas nos contatos enriquecidos
python3 -c "
import csv, sys
vistos = set()
with open('csv/output/contacts_enriched.csv') as f, open('csv/input/companies_raw.csv', 'w', newline='') as out:
reader = csv.DictReader(f)
writer = csv.DictWriter(out, fieldnames=['company_name', 'company_domain', 'company_website'])
writer.writeheader()
for row in reader:
c = row.get('company_name') or row.get('company') or ''
if c and c not in vistos:
vistos.add(c)
writer.writerow({
'company_name': c,
'company_domain': row.get('company_domain') or '',
'company_website': row.get('company_website') or row.get('website') or '',
})
"
# Executar busca de sinais nas empresas únicas
source \"$HOME/.claude/skills/gtm-pipeline/_shared/resolve_env.sh\" && \
export $(grep -E '^(PARALLEL_API_KEY|OPENROUTER_API_KEY|FIRECRAWL_API_KEY|GEMINI_API_KEY)=' \"$GTM_ENV_PATH\" | xargs) && \
python3 ~/.claude/skills/gtm-signal-search/signal_search.py \
--client-dir {slug-do-cliente}-gtm
A linha source resolve_env.sh garante que $GTM_ENV_PATH esteja definido mesmo em um shell novo (veja signal-search SKILL.md / conventions). Para a demonstração, deixe Firecrawl e Parallel enrichment DESLIGADOS — pesquisa web + pontuação é suficiente para uma lista de ~10 contatos. Ative Firecrawl apenas se o conteúdo do site (carreiras, blog) for a fonte primária de sinais; se esta máquina tiver Firecrawl apenas via MCP (sem FIRECRAWL_API_KEY), use a rota --firecrawl-pages-dir documentada na skill signal-search.
Mesclar sinais de volta aos contatos
import csv, json
sinais = {}
with open('csv/intermediate/signals.csv') as f:
for row in csv.DictReader(f):
sinais[row['company_name']] = {
'overall_score': row.get('overallScore', ''),
'scored_signals': row.get('scoredSignals', ''),
'overall_summary': row.get('overallSummary', ''),
}
linhas_saida = []
with open('csv/output/contacts_enriched.csv') as f:
for row in csv.DictReader(f):
s = sinais.get(row.get('company_name') or row.get('company') or '', {})
row['company_overall_score'] = s.get('overall_score', '')
row['company_scored_signals'] = s.get('scored_signals', '')
row['company_overall_summary'] = s.get('overall_summary', '')
linhas_saida.append(row)
with open('csv/output/contacts_enriched.csv', 'w', newline='') as f:
w = csv.DictWriter(f, fieldnames=list(linhas_saida[0].keys()))
w.writeheader()
w.writerows(linhas_saida)
A etapa de geração de mensagens na Etapa 6 terá então company_overall_summary e company_scored_signals por contato — use o sinal com maior pontuação como gancho da mensagem.
Etapa 6 — Gerar Exemplos de Mensagens
Gere 2–4 mensagens de amostra antes de se comprometer com o lote completo.
Estrutura da Mensagem
Cada mensagem deve seguir: Gancho → Ponte → Oferta → CTA Suave
| Parte | Propósito | Tamanho |
|---|---|---|
| Gancho | Referencie algo específico desta pessoa (postagem, movimento de carreira, sinal da empresa) | 1 frase |
| Ponte | Conecte a situação deles à sua oferta | 1 frase |
| Oferta | O que você fornece, claramente declarado | 1 frase |
| CTA | Pedido suave — não "vamos agendar uma reunião" | 1 frase |
Total: 320–450 caracteres. Sem linha em branco após a saudação. Parágrafos separados por uma quebra de linha.
Regras de Qualidade
Obrigatório:
- Gancho específico (referência a postagem OU insight de carreira OU sinal de compra pontuado — não genérico)
- Proposta de valor clara
- Tom natural e conversacional
- CTA suave
Deve evitar:
- Repetir informações do perfil que eles já conhecem ("Você trabalha como X na Y")
- Observações genéricas ("trajetória impressionante", "notei que você está em [setor]")
- Jargão corporativo ou palavras-chave
- CTAs agressivas ("Vamos agendar uma reunião esta semana")
Se a Etapa 5.5 foi executada: para cada contato, prefira o sinal com maior pontuação de company_scored_signals como gancho, em vez de referências genéricas a postagens do LinkedIn. Um sinal com pontuação >= 70 ancorado em notícias reais recentes é o gancho mais forte que a demonstração pode produzir.
Processo de Geração
- Escreva um prompt de sistema específico do cliente (salve em
prompts/message_prompt.md) - Gere 2–4 amostras — inclua contatos com e sem postagens do LinkedIn
- Revise de acordo com a lista de verificação de qualidade acima
- Se houver problemas, refine o prompt de sistema e regenere
- Só gere em lote após a qualidade ser aprovada
Modelo de Prompt de Sistema (seções principais)
- Contexto do cliente: o que eles vendem, para quem segmentam, sua proposta de valor, tom
- Regras proibidas: sem repetição de perfil, sem elogios genéricos
- Estrutura da mensagem: gancho → ponte → oferta → CTA
- Exemplos de gancho: com postagens / sem postagens
- Limite de caracteres: 320–450
Etapa 7 — Sanitizar & Exportar
Etapa 7a — Sanitizar (obrigatório, determinístico, sem LLM). csv/intermediate/ mantém todos os campos. Antes de construir qualquer coisa voltada para o lead, execute o sanitizador compartilhado para que a limpeza manual recorrente (rótulos de provedor, colunas vazias, e-mails inválidos, sinais desatualizados) aconteça.