Módulo 8: Project Measure Mercados Recommendations Launch
La retención de línea base: ¿la gente que compra, vuelve?
Descripción
La lección anterior confirmó que recommendations convierte más gente en una sola visita — o, al menos, que apunta al paso correcto del funnel para intentarlo. Pero convertir una vez y quedarse son preguntas distintas, y esta lección existe exactamente para no confundirlas. Antes de mirar el resultado del A/B test, vas a leer la retención por cohortes de Mercado: primero la línea base del negocio, sin ningún experimento de por medio, y después la comparación descriptiva entre control y variant — la misma comparación que el módulo 3 ya hizo, ahora un módulo más adelante, como la segunda capa del método completo de este capstone.
Conexión con el módulo. Esta lección reutiliza retentionCurve() y cohortTable() exactamente como quedaron en las lecciones 3 y 6 del módulo 3, sin ningún cambio, sobre los mismos datos de línea base y del lanzamiento que ya viste en el proyecto de ese módulo. No es una repetición vacía: es la confirmación, capa por capa, de que el negocio se comporta como se espera antes de sumarle la North Star y los guardrails de la lección 4, y antes de que el A/B test de las lecciones 6 y 7 diga si el lift de conversión de la lección 2 se traduce, además, en gente que vuelve.
Una analogía: el chequeo antes de la cirugía
Ningún cirujano opera sin revisar primero los signos vitales del paciente en reposo — la presión, el pulso, la temperatura, todo antes de tocar el bisturí. No porque espere que algo salga mal, sino porque sin ese punto de referencia no hay forma de saber, después de la cirugía, si un cambio en los signos vitales fue efecto de la intervención o simplemente cómo ese paciente se comporta siempre. La tabla de cohortes de línea base de Mercado es ese chequeo previo: antes de mirar si recommendations cambió algo, hace falta saber cómo se comporta la retención de Mercado cuando nadie tocó nada.
Ejemplo trabajado: línea base, y control contra variant
Parte 1 — La retención natural de Mercado, sin ningún experimento de por medio
// Reutilizamos retentionCurve() y cohortTable() EXACTAMENTE como quedaron en las
// lecciones 3 y 6 del modulo 3, sin ningun cambio.
function retentionCurve(cohort, plateauThreshold = 2) {
const initialSize = cohort[0];
const rates = cohort.map((active) => (active / initialSize) * 100);
let plateauStart = rates.length - 1;
for (let week = rates.length - 1; week > 0; week--) {
const delta = Math.abs(rates[week] - rates[week - 1]);
if (delta <= plateauThreshold) {
plateauStart = week - 1;
} else {
break;
}
}
return { rates, plateauStart, plateauValue: rates[rates.length - 1] };
}
function cohortTable(cohorts) {
const maxWeeks = Math.max(...cohorts.map((c) => c.active.length));
const header = ['Cohorte'.padEnd(12)]
.concat(Array.from({ length: maxWeeks }, (_, w) => ('W' + w).padStart(6)))
.join(' | ');
console.log(header);
console.log('-'.repeat(header.length));
cohorts.forEach((c) => {
const rates = c.active.map((a) => ((a / c.active[0]) * 100).toFixed(0) + '%');
const cells = Array.from({ length: maxWeeks }, (_, w) => (rates[w] ? rates[w] : '--').padStart(6));
console.log(c.week.padEnd(12) + ' | ' + cells.join(' | '));
});
}
// Parte 1: la misma tabla de linea base del modulo 3 -- cuatro cohortes antes del
// lanzamiento de recommendations.
const baselineCohorts = [
{ week: '2026-06-01', active: [1000, 390, 300, 265, 255, 252] },
{ week: '2026-06-08', active: [1150, 445, 345, 305, 293] },
{ week: '2026-06-15', active: [980, 375, 290, 258] },
{ week: '2026-06-22', active: [1220, 470, 365] },
];
console.log('=== Parte 1: tabla de cohortes de Mercado (linea base) ===\n');
cohortTable(baselineCohorts);
const baselineCurve = retentionCurve(baselineCohorts[0].active);
console.log('\nMeseta de linea base (cohorte mas madura): ~' + baselineCurve.plateauValue.toFixed(1) + '%');
Qué esperar. La salida de la Parte 1:
=== Parte 1: tabla de cohortes de Mercado (linea base) ===
Cohorte | W0 | W1 | W2 | W3 | W4 | W5
------------------------------------------------------------------
2026-06-01 | 100% | 39% | 30% | 27% | 26% | 25%
2026-06-08 | 100% | 39% | 30% | 27% | 25% | --
2026-06-15 | 100% | 38% | 30% | 26% | -- | --
2026-06-22 | 100% | 39% | 30% | -- | -- | --
Meseta de linea base (cohorte mas madura): ~25.2%
Parte 2 — control contra variant, la semana del lanzamiento
// Parte 2: control vs variant, exactamente los mismos numeros del proyecto del modulo 3.
const control = [1000, 380, 290, 255, 248, 246];
const variant = [1000, 430, 350, 320, 310, 308];
console.log('\n=== Parte 2: control vs variant ===\n');
const controlCurve = retentionCurve(control);
const variantCurve = retentionCurve(variant);
console.log('control (sin recommendations): meseta ~' + controlCurve.plateauValue.toFixed(1) + '%');
console.log('variant (con recommendations): meseta ~' + variantCurve.plateauValue.toFixed(1) + '%');
const gap = variantCurve.plateauValue - controlCurve.plateauValue;
console.log('\nDiferencia descriptiva de meseta: +' + gap.toFixed(1) + ' puntos.');
console.log('Esto todavia NO es un resultado con significancia estadistica.');
Qué esperar. Al correr el archivo completo (las dos partes juntas) con Node:
=== Parte 1: tabla de cohortes de Mercado (linea base) ===
Cohorte | W0 | W1 | W2 | W3 | W4 | W5
------------------------------------------------------------------
2026-06-01 | 100% | 39% | 30% | 27% | 26% | 25%
2026-06-08 | 100% | 39% | 30% | 27% | 25% | --
2026-06-15 | 100% | 38% | 30% | 26% | -- | --
2026-06-22 | 100% | 39% | 30% | -- | -- | --
Meseta de linea base (cohorte mas madura): ~25.2%
=== Parte 2: control vs variant ===
control (sin recommendations): meseta ~24.6%
variant (con recommendations): meseta ~30.8%
Diferencia descriptiva de meseta: +6.2 puntos.
Esto todavia NO es un resultado con significancia estadistica.
Leyendo el resultado: la segunda capa confirma la primera
Este resultado no es nuevo — es exactamente el que produjo el proyecto del módulo 3. Lo relevante, ahora, es dónde se ubica dentro del método completo de este capstone: la Parte 1 confirma que el control (24.6%) se comporta como Mercado se comporta siempre, sin ningún cambio de producto (línea base ~25.2%) — la evidencia de que la aleatorización del experimento no produjo, por accidente, un grupo control "raro". La Parte 2 muestra que variant (30.8%) se aparta de ese patrón, en la misma dirección positiva que ya viste en el funnel de la lección 2: no solo convierte más gente en una sola visita, esa misma gente parece volver con más frecuencia.
Fíjate en la palabra que se repite, a propósito, en la salida del código: descriptiva. Una diferencia de +6.2 puntos entre dos cohortes de 1,000 usuarios cada una es exactamente el tipo de número que, sin las herramientas de significancia de las lecciones 6 y 7 de este módulo, no puedes distinguir todavía de la variación natural entre dos grupos de gente distinta. Esta lección deja acumulada dos señales descriptivas en la misma dirección —el funnel (lección 2) y la retención (esta lección)— pero ninguna de las dos, todavía, con el respaldo estadístico que va a llegar en la lección 6.
Profundización: por qué la retención es la señal más difícil de fabricar
De las tres señales que este capstone acumula antes de llegar al A/B test formal —conversión de funnel, retención, y la North Star de la lección 4—, la retención es, en cierto sentido, la más honesta. Un carrusel de recomendaciones podría subir la conversión de una sola visita con trucos que no generan valor real (una oferta artificialmente atractiva, una fricción menor en el checkout, un efecto de curiosidad de "qué es esto nuevo"), y esos trucos se notarían en el funnel de hoy sin que necesariamente signifiquen una mejora real del producto. Pero es mucho más difícil fabricar retención con un truco barato: si la gente vuelve semana tras semana, es porque encontró valor real la primera vez, no porque un botón brillante la empujó a comprar una sola vez. Por eso la retención complementa al funnel: el funnel mide si algo convence a corto plazo; la retención mide si ese convencimiento se sostiene.
Errores comunes
Mirar solo la Parte 2 y saltarse la línea base de la Parte 1. Qué pasa: alguien va directo a comparar control contra variant, sin haber confirmado antes si el 24.6% del control es un número "normal" para Mercado o ya es, en sí mismo, extraño. Por qué pasa: la comparación control-variant se siente como la parte relevante para el negocio; revisar la línea base se siente como un paso preliminar prescindible, la misma trampa que ya advirtió el módulo 3. Cómo detectarlo: si nadie puede decir si 24.6% es consistente con el comportamiento histórico de Mercado, la Parte 1 nunca se corrió en serio. Cómo corregirlo: como en esta lección, siempre confirma la línea base antes de interpretar cualquier diferencia entre grupos de un experimento — es la misma disciplina del chequeo médico antes de una cirugía.
Sumar la señal de retención y la señal del funnel como si fueran independientes y "duplicaran" la confianza. Qué pasa: el equipo razona "el funnel mejoró Y la retención mejoró, así que tenemos el doble de evidencia de que funciona" — tratando las dos señales descriptivas como si cada una, por separado, ya fuera prueba suficiente. Por qué pasa: dos números que apuntan en la misma dirección se sienten más convincentes juntos que por separado, y es fácil olvidar que ninguno de los dos, todavía, pasó por un test de significancia. Cómo detectarlo: si la conversación dice "tenemos dos señales, ya está confirmado" sin mencionar ningún p-value, la confianza se está construyendo sobre coincidencia descriptiva, no sobre estadística. Cómo corregirlo: las dos señales (funnel y retención) son razones válidas para tomarse en serio la hipótesis y seguir adelante con el A/B test formal — no son, por sí solas, la confirmación que dan las lecciones 6 y 7 de este módulo.
Comparar la meseta de variant contra la línea base histórica, en vez de contra control. Qué pasa: alguien compara 30.8% (variant) directamente contra ~25.2% (línea base), calculando una diferencia de +5.6 puntos, en vez de comparar variant contra control de la misma semana del experimento (+6.2 puntos). Por qué pasa: la línea base es el número "de siempre", y comparar contra él se siente más natural que comparar contra un grupo control que corrió simultáneamente. Cómo detectarlo: si el reporte cita "+5.6 puntos contra la línea base histórica" en vez de "+6.2 puntos contra el control de esta semana", la comparación está mezclando dos periodos de tiempo distintos. Cómo corregirlo: la comparación válida de un experimento siempre es contra el control que corrió al mismo tiempo que el variant — la línea base histórica sirve solo para confirmar que ese control se comporta con normalidad, no como el punto de comparación del efecto en sí.
Ejercicios
Ejercicio 1 — Verifica la estabilidad de la línea base en otra columna. Usando la tabla de la Parte 1, calcula la diferencia máxima entre las cuatro cohortes en la columna W1. ¿Es consistente con la estabilidad que ya viste en W2 en el proyecto del módulo 3?
Ver solución
En W1, las cuatro cohortes muestran: 39%, 39%, 38%, 39% — una diferencia máxima de apenas 1 punto porcentual. Es igual de estable que la columna W2 (donde las cuatro daban 30% exacto), confirmando el mismo patrón: la retención natural de Mercado, sin ningún cambio de producto, se mueve muy poco de una cohorte a otra. Esto hace más notable, por contraste, que variant se haya apartado 6.2 puntos de su control correspondiente — una brecha muchísimo más grande que la variación natural entre cohortes normales.
Ejercicio 2 — Conecta la retención con el funnel de la lección 2. Si la hipótesis de la lección 2 es correcta —recommendations reduce la fuga en view_product → add_to_cart—, ¿por qué esa mejora, ocurrida en una sola visita, podría además traducirse en una mejora de retención semanas después? Propón un mecanismo plausible.
Ver solución
Un mecanismo plausible: si el carrusel ayuda a la gente a encontrar, en su primera visita, un producto que de verdad le interesa (en vez de irse sin agregar nada al carrito), esa primera compra exitosa aumenta la probabilidad de que la persona confíe en Mercado como un lugar donde "encuentra lo que busca" — y esa confianza es, precisamente, lo que trae a la gente de vuelta la semana siguiente. El funnel mide el primer efecto (menos fuga, hoy); la retención mide si ese primer efecto se traduce en un hábito (la gente vuelve, después). No es un mecanismo garantizado —podría no sostenerse—, pero es la razón por la que tiene sentido, de entrada, esperar que las dos señales se muevan juntas, como de hecho se movieron en los datos de hoy.
Ejercicio 3 — Diseña la pregunta que falta. Con el funnel (lección 2) y la retención (esta lección) ya confirmados en la misma dirección positiva, ¿qué pregunta específica falta contestar antes de decidir enviar recommendations a todos los usuarios? No es una pregunta de significancia todavía — piensa en qué otra cosa podría estar "pagando" por esa mejora.
Ver solución
La pregunta que falta es, exactamente, la de la lección 4 de este módulo: ¿qué costó, en otras métricas, lograr esta mejora en conversión y retención? Una mejora en la métrica que se está optimizando siempre debería revisarse contra los guardrails que protegen al resto del negocio —¿empeoró la latencia?, ¿subieron las quejas?, ¿bajó el margen?—, exactamente el mismo argumento de la ley de Goodhart que ya viste en el módulo 4. Dos señales positivas (funnel y retención) no descartan que exista un costo oculto en otro lado; solo la lección 4 de este capstone, con guardrailCheck(), puede confirmar o descartar eso.
Resumen y siguiente paso
En esta lección confirmaste, con la misma retención por cohortes del módulo 3, que la segunda capa del método apunta en la misma dirección que la primera: la meseta de línea base de Mercado (~25.2%) es estable, el control de este experimento se comporta con normalidad (24.6%), y el variant que vio recommendations se estabiliza notablemente más alto (30.8%), una diferencia descriptiva de +6.2 puntos que, igual que el resultado del funnel de la lección 2, todavía no pasó por ningún test de significancia.
Hacia dónde sigues. La lección 4 sube un nivel: con dos señales descriptivas positivas acumuladas (funnel y retención), toca preguntar qué pudo haber costado lograrlas. Vas a reutilizar evaluateNorthStar() y guardrailCheck() del módulo 4 para confirmar cuál es la North Star oficial de Mercado y revisar si alguno de sus guardrails —latencia, quejas, churn, margen— se rompió mientras recommendations corría.
Recursos
- Amplitude, "What Is Cohort Retention Analysis: Essential Metrics Guide" — amplitude.com/explore/analytics/cohort-retention-analysis. El mismo recurso base del módulo 3, útil para releer ahora que la retención se lee como una segunda capa dentro del método completo del capstone. En inglés.
- Casey Winters y Lenny Rachitsky, "What Is Good Retention: An Exhaustive Benchmark Study" — lennysnewsletter.com/p/what-is-good-retention-issue-29. Sigue siendo la referencia para contrastar la meseta de Mercado (~25% en control, ~31% en variant) contra benchmarks reales de la industria. En inglés.
- Brian Balfour (Reforge), "The Retention Engagement Growth Silent Killer" — reforge.com/blog/retention-engagement-growth-silent-killer. Argumenta por qué una mejora de conversión sin una mejora acompañante de retención suele ser una victoria frágil — el mismo argumento que motiva juntar las dos señales en este capstone. En inglés.