← SCRAM AI Lab
Detectar patrones en deals, contactos y actividades para generar recomendaciones accionables que un vendedor abre en 24h. SQL primero, LLM después — no al revés.
May 21, 2026
5 lecturas
El error que vemos en todos los CRMs que prometen "AI insights" es pedirle al LLM que encuentre los patrones. No los va a encontrar: los costos explotan, las latencias son atroces y la mitad de las recomendaciones son alucinadas. El patrón que funciona en producción es invertido: SQL detecta, LLM contextualiza. La máquina relacional sabe contar; el LLM sabe redactar el mensaje que el vendedor abre desde su iPhone a las 9 PM.
Después de mirar métricas de adopción en cinco clientes, estos son los únicos que pasan el filtro de "el vendedor lo abre y actúa":
Nótese lo que no está: "contacto cumple años", "se acerca renovación en 6 meses", "el clima está bueno para llamar". Calendar reminders no son nudges; son ruido.
SELECT d.id, d.title, d.amount, d.stage, d.owner_id,
c.full_name, c.email,
MAX(a.created_at) AS last_activity
FROM crm_deal d
JOIN crm_contact c ON c.id = d.primary_contact_id
LEFT JOIN crm_activity a ON a.deal_id = d.id
WHERE d.status = 'open'
AND d.stage IN ('qualified', 'proposal', 'negotiation')
GROUP BY d.id, c.id
HAVING MAX(a.created_at) < NOW() - INTERVAL '14 days'
OR MAX(a.created_at) IS NULL
ORDER BY d.amount DESC
LIMIT 50;
Para cada fila del SQL, hacemos una sola llamada a Claude Sonnet 4.6 (tier 2 en nuestro router) con el contexto mínimo del deal y el historial de actividad. El prompt:
const prompt = `Eres un asesor comercial revisando un deal stale.
Deal: ${deal.title} - $${deal.amount} MXN
Stage: ${deal.stage}
Contacto: ${contact.full_name} (${contact.email})
Última actividad: ${daysSince} días atrás - ${lastActivity.type}
Historial reciente: ${activitySummary}
Genera UN nudge accionable de 2 frases para el vendedor:
1. Por qué este deal merece atención AHORA
2. Acción concreta sugerida (llamar / email específico / agendar)
No saludes. No expliques que es un nudge. Directo al grano.`;
Costo por nudge: ~$0.003 USD. Para 50 nudges diarios son $4.50/mes por org. La alternativa de Opus es 5x más cara y no mueve la métrica.
Trackeen nudges atendidos en 24h, no nudges generados. Un nudge atendido es uno donde el vendedor registra actividad sobre ese deal/contacto en las 24h siguientes a haber abierto el panel. En SCRAM ese ratio es 41%; cuando bajaba de 30% sabíamos que el detector SQL estaba generando ruido (umbral de días mal, stages incorrectos) y volvíamos a tunear.
No hacemos push notifications. Los nudges viven en un widget del dashboard que el vendedor revisa en su rutina matutina. Push agresivo a Slack/email destruye la señal en dos semanas: aprenden a ignorarlos. El nudge debe ser un regalo, no una interrupción.
La pregunta abierta: ¿qué pasa cuando el LLM aprende del comportamiento del vendedor (cuáles atiende, cuáles ignora) y reordena? Estamos probando un bandit contextual encima del detector SQL — primeros resultados en el siguiente artículo de esta serie.
Artículos relacionados
Traefik v2.10 con auto-renewal certs para 94 containers
Wildcard *.scram2k.com cubre la mayoría, certs individuales para el resto. acme.json shared, DNS-01 para wildcards, HTTP-01 para subdomains. Anti-patrón: cert por container.
OpenTelemetry tracing para pipelines LLM
Instrumentar pipelines LLM multi-tier con spans nested: router → tier-selection → provider-call → parsing → side-effects. Atributos gen_ai semantic conventions y flame chart en Tempo.
Loki + Grafana para logs de chatbot: query patterns
Labels útiles (org_id, session_id, tier, provider) sin caer en high-cardinality. LogQL patterns para errores por tier, p99 latency y costos por hora. Retention 30d hot.