Métricas de bot
Contención, resolución, abandono y CSAT: qué medir y cómo no engañarte.
Medir un bot es fácil; medirlo bien no. La métrica más citada, la contención, puede mejorar mientras la experiencia empeora.
Métricas que importan
- Resolución: conversaciones donde el objetivo del usuario se cumplió (turno agendado, pedido rastreado).
- Contención: conversaciones sin derivación a humano.
- Abandono por paso: dónde se van los usuarios. Revela el paso mal diseñado.
- Recontacto: usuarios que vuelven por el mismo tema en 48 h. Indica falsa resolución.
- CSAT al cierre, con una pregunta simple de 1 a 5.
Instrumenta con eventos
track("bot.step", { flow: "turnos", step: "pedir_hora", session });
track("bot.resolved", { flow: "turnos", durationMs });
track("bot.handoff", { flow: "turnos", reason: "misses" });Un bot sin métricas es una caja negra que se degrada en silencio. Las métricas útiles no son las de volumen —cuántos mensajes— sino las de resultado: cuántas conversaciones terminan resueltas, cuántas se derivan y cuántas se abandonan a mitad de flujo.
Instrumenta cada transición de estado como un evento con usuario, paso de origen, paso de destino y tiempo transcurrido. Con eso puedes construir un embudo por flujo y ver exactamente en qué pregunta se va la gente.
Pruébalo
// Record funnel events for each state transition
const eventos = [];
let paso = "inicio";
function ir(nuevo) {
eventos.push({ de: paso, a: nuevo, t: Date.now() });
paso = nuevo;
}
mx.bot.onMessage(({ text }) => {
const t = text.trim().toLowerCase();
if (t === "resumen") {
const embudo = {};
eventos.forEach((e) => { embudo[e.a] = (embudo[e.a] || 0) + 1; });
return mx.bot.reply("Embudo: " + JSON.stringify(embudo));
}
if (paso === "inicio") { ir("pidio_correo"); return mx.bot.reply("¿Cuál es tu correo?"); }
if (paso === "pidio_correo") {
if (!t.includes("@")) { ir("error_correo"); paso = "pidio_correo"; return mx.bot.reply("Ese correo no parece válido."); }
ir("resuelto"); return mx.bot.reply("¡Listo! Escribe 'resumen' para ver el embudo.");
}
ir("inicio"); return mx.bot.reply("Escribe cualquier cosa para empezar de nuevo.");
});
mx.bot.reply("Hola. Escribe algo para empezar.");