Un OKR sheet bien armado usa una sola celda de confianza - Pesimista, Base o Alcista - y una fórmula CHOOSE para cargar los supuestos correspondientes en cada cálculo posterior de forma automática. Sin intercambio manual de celdas cuando el forecast cambia, sin referencias rotas cuando alguien actualiza la pestaña de metas. La arquitectura es simple, pero el verdadero problema es lo que realmente contiene tu columna de datos cuando llegan los activos reales.
La mayoría de los tutoriales de OKRs te muestran 4 filas de números limpios escritos a mano. Eso no es tu hoja un lunes en la mañana antes del comité directivo. Este artículo cubre el patrón completo: enrutamiento de escenarios, progreso ajustado por línea base, y lo que pasa cuando tu columna Actual se importa como texto con espacios de no separación.
La estructura de pestañas que hace funcionar los OKR Sheets
Un OKR sheet mínimo vive en 3 pestañas. Una para el seguimiento, una para los supuestos y una para el selector de escenario.
OKR_Tracker - la pestaña que revisas todos los días:
| Col | Encabezado | Ejemplo |
|---|---|---|
| A | Objetivo | Crecer ingresos SMB |
| B | Resultado Clave | Nuevo ARR |
| C | Responsable | Ventas |
| D | Línea Base | $650,000 |
| E | Meta | $1,400,000 |
| F | Actual | $1,087,000 |
| G | Confianza | Base |
| H | Avance% | =fórmula |
Supuestos_Ingresos - 3 columnas de escenario, una fila por driver:
| Driver | Pesimista | Base | Alcista |
|---|---|---|---|
| Tasa de cierre nuevos clientes | 18% | 24% | 31% |
| Valor promedio de contrato | $28k | $34k | $41k |
| Ciclo de ventas (días) | 72 | 58 | 44 |
| Tasa de churn | 6.2% | 4.1% | 2.8% |
Escenario - una sola celda, B1, con una validación desplegable configurada a Pesimista,Base,Alcista.
La fórmula CHOOSE en cualquier celda calculada lee ese desplegable y enruta a la columna correcta:
=CHOOSE(MATCH(Escenario!$B$1,{"Pesimista","Base","Alcista"},0),
Supuestos_Ingresos!B2,
Supuestos_Ingresos!C2,
Supuestos_Ingresos!D2)
Cuando tu CFO o director de operaciones dice "córrelo en el caso pesimista", cambia una celda. Cada proyección aguas abajo se actualiza sola. Ese es todo el mecanismo - y se arma en unos 20 minutos una vez que tienes la pestaña de supuestos estructurada.
El progreso ajustado por línea base que tu OKR Sheet realmente necesita
La fórmula naive de avance es =F2/E2 - Actual dividido entre Meta. Produce un número, pero miente.
Si tu línea base fue $650,000 y tu meta es $1,400,000, y actualmente estás en $1,087,000, la fórmula naive dice que vas al 77.6% de la meta. Pero empezaste en $650,000, no en cero. En realidad cerraste el 58.3% del delta que necesitas cerrar: =(F2-D2)/(E2-D2) = (1,087,000 - 650,000) / (1,400,000 - 650,000) = 58.3%.
La diferencia no es cosmética. Si usas el progreso naive sobre una meta de ARR de $5,000,000 donde la línea base era $4,350,000, un titular del 77% se convierte en un avance real del 52%. Según la encuesta CFO Pulse 2024 de PwC, el 67% de los directores financieros señalan las métricas de avance engañosas como uno de los principales factores detrás de sorpresas tardías en la planeación. Construir el denominador correcto cuesta 4 caracteres adicionales.
Pon esto en H2 de OKR_Tracker:
=IFERROR((F2-D2)/(E2-D2), "-")
El IFERROR importa. Cuando E2 y D2 son idénticos - alguien fijó la meta igual a la línea base, lo cual ocurre en objetivos nuevos antes de que se definan las metas - obtienes una división por cero. Sin el wrapper, esa celda se pone en rojo y toda tu columna de avance parece rota. Con él, obtienes un guión limpio.
Lo que pasa cuando tus datos son realmente un desastre
La columna Actual (F) es donde el OKR sheet falla en la práctica. Si tus actuals los escribes a mano, estás bien. Si los importas desde un CRM, ERP, o cualquier sistema que exporta CSV - lo cual es lo más común en equipos de operaciones y finanzas de la región - vas a encontrarte esto seguido:
La celda muestra 1087000 y =F2-D2 devuelve #VALUE!.
La celda es una cadena de texto. Se ve como número pero no lo es. Verificación rápida: =ISNUMBER(F2) devuelve FALSO. Puedes limpiar una columna completa con:
=VALUE(TRIM(SUBSTITUTE(F2, CHAR(160), " ")))
El SUBSTITUTE es la parte que la mayoría de las guías de limpieza omiten. CHAR(160) es un espacio de no separación - se ve idéntico a un espacio normal en la celda, y TRIM por sí solo no lo elimina. Según la documentación de Google Sheets, TRIM solo remueve espacios ASCII estándar (código 32). Los espacios de no separación (código 160) pasan directo. Si tus actuals se importan desde un ERP, CRM, o cualquier sistema que genera salida Unicode, probablemente ya te está pasando esto sin que lo sepas.
Para el caso completo - formatos mixtos, filas en blanco, texto que dice "108 %" con espacio antes del signo de porcentaje - envuelve todo en esto:
=IFERROR(
VALUE(
TRIM(
SUBSTITUTE(
SUBSTITUTE(F2, CHAR(160), ""),
"%", ""
)
)
) / IF(SEARCH("%", F2&""), 100, 1),
""
)
Esto maneja: cadenas de porcentaje con espacios, espacios de no separación, celdas en blanco y valores numéricos directos. Ponlo en una columna auxiliar (llámala Actual_Limpio) y apunta tu fórmula de avance hacia ahí en lugar de a la columna de importación directamente.
Para filas donde aún no se ha definido el nivel de confianza - objetivos nuevos sin valor en G2 - el enrutamiento CHOOSE va a dar error. Envuélvelo así:
=IFERROR(
CHOOSE(
MATCH(G2, {"Pesimista","Base","Alcista"}, 0),
Supuestos_Ingresos!B2,
Supuestos_Ingresos!C2,
Supuestos_Ingresos!D2
),
Supuestos_Ingresos!C2
)
Sin confianza definida, el default es Base. Es un fallback razonable y evita que un tracker a medio poblar rompa todas las filas por debajo del hueco.
Las fórmulas de OKR Sheet que degradan con gracia
Juntas, una fila de producción en OKR_Tracker se ve así:
H2 - Avance ajustado por línea base:
=IFERROR((Actual_Limpio-D2)/(E2-D2), "-")
Meta enrutada por escenario (si las metas varían por escenario):
=IFERROR(
CHOOSE(MATCH(G2,{"Pesimista","Base","Alcista"},0),
Metas!B2, Metas!C2, Metas!D2),
Metas!C2
)
Brecha frente a la meta en dólares:
=IFERROR(E2 - Actual_Limpio, "-")
Los wrappers IFERROR no son teatro de programación defensiva - son la diferencia entre un tracker que falla en silencio (muestra guiones) y uno que falla a gritos (propaga errores en 40 filas y deja el sheet inutilizable antes de una presentación al board).
A partir de abril de 2026, el patrón CHOOSE con MATCH es la forma más limpia de hacer enrutamiento de escenarios en Google Sheets sin recurrir a Apps Script ni a rangos con nombre que se rompen cuando alguien renombra una pestaña. Un solo desplegable de confianza conectado a 3 columnas de supuestos cubre todos los escenarios que tu equipo directivo te va a pedir.
Mantenimiento continuo del OKR sheet
Las fórmulas de arriba toman alrededor de una hora de construir. El mantenimiento continuo - actualizar actuals, verificar que la columna Actual_Limpio sigue parseando correctamente después de un nuevo formato de CSV, agregar filas cuando los objetivos cambian a mitad de trimestre - es lo que consume las siguientes 5 horas por trimestre.
Si tu tracker de OKRs vive en Google Sheets, ModelMonkey puede leer las pestañas OKR_Tracker y Supuestos_Ingresos, actualizar actuals, agregar nuevos objetivos o reescribir la fórmula Actual_Limpio si tu formato de importación cambia. Escribe "actualiza los actuals del Q2 con esta tabla" y pega tu exportación. Se encarga de la inspección de fórmulas sin que tengas que describir la estructura del sheet desde cero cada vez.
Preguntas frecuentes sobre OKR Sheets en Google Sheets
¿Cuántas pestañas necesita un OKR sheet mínimo funcional?
Tres pestañas son suficientes para un tracker operativo: OKR_Tracker para el seguimiento diario, Supuestos para los drivers por escenario, y Escenario para el desplegable de confianza. Con esa estructura, una sola fórmula CHOOSE con MATCH conecta el selector al rango correcto de supuestos sin duplicar datos ni depender de rangos con nombre que se rompen al renombrar pestañas.
¿Cómo se calcula el avance real ajustado por línea base en un OKR sheet?
La fórmula correcta es =(Actual - Línea_Base) / (Meta - Línea_Base), no =Actual / Meta. La versión naive ignora que el equipo no partió de cero - si la línea base era $650,000 y la meta es $1,400,000, un actual de $1,087,000 representa el 58.3% del delta por cerrar, no el 77.6% de la meta total. Usa =IFERROR((F2-D2)/(E2-D2), "-") para manejar el caso en que meta y línea base son idénticos sin propagar errores.
¿Por qué mi columna Actual muestra #VALUE! al importar desde un CRM o ERP?
El problema más frecuente son espacios de no separación (CHAR(160)) incrustados en el número importado. TRIM no los elimina porque solo remueve espacios ASCII estándar (código 32). La solución es =VALUE(TRIM(SUBSTITUTE(F2, CHAR(160), " "))) aplicada en una columna auxiliar Actual_Limpio, hacia la cual apuntan todas las fórmulas de avance y brecha. Verificar con =ISNUMBER(F2) antes de depurar te ahorra tiempo: si devuelve FALSO, el valor es texto aunque se vea como número.