End-to-End
Caso de estudioPlataforma de retención B2B
Customer Success intervenía cuando la cuenta ya no respondía. El modelo solo no alcanzaba: hacía falta un lugar donde el riesgo, el porqué y el playbook convivieran.
+22% retención
en el segmento marcado como alto riesgo
- #MachineLearning
- #Nextjs
- #SQL
- #XGBoost
Esta es la pieza end-to-end del portfolio. El label de churn salió de cohortes SQL. El ranking, de un XGBoost con umbral por valor de contrato. SHAP tradujo el score a drivers que una persona de CS puede leer.
La interfaz es Next.js: una cola de cuentas, el motivo principal de riesgo y una acción a 45 días. Sin esa capa, el modelo hubiera sido un CSV más en un Drive.
No generaliza a enterprise con ciclo anual. El label cambia si la ventana de inactividad es 14 o 30 días. Eso está escrito en la ficha, no escondido en un footnote.
- Problema
- Las cancelaciones se veían cuando el cliente ya no respondía. Customer Success actuaba sin prioridad y el CAC de cuentas mid-market no se recuperaba.
- Solución & pipeline
- Cohortes y features de uso en SQL, XGBoost con umbral por valor de contrato, y una webapp en Next.js donde CS ve riesgo, drivers (SHAP) y un playbook a 45 días.
- Límite / alcance
- No generaliza a planes enterprise con contratos anuales. El label de churn es sensible a la ventana de inactividad (14 vs. 30 días).
SQL
WITH usage AS (
SELECT account_id,
COUNT(*) FILTER (WHERE event_date >= CURRENT_DATE - 30)
AS events_30d,
MAX(event_date) AS last_seen
FROM product_events
GROUP BY 1
)
SELECT a.account_id, a.mrr, u.events_30d
FROM accounts a
JOIN usage u USING (account_id)
WHERE a.status = 'active';