Sistema de Detección de Churn
🚨 ¿Qué es Churn?
Churn es la pérdida de clientes, específicamente cuando dejan de hacer negocios con la empresa. Nuestro sistema detecta patrones de comportamiento que indican riesgo de abandono.
📊 Estados de Churn
1. Active (Activo)
- Definición: Clientes con actividad reciente normal
- Criterio: Compra en últimos 30-60 días (según tenant)
- Acción: Mantener engagement, up-sell/cross-sell
2. At Risk (En Riesgo)
- Definición: Comportamiento anormal, señales de desengagement
- Criterio: Sin compras 60-120 días + factores de riesgo
- Acción: Campañas de reactivaci ón inmediata
3. Churning (Churn en Proceso)
- Definición: Alto riesgo de pérdida inminente
- Criterio: Sin compras 120-180 días + múltiples señales
- Acción: Intervención urgente, ofertas agresivas
4. Churned (Perdido)
- Definición: Cliente efectivamente perdido
- Criterio: Sin actividad >180 días
- Acción: Win-back campaigns especiales o ignorar
🧠 Algoritmo de Predicción
Modelo de Machine Learning Híbrido
def calculate_churn_probability(customer_data):
# 1. Análisis temporal
days_since_last_order = calculate_recency(customer_data)
order_frequency_decline = analyze_frequency_trend(customer_data)
seasonal_adjustment = apply_seasonal_factors(customer_data)
# 2. Análisis comportamental
engagement_score = calculate_engagement(email_opens, site_visits)
support_interactions = analyze_support_tickets(customer_data)
payment_issues = check_payment_failures(customer_data)
# 3. Factores RFM
rfm_risk_factor = get_rfm_churn_multiplier(rfm_segment)
# 4. Modelo predictivo
feature_vector = [
days_since_last_order,
order_frequency_decline,
engagement_score,
support_interactions,
payment_issues,
rfm_risk_factor
]
churn_probability = churn_model.predict_proba(feature_vector)[1]
return {
'probability': churn_probability,
'risk_level': categorize_risk(churn_probability),
'factors': analyze_risk_factors(feature_vector),
'confidence': calculate_model_confidence()
}
Factores de Riesgo
Temporales
- Days Since Last Order: Principal indicador
- Order Frequency Decline: Patrón descendente
- Seasonal Patterns: Ajustes por temporada/industria
Comportamentales
- Email Engagement: Opens, clicks, unsubscribes
- Website Activity: Visits, page views, time on site
- Support Tickets: Complaints, issues, satisfaction
Transaccionales
- Order Value Decline: AOV descendente
- Payment Issues: Fallos, retrasos, cambios de método
- Return Rate: Incremento en devoluciones
📈 Métricas de Ejemplo
Distribución de Churn (Tenant 56)
{
"overview": {
"total_customers": 29707,
"churn_rate": 0.15,
"at_risk_count": 4456,
"distribution": {
"active": 20000, // 67.3%
"at_risk": 4456, // 15.0%
"churning": 3000, // 10.1%
"churned": 2251 // 7.6%
}
}
}
Análisis por RFM Segment
| RFM Segment | Churn Rate | At Risk % | Avg Days to Churn |
|---|---|---|---|
| Champions | 2% | 5% | 180+ |
| Loyal Customers | 5% | 12% | 150 |
| Potential Loyalists | 10% | 18% | 120 |
| At Risk | 45% | 35% | 60 |
| Lost | 85% | 10% | 30 |
🚀 APIs de Churn
Análisis General de Churn
GET /api/v2/cdp/analytics/churn?tenant_id=56
Respuesta Completa
{
"success": true,
"data": {
"overview": {
"total_customers": 29707,
"churn_rate": 0.15,
"at_risk_count": 4456,
"avg_days_to_churn": 85.5,
"distribution": {
"active": 20000,
"at_risk": 4456,
"churning": 3000,
"churned": 2251
},
"last_calculation": "2024-09-16T19:25:00Z"
},
"risk_factors": {
"recency": {
"weight": 0.35,
"description": "Days since last order"
},
"frequency_decline": {
"weight": 0.25,
"description": "Decreasing order frequency"
},
"engagement": {
"weight": 0.20,
"description": "Email and website engagement"
},
"support_issues": {
"weight": 0.15,
"description": "Customer service interactions"
},
"payment_issues": {
"weight": 0.05,
"description": "Payment failures or delays"
}
},
"at_risk_customers": [
{
"customer_id": 67890,
"email": "customer@example.com",
"last_order_date": "2024-06-15",
"days_since_last_order": 93,
"churn_probability": 0.75,
"churn_risk": "at_risk",
"rfm_segment": "Need Attention",
"primary_risk_factors": [
"recency",
"frequency_decline"
],
"recommended_actions": [
"immediate_email_campaign",
"personalized_offer",
"account_manager_outreach"
]
}
]
}
}
Filtrar por Nivel de Riesgo
GET /api/v2/cdp/analytics/churn?tenant_id=56&risk_level=at_risk&limit=100
Churn Individual
GET /api/v2/cdp/customers/67890/profile?tenant_id=56
Incluye sección de churn:
{
"churn": {
"risk": "at_risk",
"probability": 0.75,
"confidence": 0.82,
"calculation_date": "2024-09-16T19:25:00Z",
"primary_factors": [
{
"factor": "recency",
"value": 93,
"weight": 0.35,
"contribution": 0.26
},
{
"factor": "frequency_decline",
"value": -0.6,
"weight": 0.25,
"contribution": 0.18
}
],
"trend": {
"direction": "increasing",
"velocity": 0.05,
"days_to_predicted_churn": 45
}
}
}
🎯 Estrategias Anti-Churn
At Risk Customers
Immediate Actions (24-48h)
- Personal Outreach: Account manager contact
- Exclusive Offers: 20-30% discount
- Surprise & Delight: Unexpected gift/upgrade
- Feedback Request: Survey about experience
Campaign Examples
# Campaña de reactivación inmediata
def urgent_reactivation_campaign(customer_id):
customer = get_customer_profile(customer_id)
# Personalizar oferta basada en historial
last_categories = get_last_purchased_categories(customer_id)
discount_percent = calculate_optimal_discount(customer.clv_tier)
send_email_campaign(
customer_id=customer_id,
template="urgent_reactivation",
discount=discount_percent,
products=last_categories,
urgency=True,
personal_note=True
)
Churning Customers
Aggressive Intervention
- Win-Back Campaigns: 40-50% discount
- Free Shipping: Remove friction
- Payment Plans: Flexible options
- Exit Survey: Understand reasons
Churned Customers
Win-Back Strategy
- Quarterly Campaigns: Seasonal offers
- New Product Launches: Re-engagement opportunity
- Referral Incentives: Bring-a-friend discounts
- Rebranding Communications: "We've changed"
📊 Churn Prevention KPIs
Effectiveness Metrics
- Retention Rate: 85% target para At Risk campaigns
- Win-Back Rate: 25% target para Churned customers
- Time to Reactivation: <30 días promedio
- ROI de Campaigns: 4:1 mínimo
Early Warning Indicators
-- Dashboard de alertas tempranas
SELECT
COUNT(*) as new_at_risk,
AVG(churn_probability) as avg_risk_score,
SUM(CASE WHEN clv_tier = 'high' THEN 1 ELSE 0 END) as high_value_at_risk
FROM churn_analysis
WHERE date_calculated = CURRENT_DATE
AND churn_risk = 'at_risk'
AND previous_risk != 'at_risk';
Model Performance
- Accuracy: 87% en predicciones 30 días
- Precision: 83% (pocos falsos positivos)
- Recall: 91% (capturamos mayoría de churners reales)
- AUC-ROC: 0.89 (excelente discriminación)
🔄 Automatización de Churn
Triggers Automáticos
# Monitoreo diario de churn risk
schedule.every().day.at("08:00").do(monitor_churn_changes)
def monitor_churn_changes():
# Detectar cambios en risk level
risk_changes = detect_risk_level_changes()
for change in risk_changes:
if change.new_risk == 'at_risk':
trigger_immediate_intervention(change.customer_id)
elif change.new_risk == 'churning':
escalate_to_retention_team(change.customer_id)
send_urgent_winback_campaign(change.customer_id)
# Alertas para high-value customers
def alert_high_value_churn():
high_clv_at_risk = get_customers(
clv_tier='high',
churn_risk__in=['at_risk', 'churning']
)
for customer in high_clv_at_risk:
notify_account_manager(customer.id)
create_urgent_task_crm(customer.id)
Integración con Marketing Tools
- Email Platforms: Trigger automático de campaigns
- CRM Systems: Alertas para sales team
- Customer Success: Tasks automáticas
- Support Systems: Priority handling para at-risk
📱 Dashboard de Churn
Vista Ejecutiva
- Churn Rate Trend: Últimos 12 meses
- At Risk Alert: Customers que necesitan atención inmediata
- ROI de Retention: Performance de campaigns
- High-Value Alerts: CLV alto en riesgo
Vista Operativa
- Daily At-Risk Queue: Lista de clientes para contactar
- Campaign Performance: Métricas de win-back campaigns
- Predictive Timeline: Customers próximos a churn
- Success Stories: Clientes reactivados exitosamente
🔮 Predictive Analytics
Seasonal Adjustments
# Ajuste por estacionalidad
seasonal_factors = {
'fashion': {
'Q1': 1.2, # Post-holiday churn spike
'Q2': 0.9, # Spring engagement
'Q3': 0.8, # Summer stability
'Q4': 1.1 # Pre-holiday uncertainty
}
}
Industry Benchmarks
| Industria | Churn Rate Anual | At Risk % | Win-Back Rate |
|---|---|---|---|
| E-commerce | 20-25% | 15% | 20% |
| SaaS | 5-10% | 12% | 35% |
| Subscription | 15-20% | 18% | 25% |
| Retail | 25-30% | 20% | 15% |
Advanced Features (Roadmap)
- Cohort Analysis: Churn por cohortes de adquisición
- Propensity Scoring: Probabilidad de respuesta a campaigns
- Channel Attribution: Qué canales previenen mejor el churn
- Sentiment Analysis: Social media y reviews como indicators
💡 Tip: La prevención de churn es 5-10x más cost-effective que la adquisición de nuevos clientes. Prioriza siempre la retención sobre la adquisición.