Saltar al contenido principal

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 SegmentChurn RateAt Risk %Avg Days to Churn
Champions2%5%180+
Loyal Customers5%12%150
Potential Loyalists10%18%120
At Risk45%35%60
Lost85%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

IndustriaChurn Rate AnualAt Risk %Win-Back Rate
E-commerce20-25%15%20%
SaaS5-10%12%35%
Subscription15-20%18%25%
Retail25-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.