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.

Vamos a implementarlo desde cero usando SQL.


🧠 ¿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)
  • Retención y revenue growth

🧱 Suposiciones básicas de tu base de datos

Un ecommerce típico tiene algo así:

orders

  • id
  • user_id
  • total_amount
  • created_at

⚙️ Paso 1: Obtener métricas base

Primero, calculamos R, F y M por usuario.

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

Pero aún no tenemos “Recency” como número… vamos a calcularlo.


⏱️ Paso 2: Calcular Recency

Necesitas una fecha de referencia (normalmente hoy):

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;

Ahora sí:

  • Recency: días desde la última compra
  • Frequency: número de órdenes
  • Monetary: dinero total

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

Aquí empieza el juego interesante: normalizar.

Puedes usar NTILE para dividir en quintiles:

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;

💡 Nota:

  • Recency se ordena DESC porque menor = mejor cliente
  • Frequency y Monetary se ordenan ASC

🧩 Paso 4: Crear segmentos

Ahora combinamos los scores:

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

Ejemplo:

  • 555 → cliente estrella 🌟
  • 111 → cliente perdido 💀
  • 515 → compra mucho dinero pero no tan frecuente

🏷️ Paso 5: Clasificación útil para negocio

Aquí es donde pasas de datos a decisiones:

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

🚀 ¿Cómo usar esto en la vida real?

Aquí es donde tu backend empieza a oler a inteligencia:

📧 CRM

  • VIP → early access, promociones exclusivas
  • At Risk → descuentos agresivos
  • Nuevos → onboarding + recomendaciones

📊 BI / Dashboards

  • Distribución de segmentos
  • Revenue por tipo de cliente
  • Evolución mensual de RFM

🤖 Automatización

  • Triggers para campañas
  • Recomendadores
  • Lógica de pricing dinámico

⚠️ Cosas que suelen salir mal

  • Usar datos sucios (órdenes canceladas incluidas 😬)
  • No actualizar RFM periódicamente
  • Usar rangos fijos en lugar de percentiles
  • Ignorar el contexto del negocio (no todo es e-commerce estándar)

🧾 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”

a:

“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.