What This Template Is For
Feature toggles (also called feature flags) let you deploy code to production without exposing it to users, then gradually roll out features to specific segments. They are one of the most effective tools for reducing deployment risk. They are also one of the most common sources of technical debt when left unmanaged.
The problem is not creating toggles. Every team can add an if-statement. The problem is tracking which toggles exist, who owns them, what state they are in, and when they should be removed. A codebase with 50 stale feature toggles is harder to reason about than one with none.
This template provides a toggle inventory, rollout plan, lifecycle tracker, and cleanup schedule. It is designed for product and engineering teams that use feature flags as part of their release process. Pair it with the deployment checklist template for per-deploy flag verification and the release planning template for multi-sprint release coordination. The Technical PM Handbook covers the broader topic of managing technical complexity.
When to Use This Template
- When creating a new feature toggle: Add it to the inventory before writing the code.
- During rollout planning: Document the rollout stages, criteria, and rollback triggers.
- Sprint cleanup: Review the toggle inventory each sprint and remove toggles that have completed their lifecycle.
- Quarterly audit: Run a full audit of all active toggles to catch stale or forgotten flags.
Step-by-Step Instructions
Step 1: Create the Toggle (5 minutes)
Before writing code, document the toggle in the inventory.
- ☐ Choose a clear, descriptive toggle name (e.g.,
enable_bulk_export, notflag_123) - ☐ Define the toggle type (release, experiment, operational, or permission)
- ☐ Assign an owner (the PM or engineer responsible for the toggle's lifecycle)
- ☐ Set a target removal date (when the toggle should be cleaned up)
Step 2: Plan the Rollout (10 minutes)
Define how the toggle will be enabled, for whom, and under what conditions.
- ☐ Define rollout stages (e.g., internal > 5% > 25% > 50% > 100%)
- ☐ Set criteria for advancing to each stage (e.g., no error rate increase, positive user feedback)
- ☐ Define rollback triggers (e.g., error rate >2%, latency >500ms)
- ☐ Document which user segments are included at each stage
Step 3: Execute the Rollout (Varies)
Move through rollout stages based on the criteria you defined.
- ☐ Enable for internal team and verify functionality
- ☐ Enable for first external segment and monitor metrics
- ☐ Advance through stages, checking criteria at each gate
- ☐ Reach 100% and mark the toggle for cleanup
Step 4: Clean Up (15 minutes)
Remove the toggle from code and the inventory once it has served its purpose.
- ☐ Confirm the feature is stable at 100% for at least 1-2 sprints
- ☐ Remove the toggle from the codebase (delete the flag and the conditional logic)
- ☐ Remove the toggle from the flag management system (LaunchDarkly, Unleash, etc.)
- ☐ Update the inventory to mark the toggle as "Removed"
The Feature Toggle Inventory Template
Team: [Team name]
Last Audit Date: [Date]
Total Active Toggles: [X]
Toggle Types
| Type | Purpose | Typical Lifespan | Example |
|---|---|---|---|
| Release | Gate a feature during gradual rollout | 1-4 weeks | enable_new_checkout_flow |
| Experiment | A/B test or controlled experiment | 2-6 weeks | experiment_pricing_page_v2 |
| Operational | Runtime configuration (kill switches, rate limits) | Permanent or long-lived | enable_rate_limiting |
| Permission | User-level access control | Permanent | enable_admin_dashboard |
Active Toggle Inventory
| Toggle Name | Type | Owner | Created | Status | Rollout % | Target Removal | Notes |
|---|---|---|---|---|---|---|---|
| [toggle_name] | [Release / Experiment / Operational / Permission] | [Name] | [Date] | [Off / Rolling Out / 100% / Cleanup Pending] | [X]% | [Date] | [Context] |
| [toggle_name] | [Type] | [Name] | [Date] | [Status] | [X]% | [Date] | |
| [toggle_name] | [Type] | [Name] | [Date] | [Status] | [X]% | [Date] |
Rollout Plan
Toggle: [toggle_name]
Feature: [Feature description]
Owner: [Name]
Created: [Date]
Rollout Stages
| Stage | Target Audience | Rollout % | Duration | Gate Criteria | Status |
|---|---|---|---|---|---|
| 1 | Internal team only | 0% (internal) | 2-3 days | No errors, expected behavior | [Pending / Active / Complete] |
| 2 | Beta users | 5% | 3-5 days | Error rate <0.5%, no negative feedback | [Status] |
| 3 | Early adopters | 25% | 5-7 days | Error rate <0.5%, latency stable | [Status] |
| 4 | General availability | 50% | 3-5 days | No P1/P2 issues reported | [Status] |
| 5 | Full rollout | 100% | Permanent until cleanup | All metrics stable for 1 week | [Status] |
Monitoring Checklist (Check at Each Stage)
- ☐ Error rate within acceptable range (<[X]%)
- ☐ API response time within SLA (p95 <[X]ms)
- ☐ No increase in support tickets related to this feature
- ☐ User engagement metrics trending as expected
- ☐ No memory leaks or performance degradation
Rollback Triggers
| Trigger | Action | Owner |
|---|---|---|
| Error rate >2% for 5 minutes | Disable toggle immediately | [Name] |
| P1 bug reported | Disable toggle, investigate | [Name] |
| Latency p95 >500ms | Roll back to previous stage | [Name] |
| 3+ support tickets in 1 hour | Pause rollout, investigate | [Name] |
Toggle Lifecycle Tracker
| Toggle Name | Created | Internal | Beta | GA | 100% | Cleanup | Removed |
|---|---|---|---|---|---|---|---|
| [toggle_name] | [Date] | [Date] | [Date] | [Date] | [Date] | [Date] | [Date] |
| [toggle_name] | [Date] | [Date] | [Date] | [Date] | [Date] | [Date] | [Date] |
Cleanup Schedule
| Toggle Name | Current Status | Days Since 100% | Target Removal | Assigned To | PR Link |
|---|---|---|---|---|---|
| [toggle_name] | 100% (stable) | [X days] | [Date] | [Name] | [Link] |
| [toggle_name] | 100% (stable) | [X days] | [Date] | [Name] |
Quarterly Audit Summary
Audit Date: [Date]
Audited By: [Name]
| Metric | Count |
|---|---|
| Total toggles in codebase | [X] |
| Release toggles (active) | [X] |
| Experiment toggles (active) | [X] |
| Operational toggles (permanent) | [X] |
| Permission toggles (permanent) | [X] |
| Toggles past removal date | [X] |
| Toggles with no owner | [X] |
| Toggles removed this quarter | [X] |
Example
Team: Payments | Last Audit: Mar 1, 2026 | Active Toggles: 7
Active Toggles
| Toggle Name | Type | Owner | Created | Status | Rollout % | Target Removal |
|---|---|---|---|---|---|---|
| enable_multi_currency | Release | Sarah | Feb 10 | Rolling Out | 25% | Mar 21 |
| experiment_checkout_cta | Experiment | Kim | Feb 17 | Rolling Out | 50% (A/B) | Mar 14 |
| enable_stripe_connect | Release | Raj | Feb 24 | Internal | 0% | Apr 4 |
| kill_switch_payments | Operational | Raj | Jan 5 | Active | 100% | Permanent |
| enable_admin_refunds | Permission | Sarah | Nov 12 | Active | 100% | Permanent |
| enable_apple_pay | Release | Dana | Jan 20 | 100% (stable) | 100% | Mar 7 (overdue) |
| enable_invoice_pdf_v2 | Release | Raj | Feb 3 | 100% (stable) | 100% | Mar 7 (overdue) |
Cleanup Needed
Two toggles (enable_apple_pay and enable_invoice_pdf_v2) have been at 100% for 6+ weeks and are past their removal date. Both are assigned to Raj for cleanup this sprint.
Tips
- Every release toggle needs a removal date. Set it when you create the toggle, not after rollout. A toggle without a removal date will live in your codebase forever. The removal date should be 1-2 sprints after reaching 100%. Add it to the sprint planning template as a cleanup task.
- Limit active release toggles to 5-10 per team. More than that creates combinatorial complexity: your QA team cannot test every possible flag combination. If you have 20+ active toggles, you have a cleanup problem, not a release problem.
- Treat stale toggles as technical debt. A toggle that has been at 100% for three months is not a feature flag. It is dead code wrapped in a conditional. Schedule cleanup work explicitly. The Product Operations Handbook discusses how to build sustainable cleanup processes.
- Separate operational toggles from release toggles. Kill switches and rate limiters are permanent. They live in your config system, not your release process. Release toggles are temporary and must be removed. Do not mix them in the same tracking system or you will lose visibility into what needs cleanup.
- Test with the toggle off before removing it. Before deleting the toggle code, verify that the system works correctly with the toggle disabled. This catches cases where other code inadvertently depends on the toggle's state.
