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-signalso 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.mdy 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?"):
- 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. - 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 -pdesde 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 encontext/icp.mdbajo 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:
- FullEnrich v2 (email) — todos los contactos
- 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-signalsa 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 1context/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
| Parte | Propósito | Extensión |
|---|---|---|
| Gancho | Refiere algo específico de esta persona (publicación, movimiento profesional, señal de la empresa) | 1 oración |
| Puente | Conecta su situación con tu oferta | 1 oración |
| Oferta | Lo que ofreces, claramente indicado | 1 oración |
| CTA | Solicitud 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
- Escribe un prompt de sistema específico para el cliente (guárdalo en
prompts/message_prompt.md) - Genera de 2 a 4 muestras — incluye contactos con y sin publicaciones de LinkedIn
- Revisa con la lista de verificación de calidad anterior
- Si hay problemas, refina el prompt del sistema y regenera
- 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.