Saltar al contenido principal

Segmentación RFM (Recency, Frequency, Monetary)

Visión General

La segmentación RFM es el corazón analítico del CDP, clasificando a los 202,808 consumidores en 8 segmentos basados en su comportamiento de compra. Este sistema procesa datos de 5 tenants principales con actualización en tiempo real.

¿Qué es RFM?

RFM divide a los clientes en segmentos usando tres métricas clave:

  • Recency (Recencia): ¿Cuándo fue la última compra?
  • Frequency (Frecuencia): ¿Con qué frecuencia compra?
  • Monetary (Valor Monetario): ¿Cuánto gasta?

Segmentos Implementados

1. Champions 🏆

  • Criterios: R=5, F=4-5, M=4-5
  • Características: Compraron recientemente, compran frecuentemente, gastan mucho
  • Estrategia: Recompensarlos, hacerlos embajadores de marca
  • Tamaño típico: 15-20% de la base

2. Loyal Customers 💚

  • Criterios: R=3-4, F=3-4, M=3-4
  • Características: Clientes consistentes con buen valor
  • Estrategia: Programas de lealtad, upselling
  • Tamaño típico: 20-25% de la base

3. Potential Loyalists 🌟

  • Criterios: R=3-4, F=2-3, M=2-3
  • Características: Compradores recientes con potencial
  • Estrategia: Engagement campaigns, recomendaciones
  • Tamaño típico: 15-20% de la base

4. New Customers 🆕

  • Criterios: R=5, F=1, M=1-2
  • Características: Primera compra reciente
  • Estrategia: Onboarding, welcome series
  • Tamaño típico: 10-15% de la base

5. At Risk ⚠️

  • Criterios: R=2, F=3-4, M=3-4
  • Características: Eran buenos clientes, no han comprado recientemente
  • Estrategia: Win-back campaigns urgentes
  • Tamaño típico: 10-15% de la base

6. Can't Lose Them 🚨

  • Criterios: R=1-2, F=4-5, M=4-5
  • Características: Mejores clientes que se están alejando
  • Estrategia: Atención personalizada inmediata
  • Tamaño típico: 5-10% de la base

7. Hibernating 😴

  • Criterios: R=1, F=1-2, M=1-2
  • Características: Inactivos por largo tiempo
  • Estrategia: Reactivation campaigns
  • Tamaño típico: 10-15% de la base

8. Lost 👻

  • Criterios: R=1, F=1, M=1
  • Características: No han comprado en mucho tiempo
  • Estrategia: Última oportunidad o dar de baja
  • Tamaño típico: 5-10% de la base

Implementación Técnica

Cálculo de Scores

// Algoritmo de scoring RFM
const calculateRFMScore = (customer) => {
const { lastPurchaseDate, totalOrders, totalSpent } = customer;

// Recency Score (1-5, donde 5 es más reciente)
const daysSinceLastPurchase = getDaysSince(lastPurchaseDate);
const recencyScore = getRecencyScore(daysSinceLastPurchase);

// Frequency Score (1-5, donde 5 es más frecuente)
const frequencyScore = getFrequencyScore(totalOrders);

// Monetary Score (1-5, donde 5 es mayor valor)
const monetaryScore = getMonetaryScore(totalSpent);

return {
recency: recencyScore,
frequency: frequencyScore,
monetary: monetaryScore,
rfmString: `${recencyScore}${frequencyScore}${monetaryScore}`,
segment: determineSegment(recencyScore, frequencyScore, monetaryScore)
};
};

Umbrales por Tenant

Cada tenant tiene umbrales personalizados basados en su industria:

const tenantThresholds = {
56: { // Chelsea IO - Exit (Moda)
recency: [30, 60, 90, 180, 365],
frequency: [1, 2, 4, 8, 15],
monetary: [500, 1500, 3000, 6000, 12000]
},
52: { // Celada SA - BAPRO (Retail)
recency: [45, 90, 180, 365, 730],
frequency: [1, 3, 6, 12, 24],
monetary: [1000, 3000, 6000, 12000, 25000]
}
// ... más tenants
};

Visualización en el Dashboard

Card de Overview RFM

<Card>
<Title>Segmentación RFM</Title>
<Text>{totalCustomers} clientes analizados</Text>

<Grid numItems={4} className="gap-2 mt-4">
<Card>
<Text>Champions</Text>
<Metric>12,045</Metric>
<Badge color="emerald">18.5%</Badge>
</Card>
<Card>
<Text>En Riesgo</Text>
<Metric>6,523</Metric>
<Badge color="amber">10.0%</Badge>
</Card>
{/* ... más segmentos */}
</Grid>
</Card>

Distribución Visual

<BarChart
data={rfmDistribution}
index="segment"
categories={["customers"]}
colors={["emerald", "green", "blue", "violet", "amber", "orange", "rose", "gray"]}
valueFormatter={(value) => `${value.toLocaleString()} clientes`}
/>

Tabla de Segmentos

<Table>
<TableHead>
<TableRow>
<TableHeaderCell>Segmento</TableHeaderCell>
<TableHeaderCell>Clientes</TableHeaderCell>
<TableHeaderCell>% Base</TableHeaderCell>
<TableHeaderCell>Ticket Promedio</TableHeaderCell>
<TableHeaderCell>CLV Promedio</TableHeaderCell>
<TableHeaderCell>Acción Recomendada</TableHeaderCell>
</TableRow>
</TableHead>
<TableBody>
{segments.map(segment => (
<TableRow key={segment.name}>
<TableCell>
<Badge color={segment.color}>{segment.name}</Badge>
</TableCell>
<TableCell>{segment.count.toLocaleString()}</TableCell>
<TableCell>{segment.percentage}%</TableCell>
<TableCell>{formatCurrency(segment.avgTicket)}</TableCell>
<TableCell>{formatCurrency(segment.avgCLV)}</TableCell>
<TableCell>
<Button size="xs" variant="light">
{segment.recommendedAction}
</Button>
</TableCell>
</TableRow>
))}
</TableBody>
</Table>

Métricas Clave por Segmento

Champions

  • Tamaño promedio: 12,045 clientes (18.5%)
  • Ticket promedio: $2,850
  • CLV promedio: $15,000
  • Tasa de retención: 92%

At Risk

  • Tamaño promedio: 6,523 clientes (10%)
  • Ticket promedio: $1,200
  • CLV promedio: $3,500
  • Probabilidad de churn: 65%

Acciones Automatizadas

1. Email Campaigns

const triggerRFMCampaign = async (segment, customers) => {
const campaigns = {
'Champions': 'vip-rewards-program',
'At Risk': 'win-back-urgent',
'New Customers': 'welcome-series',
'Hibernating': 'reactivation-offer'
};

const campaignId = campaigns[segment];
await sendEmailCampaign(campaignId, customers);
};

2. Descuentos Personalizados

const getSegmentDiscount = (segment) => {
const discounts = {
'Champions': { type: 'points', value: 2.0 }, // Double points
'At Risk': { type: 'percentage', value: 20 },
'Can\'t Lose Them': { type: 'percentage', value: 30 },
'New Customers': { type: 'percentage', value: 15 },
'Hibernating': { type: 'fixed', value: 50 }
};

return discounts[segment] || { type: 'none', value: 0 };
};

3. Prioridad de Atención

const getCustomerPriority = (segment) => {
const priorities = {
'Can\'t Lose Them': 'CRITICAL',
'Champions': 'HIGH',
'At Risk': 'HIGH',
'Loyal': 'MEDIUM',
'Potential Loyalists': 'MEDIUM',
'New Customers': 'MEDIUM',
'Hibernating': 'LOW',
'Lost': 'MINIMAL'
};

return priorities[segment] || 'NORMAL';
};

Integración con Otros Sistemas

VTEX Integration

// Sincronizar segmentos RFM con VTEX
const syncRFMToVTEX = async (tenantId) => {
const segments = await fetchRFMSegments(tenantId);

for (const segment of segments) {
await vtexAPI.updateCustomerSegment(
segment.customers,
segment.name
);
}
};
// Crear audiencias en Google Ads por segmento
const createGoogleAudiencia = async (segment) => {
const customers = await getCustomersBySegment(segment);

const audienceData = {
name: `RFM_${segment}_${Date.now()}`,
emails: customers.map(c => hashEmail(c.email)),
segmentType: 'rfm',
segmentValue: segment
};

await googleAdsAPI.createCustomerMatch(audienceData);
};

Performance y Optimización

Caching Strategy

// Cache de segmentos por 1 hora
const RFM_CACHE_TTL = 3600000; // 1 hora

const getCachedRFM = (tenantId) => {
const cacheKey = `rfm_${tenantId}`;
const cached = cache.get(cacheKey);

if (cached && Date.now() - cached.timestamp < RFM_CACHE_TTL) {
return cached.data;
}

return null;
};

Batch Processing

// Procesar clientes en lotes de 1000
const BATCH_SIZE = 1000;

const processRFMBatch = async (customers) => {
const batches = [];

for (let i = 0; i < customers.length; i += BATCH_SIZE) {
batches.push(customers.slice(i, i + BATCH_SIZE));
}

const results = await Promise.all(
batches.map(batch => calculateRFMForBatch(batch))
);

return results.flat();
};

Métricas de Éxito

KPIs Principales

  1. Migración entre segmentos: Tracking mensual
  2. Revenue por segmento: Contribución al revenue total
  3. Tasa de retención por segmento: Mes a mes
  4. CLV por segmento: Evolución trimestral

Dashboard Metrics

const rfmMetrics = {
totalAnalyzed: 202808,
lastUpdate: '2024-01-15T10:30:00Z',
processingTime: '2.3 minutes',
segments: {
champions: { count: 37519, revenue: 106975000 },
loyal: { count: 40562, revenue: 48674000 },
atRisk: { count: 20281, revenue: 24337000 },
// ... más segmentos
},
trends: {
championsGrowth: '+5.2%',
atRiskReduction: '-12.3%',
reactivationRate: '8.7%'
}
};

Roadmap

Q4 2024

  • ✅ Implementación base RFM
  • ✅ 8 segmentos principales
  • ✅ Visualización en dashboard
  • ⏳ Exportación a Google Ads

Q1 2025

  • Segmentación dinámica con ML
  • Predicción de migración entre segmentos
  • Alertas automáticas de cambios críticos
  • A/B testing por segmento

Q2 2025

  • Micro-segmentación (32+ segmentos)
  • RFM + comportamiento web
  • Scoring predictivo
  • API pública para RFM