Si tienes una tabla de órdenes, ya tienes todo lo necesario para empezar a hacer análisis de clientes.

El modelo RFM (Recency, Frequency, Monetary) es una técnica sencilla que te permite clasificar usuarios según su comportamiento de compra. Es ideal para comenzar en temas de Business Intelligence sin necesidad de herramientas complejas.

¿Qué es el análisis RFM?

RFM significa:

  • Recency (R): ¿Qué tan reciente fue la última compra?
  • Frequency (F): ¿Con qué frecuencia compra?
  • Monetary (M): ¿Cuánto dinero gasta?

La magia está en combinar estos tres factores para segmentar clientes y tomar decisiones más inteligentes.

¿Para qué sirve en un ecommerce?

Con RFM puedes responder cosas como:

  • ¿Quiénes son mis mejores clientes?
  • ¿Quiénes están a punto de abandonarme?
  • ¿A quién le mando descuentos vs a quién le vendo premium?

Esto conecta directo con CRM (campañas segmentadas), BI (dashboards accionables) y estrategias de retención y revenue growth.

Suposiciones básicas de tu base de datos

Un ecommerce típico tiene una tabla orders con esta estructura:

  • id — identificador único de la orden
  • user_id — cliente que realizó la compra
  • total_amount — monto total de la orden
  • created_at — fecha y hora de creación

Datos de ejemplo: tabla orders

Usaremos este dataset para ilustrar cada paso del análisis:

iduser_idtotal_amountcreated_at
1001U001$120.502024-03-15
1002U002$45.002024-01-03
1003U001$89.902024-04-01
1004U003$310.002024-04-10
1005U002$60.002024-02-20
1006U004$15.002023-11-05
1007U001$200.002024-04-18
1008U003$95.002024-03-30

Paso 1: Obtener métricas base

Primero, calculamos R, F y M por usuario agrupando las órdenes:

SELECT
    user_id,
    MAX(created_at) AS last_order_date,
    COUNT(*)        AS frequency,
    SUM(total_amount) AS monetary
FROM orders
GROUP BY user_id;

Resultado esperado

Asumiendo que hoy es 2024-04-30, el query anterior devuelve:

user_idlast_order_datefrequencymonetary
U0012024-04-183$410.40
U0022024-02-202$105.00
U0032024-04-102$405.00
U0042023-11-051$15.00
💡 Nota: last_order_date aún no es «Recency». En el siguiente paso la convertimos a días.

Paso 2: Calcular Recency

SELECT
    user_id,
    DATE_PART('day', NOW() - MAX(created_at)) AS recency,
    COUNT(*)          AS frequency,
    SUM(total_amount) AS monetary
FROM orders
GROUP BY user_id;

Recency representa los días transcurridos desde la última compra. Usamos una fecha de referencia (normalmente hoy):

Resultado esperado (referencia: 2024-04-30)

user_idrecency (días)frequencymonetary
U001123$410.40
U002692$105.00
U003202$405.00
U0041761$15.00
💡 A menor valor de recency, más reciente fue la compra — y más valioso es el cliente desde esa perspectiva.

Paso 3: Convertir métricas en scores (1–5)

WITH rfm AS (
  SELECT
      user_id,
      DATE_PART('day', NOW() - MAX(created_at)) AS recency,
      COUNT(*)          AS frequency,
      SUM(total_amount) AS monetary
  FROM orders
  GROUP BY user_id
)
SELECT
    user_id,
    NTILE(5) OVER (ORDER BY recency DESC) AS r_score,
    NTILE(5) OVER (ORDER BY frequency)    AS f_score,
    NTILE(5) OVER (ORDER BY monetary)     AS m_score
FROM rfm;

Normalizamos los valores usando NTILE para dividir cada métrica en quintiles (1 = peor, 5 = mejor):

Resultado esperado

Recency se ordena DESC porque menor número de días = mejor score. Frequency y Monetary se ordenan ASC.

user_idrecencyfrequencymonetaryr_scoref_scorem_score
U001123$410.40555
U002692$105.00332
U003202$405.00434
U0041761$15.00111
💡 Con pocos usuarios los quintiles colapsan. NTILE funciona mejor con cientos o miles de registros. En datasets pequeños considera usar PERCENT_RANK o rangos manuales.

Paso 4: Crear el RFM Score combinado

SELECT *,
    CONCAT(r_score, f_score, m_score) AS rfm_score
FROM ...

Concatenamos los tres scores para obtener un identificador compacto por cliente:

Resultado esperado

user_idr_scoref_scorem_scorerfm_score
U001555555
U002332332
U003434434
U004111111

Un score 555 representa el cliente ideal: compró recientemente, compra con frecuencia y gasta mucho. Un score 111 es una señal de alarma.

Paso 5: Clasificación útil para el negocio

CASE
    WHEN r_score >= 4 AND f_score >= 4 THEN 'VIP'
    WHEN r_score >= 4                  THEN 'Recent Customer'
    WHEN f_score >= 4                  THEN 'Loyal Customer'
    WHEN r_score <= 2                  THEN 'At Risk'
    ELSE 'Regular'
END AS segment

Aquí es donde pasas de datos a decisiones. Aplicamos reglas de negocio sobre los scores:

Resultado esperado: clientes segmentados

user_idrfm_scorer_scoref_scoresegmento
U00155555VIP
U00233233Recent Customer
U00343443Loyal Customer
U00411111At Risk

Guía de segmentos y acciones

SegmentoCriterioAcción recomendada
VIPr_score ≥ 4 AND f_score ≥ 4Early access, beneficios exclusivos
Recent Customerr_score ≥ 4Bienvenida, cross-sell, upsell
Loyal Customerf_score ≥ 4Programa de fidelidad, recompensas
At Riskr_score ≤ 2Descuentos agresivos, encuesta de retención
RegularRestoCampañas genéricas, nurturing

¿Cómo usar esto en la vida real?

CRM

  • VIP → early access, promociones exclusivas
  • At Risk → descuentos agresivos, campañas de reactivación
  • Nuevos → onboarding personalizado + recomendaciones

BI / Dashboards

  • Distribución de segmentos por período
  • Revenue generado por tipo de cliente
  • Evolución mensual del RFM Score promedio

Automatización

  • Triggers para campañas de email según cambio de segmento
  • Motores de recomendación basados en perfil RFM
  • Lógica de pricing dinámico por segmento

Cosas que suelen salir mal

  • Usar datos sucios — órdenes canceladas o devueltas incluidas en el cálculo.
  • No actualizar RFM periódicamente — un análisis estático se vuelve obsoleto rápido.
  • Usar rangos fijos en lugar de percentiles — los percentiles se adaptan a tu distribución real.
  • Ignorar el contexto del negocio — no todo es e-commerce estándar; ajusta los criterios de segmento a tu industria.

Conclusión

RFM no es solo una técnica… es una forma de traducir comportamiento humano en decisiones técnicas.

Con unas cuantas queries puedes pasar de:

«tenemos usuarios» → «estos 200 clientes generan el 60% del revenue y están a punto de irse»

Y ahí, justo ahí, es donde SQL deja de ser solo consultas… y se convierte en estrategia.