← SCRAM AI Lab

Tutoriales

Lead scoring por factores ponderados sin ML pesado

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

El modelo ML que nadie usa porque nadie lo entiende

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.

Los 5 factores y su peso

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.

  • Engagement (25 pts): emails abiertos, replies, reuniones agendadas en 90 días
  • Recency (20 pts): días desde última interacción, decay exponencial
  • CompanyFit (20 pts): tamaño, industria, geografía vs ICP
  • WebActivity (20 pts): page views, tiempo en pricing, descargas
  • DealProgress (15 pts): existencia de deal abierto y stage

Cálculo en TypeScript

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);
}

Umbrales que aguantan en producción

Después de 14 meses corriendo esto en cinco clientes B2B, los cortes que minimizan falsos positivos para el equipo de ventas son:

  • Hot: 70+ — vendedor llama en menos de 2h, conversión histórica 18%
  • Warm: 40-69 — secuencia de nurturing automática, conversión 4%
  • Cold: <40 — solo email mensual, conversión 0.3%

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.

Cuándo sí necesitas ML

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.

lead-scoring
ai-native-saas
crm
← Volver a SCRAM AI Lab