keinsaasforever/gtm-pipeline-skills

Habilidades do Claude para vendas B2B

O que é gtm-pipeline-skills?

Esta skill do Claude automatiza a geração de uma lista de demonstração (demo) de contatos B2B enriquecidos com exemplos de mensagens personalizadas, acionada por um webhook. Ela é ideal para equipes de vendas que desejam provar o valor de um agente de IA na criação de prospecção autêntica e não genérica. A skill executa um pipeline completo: interpreta a persona do cliente ideal (ICP) a partir de um prompt ou domínio do solicitante, realiza pesquisa e enriquecimento de contatos (apenas e-mail) usando ferramentas como FullEnrich e BetterContact, filtra e ranqueia leads com base no ICP, realiza busca opcional de sinais de compra (com um flag `--with-signals`), e gera de 2 a 4 mensagens de exemplo seguindo uma estrutura de Hook → Ponte → Oferta → CTA suave. Todo o processo é custo-consciente, com limites de ~10 contatos e sem bloqueio em modo headless ou implantado. O resultado final é exportado como CSV sanitizado e um log em Markdown.

Funciona com✓Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add keinsaasforever/gtm-pipeline-skills

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

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-signals ou 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.md e 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"):

  1. 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.
  2. 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 -p do 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 em context/icp.md sob 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:

  1. FullEnrich v2 (e-mail) — todos os contatos
  2. 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-signals for 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 1
  • context/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

PartePropósitoTamanho
GanchoReferencie algo específico desta pessoa (postagem, movimento de carreira, sinal da empresa)1 frase
PonteConecte a situação deles à sua oferta1 frase
OfertaO que você fornece, claramente declarado1 frase
CTAPedido 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

  1. Escreva um prompt de sistema específico do cliente (salve em prompts/message_prompt.md)
  2. Gere 2–4 amostras — inclua contatos com e sem postagens do LinkedIn
  3. Revise de acordo com a lista de verificação de qualidade acima
  4. Se houver problemas, refine o prompt de sistema e regenere
  5. 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.

Habilidades Relacionadas