CommunityProgramación y desarrollogithub.com

keinsaasforever/gtm-pipeline-skills

Habilidades de Claude para ventas B2B

¿Qué es gtm-pipeline-skills?

Esta habilidad de Claude automatiza la prospección de ventas B2B, guiando al agente de IA a través de un pipeline completo desde la interpretación de la solicitud hasta la generación de mensajes personalizados. Es ideal para demostraciones de ventas, permitiendo probar la capacidad del agente para investigar y redactar mensajes outreach auténticos. El flujo incluye: (1) parsear la solicitud webhook y establecer el perfil de cliente ideal (ICP), (2) buscar contactos con la habilidad people-search, (3) filtrar según criterios ICP, (4) enriquecer contactos con email, (5) opcionalmente buscar señales de compra, (6) generar 2-4 ejemplos de mensajes de prueba y (7) sanitizar y generar el archivo CSV final. La habilidad soporta entornos interactivos y headless, con control de costos y selección de proveedores. El resultado es un archivo CSV con contactos enriquecidos y snippets de mensajes, listo para revisión.

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

Installed? Explore more Programación y desarrollo skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Guía de Demostración del Pipeline GTM

Genera una lista de prospectos de demostración de ~10 contactos enriquecidos con ejemplos de mensajes personalizados, activada por un prompt de webhook.

Lee ~/.claude/skills/gtm-pipeline/_shared/conventions.md antes de ejecutar.


Cuándo usar

  • Activación webhook: el usuario envía un formulario de demostración gratuito describiendo su audiencia objetivo
  • Objetivo: demostrar que el agente de IA redacta mensajes outreach auténticos y no genéricos usando prospectos reales
  • Alcance: ~10 contactos, enriquecidos con LinkedIn + email, 2–4 ejemplos de mensajes

Restricciones de la demostración

  • Sin enriquecimiento telefónico — solo email
  • ~10 contactos (solicita 10–15, espera caída por enriquecimiento)
  • La generación de mensajes es opcional pero recomendada
  • La búsqueda de señales es optativa — desactivada por defecto. Actívala con el flag --with-signals o por solicitud explícita del usuario. Ver Paso 5.5.
  • Límite de costos: antes de la primera llamada a un proveedor pago, indica el gasto esperado (las búsquedas por fuente de personas en People-Source Cadence son mayormente gratuitas; ~10-15 créditos de enriquecimiento de email; señales <$0.50 si está activado). Interactivo: confirma con el usuario primero. Headless: registra el estimado en run_log.md y continúa, nunca bloquees.

Paso 1 — Interpretar el Prompt y Establecer el ICP

El prompt del webhook describe la audiencia objetivo del usuario. Extrae:

Obligatorio:

  • ¿Qué vendes / ofreces?
  • ¿Quién es tu cliente ideal? (industria, rol, tamaño de empresa, ubicación)
  • ¿Cuál es tu propuesta de valor?
  • ¿Qué tono? (formal vs. informal, ejemplos si es posible)
  • ¿Es para reclutar O vender a clientes?

Si no está en el prompt, infiere (no te detengas):

  • Títulos de trabajo objetivo, ubicación, tamaño/tipo de empresa

Resuelve automáticamente al solicitante antes de interpretar la audiencia (soluciona la brecha recurrente de "¿qué venden / por qué quieren esta audiencia?"):

  1. Resuelve el dominio del solicitante a partir de su correo electrónico (ej. [email protected] → acme.de), scrapea/enríquelo y establece qué ellos venden. Empresas con múltiples ofertas: confirma qué línea de producto es para la demostración — el producto declarado en el prompt puede no coincidir con el real.
  2. Determina la relación con la audiencia objetivo — un término objetivo (ej. "centros de llamadas") suele ser un segmento al que venden, no lo que son. Clasifica: vender-a / comprar-de / adquirir / asociarse / reclutar. Las palabras clave de persona derivan de esto, no de una suposición.

Interactivo vs desplegado (headless):

  • Interactivo: si un campo obligatorio es genuinamente ambiguo después de la auto-resolución, haz una pregunta aclaratoria concisa. De lo contrario, continúa.
  • Desplegado / headless (invocado mediante claude -p desde el webhook — ver Despliegue): nunca bloquees con preguntas. Infiere cada campo a partir del prompt + la investigación del dominio del solicitante, registra las suposiciones en context/icp.md bajo un encabezado "Suposiciones", y procede de principio a fin.

NO procedas a la búsqueda hasta que el ICP esté lo suficientemente claro como para construir un filtro significativo.

Guarda el ICP en: {slug-cliente}-gtm/context/icp.md (incluye la oferta, la clasificación de la relación y cualquier suposición headless).


Paso 2 — Crear el directorio de trabajo

Crea la estructura de directorios {slug-cliente}-gtm/ como se define en conventions.md. Escribe la definición del ICP en context/icp.md.


Paso 3 — Búsqueda de personas (10 contactos)

Usa la habilidad people-search para encontrar ~10–15 contactos.

Selección de proveedor para la demostración: sigue la cadencia de fuentes en conventions.md → People-Source Cadence — FullEnrich Finder → BetterContact → Pipe0 → Amplemarket/Crustdata (último recurso) , máximo 2 intentos/fuente, FE-primero para segmentos PYME/dirigidos por propietarios/no ingleses. Tanto FE como BC devuelven URLs de LinkedIn directamente (necesario para enriquecimiento de email). Si no hay lista de empresas (prompt basado en persona), usa Parallel FindAll o BC Search. Para listas de empresas obtenidas por directorio/scraping, busca por nombre de empresa + ubicación, nunca por dominio exacto (convenciones #11).

Campos clave a recopilar:

full_name, first_name, last_name,
job_title, company_name, company_domain,
linkedin_profile_url, location

Sigue el protocolo de ejecución de people-search: sandbox → prueba → revisión → ejecución.


Paso 4 — Filtro de contactos (Clasificación ICP)

Ejecuta contact-filter en los 10–15 contactos encontrados. Incluso los lotes pequeños se benefician de la clasificación ICP: asegura que el paso de enriquecimiento se centre en los contactos con mejor ajuste.

  • Aplica nivel de trabajo, nivel de industria, nivel de ubicación y clasificación de tamaño de empresa
  • Rechaza contactos que definitivamente no son ICP
  • Clasifica los contactos aprobados por prioridad
  • Salida: csv/intermediate/contacts_filtered.csv

Para demostraciones: usa un umbral de rechazo relajado (permite que pasen los niveles 1–5), prioriza la clasificación sobre el filtrado.


Paso 5 — Enriquecimiento de personas (solo email)

Ejecuta people-enrichment en los contactos filtrados. Modo demostración: solo email, sin teléfono.

Flujo recomendado:

  1. FullEnrich v2 (email) — todos los contactos
  2. Pipe0 waterfall — solo para fallos de FE

Enriquecimiento adicional para personalización de mensajes (si está disponible):

  • Titular y resumen de LinkedIn (de scrapeo de LinkedIn mediante PhantomBuster)
  • Publicaciones recientes de LinkedIn (2–3 por contacto) — mejora significativamente la calidad del mensaje

Campos mínimos viables para generación de mensajes:

name, job_title, company_name, linkedin_profile_url,
headline (opcional), summary (opcional), recent_posts (opcional)

Bajo rendimiento: si menos de ~8 contactos sobreviven al filtrado + enriquecimiento, realiza un pase adicional de búsqueda (siguiente fuente en People-Source Cadence) antes de proceder a los mensajes.


Paso 5.5 — Búsqueda de señales (Opcional)

Por defecto: DESACTIVADA. Actívala cuando:

  • El usuario solicita explícitamente mensajes basados en señales
  • El prompt del webhook menciona desencadenantes de compra (financiación, contratación, transformación, noticias recientes)
  • La oferta del cliente depende de señales de sincronización para tener sentido (ej. "ayudamos a empresas post-Series-A a escalar operaciones")
  • Se pasa un flag --with-signals a la invocación de la demostración

Nota de costo: añade ~$0.01–0.05 por empresa única (búsqueda web + puntuación). En una demostración de 10 contactos, eso suele ser 5–10 empresas únicas, por lo que <$0.50.

Entradas requeridas para signal-search

Signal-search necesita tres archivos de contexto:

  • context/icp.md — ya recopilado en el Paso 1
  • context/offering.md — el bloque de propuesta de valor del Paso 1 (escríbelo ahora si aún no está guardado)
  • context/signal_criteria.md — lista con viñetas de tipos de señales relevantes para la oferta

Si signal_criteria.md no existe, pregunta al usuario: "¿Qué estaría haciendo una empresa en este momento que sugiera que necesita lo que ofreces?" — captura de 5 a 10 viñetas y guárdalas.

Ejecución

# Construye la lista de empresas a partir de empresas únicas en los contactos enriquecidos
python3 -c "
import csv, sys
seen = 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 seen:
            seen.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 '',
            })
"

# Ejecuta signal-search en las 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-cliente}-gtm

La línea source resolve_env.sh garantiza que $GTM_ENV_PATH esté establecido incluso en un shell nuevo (ver signal-search SKILL.md / convenciones). Para la demostración, deja Firecrawl y Parallel enrichment DESACTIVADOS — búsqueda web + puntuación es suficiente para una lista de prospectos de ~10 contactos. Activa Firecrawl solo si el contenido del sitio (carreras, blog) es la fuente principal de señales; si esta máquina tiene Firecrawl solo a través de MCP (sin FIRECRAWL_API_KEY), usa la ruta --firecrawl-pages-dir documentada en la habilidad signal-search.

Fusiona las señales de vuelta a los contactos

import csv, json
signals = {}
with open('csv/intermediate/signals.csv') as f:
    for row in csv.DictReader(f):
        signals[row['company_name']] = {
            'overall_score': row.get('overallScore', ''),
            'scored_signals': row.get('scoredSignals', ''),
            'overall_summary': row.get('overallSummary', ''),
        }

rows_out = []
with open('csv/output/contacts_enriched.csv') as f:
    for row in csv.DictReader(f):
        s = signals.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', '')
        rows_out.append(row)

with open('csv/output/contacts_enriched.csv', 'w', newline='') as f:
    w = csv.DictWriter(f, fieldnames=list(rows_out[0].keys()))
    w.writeheader()
    w.writerows(rows_out)

El paso de generación de mensajes en el Paso 6 tendrá entonces company_overall_summary y company_scored_signals por contacto — usa la señal con mayor puntuación como gancho del mensaje.


Paso 6 — Generar ejemplos de mensajes

Genera de 2 a 4 mensajes de muestra antes de comprometerte con el lote completo.

Estructura del mensaje

Cada mensaje debe seguir: Gancho → Puente → Oferta → CTA suave

PartePropósitoExtensión
GanchoRefiere algo específico de esta persona (publicación, movimiento profesional, señal de la empresa)1 oración
PuenteConecta su situación con tu oferta1 oración
OfertaLo que ofreces, claramente indicado1 oración
CTASolicitud suave — no "programemos una llamada"1 oración

Total: 320–450 caracteres. Sin línea en blanco después del saludo. Párrafos separados por un salto de línea simple.

Reglas de calidad

Debe tener:

  • Gancho específico (referencia a publicación O conocimiento profesional O señal de compra puntuada — no genérico)
  • Propuesta de valor clara
  • Tono natural y conversacional
  • CTA suave

Debe evitar:

  • Repetir información del perfil que ya conocen ("Trabajas como X en Y")
  • Observaciones genéricas ("trayectoria impresionante", "noté que estás en [industria]")
  • Jerga corporativa o palabras de moda
  • CTA agresivos ("Programemos una llamada esta semana")

Si el Paso 5.5 se ejecutó: para cada contacto, prefiere la señal con mayor puntuación de company_scored_signals como gancho en lugar de referencias genéricas a publicaciones de LinkedIn. Una señal con puntuación >= 70 anclada en noticias recientes reales es el gancho más fuerte que la demostración puede producir.

Proceso de generación

  1. Escribe un prompt de sistema específico para el cliente (guárdalo en prompts/message_prompt.md)
  2. Genera de 2 a 4 muestras — incluye contactos con y sin publicaciones de LinkedIn
  3. Revisa con la lista de verificación de calidad anterior
  4. Si hay problemas, refina el prompt del sistema y regenera
  5. Solo genera en lote una vez que la calidad esté aprobada

Plantilla del prompt del sistema (secciones clave)

- Contexto del cliente: qué venden, a quién se dirigen, su propuesta de valor, tono
- Reglas prohibidas: sin repetición de perfil, sin halagos genéricos
- Estructura del mensaje: gancho → puente → oferta → CTA
- Ejemplos de gancho: con publicaciones / sin publicaciones
- Límite de caracteres: 320–450

Paso 7 — Sanitizar y generar salida

Paso 7a — Sanitizar (obligatorio, determinista, sin LLM). csv/intermediate/ conserva todos los campos. Antes de construir cualquier cosa orientada a prospectos, ejecuta el sanitizador compartido para que la limpieza manual recurrente (etiquetas de proveedor, columnas vacías, correos electrónicos incorrectos, señales obsoletas) ocurra de manera automática.

Skills relacionados