wandres.dev
ANALÍTICA Y CRASHES · saber qué pasa

Analítica de producto: medir para decidir, no para acumular

La mayoría de los planes de medición fracasan por exceso: mil eventos que nadie consulta, nombres inconsistentes, propiedades que significan cosas distintas según quién las escribió y un panel que nadie mira porque no responde a ninguna pregunta. Esta lección invierte el orden habitual —primero la decisión, después la métrica, al final el evento—, propone una taxonomía tipada que el compilador defiende, y explica embudos, cohortes y el gobierno mínimo que evita la entropía.

⏱ 19 min

Hay un patrón que se repite con una regularidad casi cómica en equipos de producto. Alguien propone empezar a medir, se integra una biblioteca de analítica, se instrumenta lo que resulta fácil de instrumentar, y en dieciocho meses el proyecto tiene ochocientos eventos de los que cuarenta se consultan alguna vez y ninguno responde a la pregunta que motivó todo aquello. El diagnóstico habitual es que faltaba disciplina. El diagnóstico real es que el orden estaba invertido: se empezó por la instrumentación, que es la parte técnica y por tanto la cómoda, en lugar de por la decisión, que es la parte incómoda porque obliga a admitir que nadie sabe qué se haría con el dato. Esta lección propone recorrer el camino en el sentido correcto y aceptar la consecuencia más contraintuitiva de hacerlo: un plan de medición bueno es notablemente pequeño.

🎯 Al terminar esta lección sabrás
  • Derivar la métrica a partir de una decisión concreta y descartar todo lo que no altere ninguna decisión.
  • Diseñar una taxonomía de eventos con nombres, propiedades y tipos que el compilador pueda defender.
  • Construir embudos y cohortes que respondan preguntas de retención y conversión sin confundir ambas.
  • Establecer el gobierno mínimo que impide que el plan de medición se degrade con el tiempo.

Primero la decisión, después la métrica

La prueba que filtra cualquier propuesta de medición cabe en una frase: qué harías distinto según el resultado. Si la respuesta es nada, o es un vago mirarlo para entender mejor, la métrica no debe existir todavía. No porque la curiosidad esté mal, sino porque cada evento tiene un coste real que se paga durante años: código que mantener, esquema que versionar, almacenamiento, revisión de privacidad, y sobre todo atención humana, que es el recurso genuinamente escaso. Un panel con cuarenta gráficas no informa más que uno con cuatro, informa menos, porque nadie sostiene la atención sobre cuarenta señales y todo el mundo la sostiene sobre cuatro.

De ahí se sigue una jerarquía que conviene explicitar. Arriba, la decisión: mantener o retirar una funcionalidad, invertir o no en un rediseño, elegir entre dos caminos de incorporación. Debajo, la pregunta que la desbloquea: cuántas personas llegan a usar la funcionalidad más de una vez, en qué paso se pierde la gente. Debajo, la métrica que responde esa pregunta con un número comparable. Y solo al fondo, los eventos que hacen falta para calcularla. Recorrer la jerarquía de abajo arriba es lo que produce los ochocientos eventos inútiles; recorrerla de arriba abajo produce un plan pequeño y defendible.

flowchart TD
a[Decision pendiente] --> b[Pregunta que la desbloquea]
b --> c[Metrica comparable en el tiempo]
c --> d[Eventos minimos necesarios]
d --> e[Instrumentacion]
e --> f[Lectura y decision tomada]
f --> g[Retirar el evento si ya no decide nada]

Hay además una distinción de tipos de métrica que evita discusiones estériles. Las métricas de resultado miden lo que de verdad importa —retención a treinta días, ingresos, tareas completadas— pero se mueven despacio y con mucho ruido, de modo que sirven para juzgar una estrategia y no para evaluar un cambio de la semana pasada. Las métricas indicadoras se mueven rápido y correlacionan con las anteriores —activación en el primer día, uso de la funcionalidad clave— y son las que permiten iterar. Y las métricas de contrapeso existen para detectar que estás mejorando una a costa de otra: si la tasa de clics sube mientras la retención baja, has optimizado un titular sensacionalista. Un cuadro de mando honesto lleva siempre las tres categorías.

⚠️
La métrica que se convierte en objetivo deja de ser buena métrica

La formulación de Goodhart no es una curiosidad académica sino una descripción exacta de lo que pasa cuando se premia un número. Si el equipo se evalúa por sesiones diarias, aparecerán notificaciones innecesarias; si se evalúa por tiempo en la aplicación, aparecerán fricciones disfrazadas de contenido. La defensa no consiste en no tener objetivos, sino en emparejar cada objetivo con su contrapeso explícito y en revisar la pareja, nunca el número suelto.

Un evento con sentido

Un evento bien diseñado responde tres preguntas sin ambigüedad: qué ocurrió, en qué contexto y con qué resultado. Todo lo demás sobra. El nombre describe un hecho consumado en el pasado y en un vocabulario estable, no una intención ni una pantalla: nota_guardada es un hecho, usuario_pulsa_boton_azul es una descripción de la interfaz que dejará de tener sentido en el siguiente rediseño. Esa diferencia parece cosmética y no lo es: los eventos atados a la implementación mueren con cada refactorización y arrastran consigo el histórico, mientras que los eventos atados al dominio sobreviven años y permiten comparar.

Las propiedades son donde se concentra tanto el valor como el riesgo. El valor porque una propiedad bien elegida convierte un evento en diez segmentaciones; el riesgo porque es el lugar donde acaba colándose información personal por acumulación de pequeñas comodidades. La regla que funciona es que las propiedades describen categorías y magnitudes, nunca contenido: el origen de la acción, el tipo de elemento, si había conexión, cuántos elementos había, cuánto tardó. Nunca el texto de la nota, el nombre del archivo ni la consulta de búsqueda.

enum EventoDeProducto {
    case notaGuardada(origen: Origen, longitud: TramoDeLongitud, adjuntos: Int)
    case sincronizacionCompletada(duracion: TramoDeDuracion, resultado: Resultado)
    case suscripcionIniciada(plan: Plan, pantallaDeOrigen: Origen)

    var nombre: String {
        switch self {
        case .notaGuardada: "nota_guardada"
        case .sincronizacionCompletada: "sincronizacion_completada"
        case .suscripcionIniciada: "suscripcion_iniciada"
        }
    }
}

enum TramoDeLongitud: String {
    case corta, media, larga   // tramos, no el valor exacto ni el texto
}

Modelar los eventos como un tipo enumerado en lugar de como cadenas sueltas cambia la naturaleza del problema. Deja de ser posible escribir un nombre con una errata, deja de ser posible enviar una propiedad con el tipo equivocado, y añadir un caso obliga a decidir explícitamente su nombre y sus propiedades en un único lugar que se puede revisar. Es el mismo argumento que se usa para tipar rutas de navegación o identificadores, aplicado al lugar donde nadie lo aplica porque la biblioteca de turno acepta cadenas y diccionarios.

// Una sola puerta de salida: aqui se filtra, se enriquece y se decide
struct Analitica {
    func registrar(_ evento: EventoDeProducto) {
        guard consentimiento.analiticaPermitida else { return }
        let propiedades = evento.propiedades
            .merging(contextoComun) { propia, _ in propia }
        cliente.enviar(nombre: evento.nombre, propiedades: propiedades)
    }
}

El contexto común merece una mención aparte porque es donde se ahorran cientos de líneas. Versión de la aplicación, versión del sistema, familia de dispositivo, idioma, si hay suscripción activa y en qué variante de experimento cae la persona son propiedades que interesan en casi todos los eventos y que deben añadirse en un único punto, jamás en cada llamada. Una única puerta de salida también es lo que hace posible cumplir la promesa de la lección siguiente: si el consentimiento se comprueba en un solo sitio, se puede auditar.

Embudos y cohortes

Dos estructuras de análisis resuelven la mayoría de las preguntas de producto, y se confunden con frecuencia porque ambas se dibujan con barras. El embudo mide conversión: de quienes empezaron un recorrido, qué proporción llegó a cada paso siguiente, dentro de una ventana temporal definida. La cohorte mide permanencia: de quienes hicieron algo por primera vez en una semana determinada, qué proporción seguía haciéndolo una, cuatro y doce semanas después. El embudo diagnostica fricción; la cohorte diagnostica valor. Una funcionalidad puede tener un embudo excelente y una cohorte plana, y eso significa que es fácil de usar y que no le sirve a nadie.

🔻

Embudo

Pasos ordenados y ventana explícita. El paso donde cae la proporción es la hipótesis de trabajo, no la conclusión: hay que mirar por qué segmento cae.

📊

Cohorte

Agrupar por semana de primera vez y seguir en el tiempo. Es lo único que distingue un crecimiento real de una puerta giratoria con mucha entrada y mucha salida.

🧭

Segmentación

Un número agregado casi siempre esconde dos poblaciones con comportamientos opuestos. Antes de explicar una media, pártela por dispositivo, país y antigüedad.

La construcción del embudo tiene una decisión que se toma mal por omisión: la ventana. Si no se declara, las herramientas suelen asumir la sesión, y entonces cualquier recorrido que la gente complete en dos sesiones —comparar precios hoy, comprar mañana— aparece como abandono masivo. Declarar una ventana coherente con la naturaleza de la decisión, que para una compra reflexiva puede ser de siete días, cambia por completo la lectura y a menudo desmonta un pánico injustificado.

En las cohortes el error simétrico es elegir mal el evento de anclaje. Anclar en la instalación mide la eficacia del canal de adquisición; anclar en la primera acción con valor mide la calidad del producto. Son preguntas distintas y la segunda es casi siempre la que el equipo cree estar respondiendo cuando mira la primera. Definir explícitamente qué significa activación en tu producto —la acción mínima tras la cual alguien ha entendido para qué sirve— es probablemente el ejercicio de mayor rendimiento de todo el plan de medición.

Contra la entropía

Un plan de medición no se degrada por una decisión mala sino por doscientas decisiones razonables tomadas sin coordinación. Cada persona añade el evento que necesita, con el nombre que le parece natural y las propiedades que su caso requiere, y al cabo de un año hay tres eventos para el mismo hecho con nombres distintos y una propiedad llamada tipo que en un sitio contiene el tipo de contenido y en otro el tipo de suscripción. La solución no es un comité, que nadie soporta, sino tres mecanismos baratos y automáticos.

El primero es un catálogo único y versionado que es a la vez documentación y fuente de verdad: si el evento no está en el archivo de definiciones, no se puede enviar porque el tipo no compila. El segundo es una convención de nombres escrita en una sola línea, sustantivo del dominio más verbo en participio, y verificada en revisión de código. El tercero es una revisión de retirada periódica, con la misma lógica con la que se retiran indicadores de funcionalidad: cada trimestre se listan los eventos sin ninguna consulta en noventa días y se eliminan salvo justificación explícita.

// Prueba que convierte la convencion en un invariante verificable
func testTodosLosEventosSiguenLaConvencion() {
    for evento in EventoDeProducto.todosLosCasosDeMuestra {
        XCTAssertTrue(evento.nombre.allSatisfy { $0.isLowercase || $0 == "_" || $0.isNumber })
        XCTAssertLessThanOrEqual(evento.propiedades.count, 6)
        XCTAssertFalse(evento.propiedades.keys.contains("nombre"))
    }
}

Queda una fuente de error que ninguna convención resuelve y que produce decisiones equivocadas con más frecuencia que todas las anteriores juntas: la instrumentación silenciosamente rota. Un evento deja de dispararse tras un refactorizado, la métrica cae, y el equipo interpreta la caída como un problema de producto en lugar de como un defecto de medición. La defensa es tratar la propia telemetría como un sistema con salud observable, con alertas sobre variaciones bruscas del volumen de cada evento clave y con una prueba de interfaz que verifique que el recorrido crítico emite lo que debe emitir.

Instrumentar es escribir la teoría de tu producto, no observarlo

Existe la creencia tácita de que la analítica observa el producto como un termómetro observa una fiebre, de forma neutral y sin participar en lo observado. Es falsa en un sentido que merece pensarse despacio. Cuando decides que existe un evento llamado nota guardada, estás afirmando que guardar una nota es una unidad de significado en tu dominio; cuando defines activación como la segunda nota de la primera semana, estás postulando una teoría concreta sobre cuándo alguien ha comprendido tu producto; cuando eliges los pasos de un embudo, estás declarando cuál es el camino correcto y, por omisión, tratando como desviación cualquier otro. El sistema de medición es, en sentido estricto, una ontología de tu producto escrita en forma ejecutable, y como toda ontología es a la vez un instrumento de conocimiento y un límite de lo pensable. Lo que no tiene evento no existe para el equipo, no aparece en ningún panel, no entra en ninguna discusión de priorización y por tanto no se mejora nunca, por mucho que le importe a quien usa la aplicación. De ahí se siguen dos disciplinas que separan a los equipos que aprenden de los que solo acumulan. La primera es revisar periódicamente la ontología misma y no solo los números que produce, preguntándose qué comportamientos reales quedan fuera del vocabulario. La segunda es no dejar nunca que los datos cuantitativos sustituyan a la observación directa: los números dicen con enorme precisión qué pasó dentro del marco que tú definiste, y son estructuralmente incapaces de avisarte de que el marco es el problema. Esa noticia solo llega mirando a alguien usar la aplicación, y por eso ningún cuadro de mando sustituye a una sesión de observación al trimestre.

📝
Lo esencial

El orden correcto es decisión, pregunta, métrica y evento; recorrerlo al revés genera cientos de eventos inertes. Los nombres describen hechos del dominio en pasado, las propiedades describen categorías y magnitudes y nunca contenido, y todo se modela con tipos para que el compilador defienda la convención. El embudo mide fricción y la cohorte mide valor, con ventana y anclaje declarados de forma explícita. Y contra la entropía sirven tres cosas baratas: catálogo único, convención verificada en pruebas y retirada trimestral de lo que ya no decide nada.

⚔️ Reducir para entender
  1. Escribe las tres decisiones reales que tu equipo tiene pendientes y deriva de cada una la pregunta y la métrica, sin mencionar todavía ningún evento.
  2. Lista todos los eventos que tu aplicación envía hoy y marca cuáles se han consultado en los últimos noventa días; propón la retirada del resto.
  3. Modela los eventos supervivientes como un tipo enumerado con una única puerta de salida y comprueba que ninguna cadena literal queda suelta en el código.
  4. Construye el embudo del recorrido principal con una ventana declarada y compáralo con el mismo embudo restringido a la sesión, anotando la diferencia.
  5. Define la activación de tu producto en una frase, mide la cohorte semanal anclada en ella y contrástala con la cohorte anclada en la instalación.