Skip to main content
Para el uso básico, consulta la página de la guía. En esta página presentamos patrones prácticos que no aparecen en la documentación oficial.

Scope por equipo en un SaaS multitenant

Si quieres gestionar las flags por equipo (tenant) en lugar de por usuario individual, cambia el scope por defecto al equipo.
Solo con esto, Feature::active('billing-v2') apunta automáticamente al equipo actual. Sea quien sea el miembro del equipo, mientras pertenezca al mismo equipo se devuelve el mismo resultado, con lo que se mantiene la coherencia de la UI. Ejemplo de rollout progresivo según la fecha de registro del equipo.
Si quieres activarlo solo para equipos concretos (entrega anticipada a clientes enterprise, por ejemplo):

Kill switch de emergencia (aprovechando el método before)

Si se descubre un bug en producción, puedes desactivar la funcionalidad al instante sin hacer rollback de código. Si añades un método before a una feature basada en clase, se comprueba antes que el valor de almacenamiento.
Con solo establecer la variable de entorno FEATURES_NEW_CHECKOUT_DISABLED=true, se puede parar la funcionalidad sin tocar la BD. Es un kill switch sin despliegue.
Si before devuelve null, se ejecuta resolve(). Si devuelve false, se trata inmediatamente como inactivo. Salvo en emergencias, devuelve null.

Rollout programado

Un caso en el que quieres publicar automáticamente para todos los usuarios en una fecha/hora concreta. Puede implementarse con el método before.
Con esto, al pasar el 2025-04-01 se publica automáticamente para todos los usuarios. Se automatiza sin despliegue, sin BD y sin comando Artisan.

Dark launch (Shadow Mode)

Es un patrón en el que ejecutas la lógica nueva con datos de producción sin mostrársela al usuario, y comparas los resultados con la lógica antigua. Si no hay problemas, basta con activar la flag para completar la release.
Revisando los logs, cuando ya no queden diferencias, basta con conmutar la flag a recommendation-v2.

Recolección de resultados de A/B testing mediante eventos

En la documentación oficial hay una mención al evento FeatureRetrieved, pero no se muestran patrones reales de agregación de A/B testing. El evento FeatureResolved se dispara solo la primera vez que se resuelve el valor de la feature. Aprovéchalo para registrar la asignación de variante al usuario.
Si además registras por separado cuando ocurre la conversión, puedes agregar la tasa de conversión por variante.
Diferencia entre FeatureResolved y FeatureRetrieved: FeatureResolved se dispara solo en la primera evaluación; FeatureRetrieved se dispara en cada comprobación. Para registrar asignaciones es adecuado FeatureResolved, y para seguimiento de vistas de página, FeatureRetrieved.

Scope en jobs encolados

En los jobs de la cola no hay usuario autenticado, por lo que las comprobaciones de feature pueden comportarse de forma inesperada. Da un scope explícito al job.
También es posible evaluar la flag en el momento del dispatch y pasarla al job.

UI de gestión mediante un comando Artisan

Si creas un comando Artisan sencillo para gestionar flags, puedes operar las flags de producción sin despliegue.

Refactorización segura del nombre de la feature (atributo Name)

Al renombrar una feature basada en clase, si cambia el nombre de la flag guardada en la BD, se resetean todas las flags de los usuarios. Fija el nombre de guardado con el atributo Name.
Con esto puedes refactorizar libremente el nombre de la clase manteniendo los datos de la BD.

Conclusión

Una vez asimilados los fundamentos de la documentación oficial, con los siguientes patrones se aprovecha todo el valor de Pennant.

Guía de Laravel Pennant

Para la instalación y el uso básico, consulta la página de la guía.
Última modificación el 13 de julio de 2026