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
);
}
};
Google Ads Customer Match
// 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
- Migración entre segmentos: Tracking mensual
- Revenue por segmento: Contribución al revenue total
- Tasa de retención por segmento: Mes a mes
- 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