Feature Toggles. Cómo implementarlas de 0 a Experto
Las Feature Toggles (también conocidas como Feature Flags) son una técnica de desarrollo que permite activar o desactivar funcionalidades en un sistema sin necesidad de modificar el código ni desplegar una nueva versión. En esencia, ambas expresiones son sinónimos y se utilizan de forma intercambiable; a veces también se habla de feature bits o feature flippers.
La idea principal consiste en introducir en el código “puntos de decisión” que, en función de la configuración del flag, ejecutan una ruta u otra del programa.
Esto posibilita que equipos de desarrollo trabajen con nuevas funcionalidades de manera controlada, reduciendo riesgos y favoreciendo prácticas como la Integración Continua y la Entrega Continua.
Por ejemplo, un equipo puede estar desarrollando un nuevo algoritmo que tardará semanas en estar listo. En lugar de mantener el trabajo en una rama aparte y sufrir los problemas de fusiones largas y conflictivas, los desarrolladores integran el código en la rama principal desde el inicio, pero protegido por una feature toggle. De esta forma, la funcionalidad no afecta al resto del sistema hasta que se decida activarla.
Esta estrategia es genial para proyectos con despliegues frecuentes y rápidos. Por ello te aconsejo leerte mi artículo sobre TBD, que es un caso de uso ideal para implantar estas Feature Toggles.
Por cierto: el uso de feature toggles no se limita a facilitar el trabajo técnico. También permiten escenarios como:
Liberación progresiva (canary releases), activando una nueva función solo para un pequeño porcentaje de usuarios antes de lanzarla a todo el mundo. Lo veremos en este artículo.
Pruebas A/B o experimentos, mostrando diferentes versiones de una funcionalidad a distintos grupos de usuarios para tomar decisiones basadas en datos.
Control operativo, habilitando o deshabilitando componentes que consumen muchos recursos en situaciones de carga elevada.
Gestión de permisos, ofreciendo funciones premium a ciertos clientes o permitiendo que usuarios internos prueben características antes de su lanzamiento público.
Sin embargo, estas ventajas vendrán acompañadas de complejidad adicional: las toggles multiplican el número de posibles rutas de ejecución y estados del sistema, lo que complica la validación y las pruebas. Por eso, es fundamental clasificarlas, gestionarlas con herramientas adecuadas y, sobre todo, retirarlas cuando dejan de ser necesarias.
Al final, lo importante es entender que las Feature Toggles son un mecanismo flexible y potente para separar el momento en que se despliega el código del momento en que se libera la funcionalidad. Es el mejor caso de uso que tienen.
En este artículo te contaré como implementar las Feature Toggles en tu proyecto, pero antes, debemos conocer los tipos de toggles.
Tipos de Toggles que debes conocer
Aunque todas las feature toggles comparten el mismo principio (activar o desactivar funcionalidades sin necesidad de desplegar nuevo código), no todas cumplen la misma función ni tienen la misma vida útil.
Podemos distinguir varios tipos, cada uno con un propósito específico dentro del ciclo de vida del software.
Release Toggles (Toggles de Liberación)
Son las más comunes y probablemente las primeras que cualquier equipo implementa.
Imagina que estás construyendo una nueva funcionalidad compleja que tardará semanas en completarse. No quieres mantenerla en una rama aislada, porque sabes que las integraciones largas suelen ser dolorosas. La solución: proteger el nuevo código tras una toggle y mantenerlo “apagado” hasta que esté listo.
Este tipo de flag permite que el equipo siga desplegando a producción con total tranquilidad, aunque la funcionalidad aún no esté terminada. En otras palabras: separa el despliegue del lanzamiento.
Eso sí, tienen fecha de caducidad muy corta: en cuanto la nueva funcionalidad esté consolidada, la toggle debe retirarse. Así que requieren un buen mantenimiento.
Experiment Toggles (Toggles de Experimento o A/B Testing)
Aquí entramos en el terreno del producto y la toma de decisiones basada en datos. Estas toggles permiten mostrar diferentes versiones de una funcionalidad a distintos grupos de usuarios, de forma controlada y consistente.
Un ejemplo clásico es el de un botón de compra:
¿funciona mejor el texto “Comprar ahora” o “Añadir al carrito”?
Con una experiment toggle podemos dividir el tráfico en cohortes y comparar resultados reales. La clave está en que la decisión de qué camino tomar se hace en tiempo de ejecución y por usuario, garantizando que cada persona siempre vea la misma variante durante todo el experimento.
Estas toggles viven lo suficiente como para obtener datos estadísticamente significativos (días o semanas), pero deben retirarse una vez tomada la decisión.
Ops Toggles (Toggles Operacionales)
Si las anteriores estaban pensadas para el desarrollo y el producto, estas se diseñan para el mundo real de la operación.
Un ops toggle funciona como un interruptor de emergencia que los equipos de operaciones o SRE pueden accionar en producción para proteger la estabilidad del sistema.
Por ejemplo:
Un panel de recomendaciones que es muy costoso de calcular.
Bajo condiciones normales, está activo. Pero si la web empieza a sufrir una carga inesperada, se puede “apagar” de inmediato para reducir consumo de recursos sin necesidad de hacer un despliegue.
Algunas de estas toggles son temporales —hasta ganar confianza en un nuevo componente—, mientras que otras se convierten en auténticos “kill switches” permanentes, siempre listos para ser activados si algo se tuerce.
Permissioning Toggles (Toggles de Permisos o Segmentación)
Por último, tenemos las toggles orientadas a gestionar quién puede ver qué dentro de un sistema. Aquí hablamos de activar funcionalidades solo para ciertos grupos: usuarios premium, clientes enterprise, testers internos o un grupo reducido de “beta users”.
Este tipo de toggle no suele tener una fecha de caducidad corta. De hecho, muchas veces se quedan en el sistema durante años, porque forman parte de la estrategia de negocio: ofrecer experiencias distintas según el perfil del cliente. Son muy dinámicas, ya que la decisión depende del usuario que hace la petición.
Un ejemplo típico sería un SaaS que ofrece informes avanzados solo a clientes de pago. La funcionalidad existe para todos, pero solo quienes cumplen los criterios ven la opción disponible en su interfaz.
Gestión de Feature Toggles con un ejemplo en Python y Fastapi
Veamos cómo montar una API usando FastAPI para manejar rutas cuyos comportamientos cambian según feature flags.
FastAPI es un framework moderno, de alto rendimiento para crear APIs en Python 3.8+, con validación de datos, documentación automática y tipado estándar gracias a Pydantic.
Me gusta utilizarlo porque es muy liviano, y es fácil de implementar buenas prácticas con él.
1. Instalación de FastAPI y Uvicorn
2. Implementación simple de un gestor de flags
Podemos simular la obtención de feature flags con una clase sencilla, que podría eventualmente conectarse a una base de datos o sistema externo.
En realidad hay incluso servicios Saas que lo proporcionan (como Unleash), pero creo que aprenderás más sobre los feature flags si implementas un gestor desde cero, que además es potente para la mayoría de proyectos y te libero de una dependencia externa más.
Un “gestor de flags” no es más que una clase que guarda el estado de tus feature flags (por ejemplo, nueva_home = True/False) y ofrece métodos para:
- Consultar si una flag está activa.
- Cambiar su valor.
- (Opcional) Evaluarla con contexto (por usuario, por porcentaje, por entorno, etc.). Esto ya depende del tipo de Feature Flag que hemos visto antes.
- (Opcional) Guardar y cargar flags de un archivo JSON para que persistan. Lo haremos en este artículo.
Empezaremos con algo muy simple (lo alojaremos en memoria) y luego le añadimos “superpoderes” a todo esto paso a paso.
Vamos a tratar de crear una clase que cumpla los siguientes test:
El código resultante sería tan sencillo como este:
Para usarlo:
Con esta clase tan simple ya puedes condicionar comportamientos en el resto de tu código
Vamos a ponerle persistencia
A veces quieres que tus flags sobrevivan si reinicias la app. Para eso podemos cargar/guardar en un JSON para mantener esos valores.
Para ello tenemos que ampliar el código escrito anteriormente. Nada del otro mundo. Sólo añadirle esa persistencia en un JSON.
Para ello, reescribimos los tests que deberían ser satisfechos por la clase:
Y finalmente la clase nos quedaría así:
El archivo JSON tendría que tener esta estructura:
Y ahora vamos a ver como se podría usar.
Otro superpoder: flags con porcentaje de activación (rollout gradual)
Esto es muy útil para activar una función al X% de usuarios de forma estable (el mismo usuario siempre cae en el mismo lado). Para eso usamos un hash del user_id
y lo convertimos a 0–99. Suena lioso, pero verás que es muy sencillo de hacer a partir de lo que ya tenemos. Como ya te he contado, este tipo de flag es importantísimo para realizar test A/B.
Idea
Cada flag puede ser:
- bool → on/off global.
- dict con una clave
rollout
(0–100) → porcentaje.
Regla de evaluación:
- Si es
bool
, devolvemos ese valor. - Si tiene
rollout
, calculamos el “bucket” del usuario:bucket = hash(user_id) % 100
. - Está activada si
bucket < rollout
.
feature_flags.py (soporta bool o rollout por usuario)
Ejemplos:
Integración con FastAPI
Integramos el gestor en tu API para:
- Consultar todas las flags.
- Activar/desactivar una flag booleana.
- Configurar un rollout.
- Evaluar una flag para un
user_id
.
main.py
Lanza la API:
Puedes hacer algunas pruebas rápidas con curl
para ver que funciona:
Creación de rutas condicionadas por flags en nuestra API
Imagínate que tienes este endpoint y quieres aplicarle una Feature Flag:
Con FastAPI (que está basado en Starlette), lo más cómodo es usar functools.wraps para crear un decorador que reciba el nombre de la flag y, opcionalmente, datos del usuario. Dentro del decorador verificamos la flag usando el ff_client. Si la flag está deshabilitada → lanzamos un HTTPException(404).
Y en la API se implementaría así:
Buenas prácticas con Feature Flags
Cuando empieces a usar feature flags en tus proyectos, verás que al principio es muy fácil: un if
que activa o no una función. Pero en aplicaciones reales los flags pueden crecer rápido y, si no los manejas bien, se vuelven un lío.
Aquí tienes una guía de buenas prácticas explicada paso a paso:
Usa un identificador estable para los usuarios
Si vas a activar un flag solo para un porcentaje de usuarios, necesitas que siempre les toque el mismo resultado.
No uses cosas que cambian todo el tiempo como el número de sesión o un timestamp.
Sí usa un identificador único y fijo como el user_id
o el correo electrónico.
Así, si activas una función al 30% de usuarios, siempre serán los mismos, y no cambiará cada vez que recarguen la página.
Empieza siempre con un valor seguro por defecto
Si el sistema de flags falla o alguien pregunta por un flag que no existe, lo mejor es que devuelva False (desactivado).
Esto evita mostrar una función que todavía no está lista o que puede romper el sistema.
Define reglas claras de evaluación
Cuando tengas varias condiciones (por ejemplo lista de usuarios permitidos, usuarios bloqueados, atributos como país o plan), sigue siempre el mismo orden:
- Deny (usuarios que nunca pueden entrar).
- Allow (usuarios que siempre entran).
- Atributos (ej. solo España o plan Pro).
- Rollout (porcentaje de activación).
Esto te da consistencia y evita resultados confusos.
Documenta cada flag
Pon nombres claros y explica para qué sirve el flag.
Ejemplo malo:
Ejemplo bueno:
Esto ayuda a ti y a tus compañeros a entender rápidamente qué hace cada flag.
Limpia los flags que ya no se usen
Un error muy común es dejar los flags viejos en el código después de que la nueva función ya está activa para todos. Eso se llama deuda técnica: basura acumulada que hace el código más difícil de mantener.
👉 Regla de oro: cuando un flag ya llegó al 100% y la función es estable, borra el flag y el código viejo.
Separa flags por entorno
Tu aplicación seguramente tendrá entornos distintos: desarrollo, staging, producción.
No uses las mismas flags para todos, porque lo que pruebas en desarrollo puede colarse en producción.
👉 Solución: tener flags separados por entorno o añadir un prefijo (ej. dev__checkout_v2
, prod__checkout_v2
).
Guarda registros (logging)
Cuando un flag cambia de valor o cuando un usuario entra o no a una función, puede ser útil guardar un log.
Esto sirve para:
- Depurar errores (“¿por qué no se activó para este usuario?”).
- Hacer auditoría (“quién tenía acceso a qué y cuándo”).
No abuses de los flags
Los flags son muy útiles, pero demasiados flags al mismo tiempo pueden complicar mucho el código.
Intenta que cada flag tenga una vida corta: lo usas para probar una función, lo despliegas poco a poco y luego lo quitas.
Con estas prácticas, incluso si estás empezando, podrás manejar feature flags de forma ordenada, segura y sin que tu código se convierta en un laberinto.
No utilizar feature toggles para lógica de negocio
Perfecto, Sergio 👍. Aquí tienes un apartado redactado en tono claro y profesional para tu artículo:
No utilizar feature toggles para lógica de negocio
Imagina que en una tienda online decides calcular el precio de dos maneras diferentes según si un toggle está en true
o en false
. Eso significa que tu regla de negocio (cómo se calcula el precio) depende de un interruptor. El problema es que:
- Tu código se vuelve más difícil de leer y entender.
- Es más probable que olvides apagar el toggle y tu aplicación termine con dos lógicas conviviendo mucho tiempo.
- Al final, tu lógica de negocio queda “escondida” detrás de condicionales en lugar de estar clara y bien definida.
👉 Lo correcto es que la lógica de negocio siempre esté dentro del dominio, escrita de forma clara y estable.
👉 Los toggles deberían usarse solo para controlar si una nueva funcionalidad se muestra o no, o para hacer pruebas temporales.
Así que usa los feature toggles para exponer o probar funciones, no para definir cómo funciona tu negocio.