← SCRAM AI Lab
Para mid-market con menos de 100K contactos, un scoring lineal de 5 factores le gana a un modelo ML entrenado. Es explicable, ajustable en minutos y no requiere MLOps.
May 21, 2026
7 lecturas
Llevamos tres años viendo equipos comerciales pagar consultorías para entrenar XGBoost sobre 8,000 contactos y terminar con un score que el director comercial no puede explicar al CFO. La verdad incómoda: para mid-market mexicano (sub-100K contactos, señales mayormente lineales), un scoring de 5 factores ponderados sumando 100 puntos vence al ML en todas las métricas que importan: tiempo a primera versión, costo de ajuste, auditabilidad y adopción del equipo de ventas.
En SCRAM CRM corremos esta fórmula sobre Postgres con un cron cada 6 horas. La ponderación sale de regresión observacional, no de un modelo: miramos qué combinación correlaciona con deals cerrados en los últimos 18 meses y ajustamos a mano cada trimestre.
async function scoreContact(contactId: string): Promise<number> {
const c = await prisma.crmContact.findUnique({
where: { id: contactId },
include: { activities: true, deals: true, webEvents: true, company: true },
});
const engagement = Math.min(25, c.activities.filter(a =>
a.type === 'email_open' || a.type === 'reply'
).length * 2.5);
const daysSince = (Date.now() - c.lastActivityAt.getTime()) / 86400000;
const recency = Math.max(0, 20 * Math.exp(-daysSince / 30));
const companyFit = scoreICP(c.company); // 0-20
const webActivity = Math.min(20, c.webEvents.length * 0.5);
const dealProgress = c.deals[0]?.stage
? STAGE_WEIGHTS[c.deals[0].stage]
: 0;
return Math.round(engagement + recency + companyFit + webActivity + dealProgress);
}
Después de 14 meses corriendo esto en cinco clientes B2B, los cortes que minimizan falsos positivos para el equipo de ventas son:
El umbral hot es el único que importa optimizar: si lo subes a 80 dejas leads buenos sin tocar; si lo bajas a 60 quemas tiempo de tus vendedores caros. Ajústalo cada 90 días mirando conversión por bucket.
El modelo lineal se rompe cuando: tienes más de 100K contactos activos, las señales son no-lineales (ej: combinaciones de páginas visitadas predicen mejor que cada una sola), o tu producto tiene ciclos de compra muy distintos por segmento. En ese punto un gradient boosting con SHAP values para explicabilidad vale la inversión en MLOps. Antes de eso, estás optimizando un problema que no tienes.
La pregunta honesta para tu equipo: ¿cuántas veces el último trimestre alguien preguntó por qué un lead tiene cierto score? Si la respuesta es más de cero, el modelo lineal te dura otros dos años.
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.