Best PracticesMay 2, 20267 min readSignaKit

Feature Flag Naming Conventions: The Guide to Names You Won't Regret

Bad flag names compound into real engineering debt. This guide covers the conventions used by high-output teams — with a prefix system, naming patterns, common mistakes, and a 6-item checklist you can adopt today.

Developer's monitor displaying a list of feature flags in a dark IDE

TL;DR

  • Use a type prefix: exp_, rel_, ops_, perm_
  • Write in lowercase_snake_case — never camelCase or screaming snake
  • Name the behavior, not the current value (rel_checkout_v2, not checkout_enabled)
  • Include the product area in every name (exp_billing_cta, not just exp_cta)
  • Run the 6-item checklist before creating any flag
  • Schedule a quarterly cleanup — flag names that made sense in Q1 rot by Q3

You named the flag newCheckout. Six months later, the checkout has been live for four months, three engineers have left, and nobody can remember whether the flag controls the new design, the new payment flow, or something else entirely. The flag is still in production. Nobody wants to delete it.

Feature flag naming is one of those decisions that feels trivial in the moment and expensive later. A good convention takes 10 minutes to agree on and saves hours of confusion over the lifetime of a codebase. This guide covers the conventions that work — with real examples and a checklist you can put into practice immediately.

Why Does Feature Flag Naming Matter?

Feature flags accumulate faster than teams expect. A team shipping weekly can add 2–4 flags per month; at 12 months that's 24–48 flags in production. Without a convention, each engineer invents their own schema. You end up with featureNewDashboard, enable_payments_v3, PAYMENTS_REFACTOR_2024, and tmp_killswitchall in the same codebase — none of which communicate when they were created, what they control, or when it's safe to delete them.

A naming convention solves three problems at once:

  • Discoverability — engineers can scan a list of flags and understand the system without reading code.
  • Lifecycle management — names that encode purpose and state make cleanup decisions obvious.
  • Tooling integration — consistent prefixes let you filter, alert on, and audit flags programmatically.

Martin Fowler's Feature Toggles remains the canonical reference on flag lifecycle management, and naming is central to every pattern he describes. The cost of a bad name compounds over every line of code that reads it.

What Makes a Good Feature Flag Name?

Good feature flag names share three properties: they are descriptive, consistent, and lifecycle-aware.

Whiteboard with sticky notes showing a systematic naming scheme for feature flags

1. Use a Prefix to Encode Type

Different flags serve different purposes. Encoding that purpose in the prefix makes it immediately clear how a flag should be treated:

PrefixPurposeExample
exp_Experiment / A/B test (temporary)exp_checkout_cta_color
rel_Release / gradual rollout (temporary)rel_payment_v3
ops_Operational / kill switch (long-lived)ops_disable_email_queue
perm_Permission / entitlement (permanent)perm_advanced_analytics

A flag named exp_tells everyone on the team: this is temporary, it has a hypothesis, and it should be cleaned up when the experiment concludes. That single signal prevents a whole category of “is this safe to delete?” conversations.

2. Use snake_case and Stay Lowercase

Avoid camelCase (newCheckout), PascalCase (NewCheckout), and screaming snake (NEW_CHECKOUT). Stick with lowercase_snake_case — it reads cleanly in code, URL params, log output, and API responses, and it matches how most feature flag SDKs serialize flag keys internally.

3. Describe the Behavior, Not the State

Names like checkout_enabled or show_new_dashboard embed the current expected value into the name. This creates confusion when the flag is flipped: is checkout_enabled = false the normal state or an emergency kill switch?

Name flags by what they control, not by their expected value:

// ✅ Correct — describes the behavior
rel_checkout_v2
exp_homepage_hero_variant
ops_maintenance_mode

// ❌ Avoid — embeds the expected value
new_checkout_enabled
use_new_hero
disable_app

4. Include the Product Area

Vague names like feature1 or test_flag tell you nothing. A good name answers: what system or product area does this affect? The pattern to follow:

{prefix}_{product_area}_{description}

exp_billing_annual_toggle
rel_onboarding_v2_flow
ops_search_fallback
perm_beta_analytics

Naming Patterns That Scale

Three patterns cover most teams' needs:

Pattern A — Type · Area · Behavior (recommended for most teams)

exp_checkout_cta_test
rel_dashboard_v3
perm_beta_analytics
ops_email_queue_pause

Pattern B — Area-first (useful when filtering by product area)

checkout_exp_cta_test
dashboard_rel_v3
analytics_perm_beta

Pattern C — Date-scoped (useful for time-boxed experiments)

exp_2026q2_checkout_cta

Pattern C makes quarterly cleanup obvious — anything prefixed exp_2025 in 2026 is a candidate for removal. The tradeoff is longer names. Most teams do well with Pattern A. The most important thing is picking one and enforcing it consistently across the codebase and across teams.

Pro tip: If you use SignaKit, flag keys are visible in the dashboard and can be filtered by prefix. Setting up a naming convention before your third flag makes this filtering immediately useful.

What Are the Most Common Feature Flag Naming Mistakes?

1. Naming after the ticket

JIRA-2341 tells you where the work came from, not what it does. Tickets get closed and archived; flags live in production for months.

2. Encoding the expected value

is_feature_enabledbecomes misleading the moment you need to flip it off. Name what the flag controls, not whether it's on.

3. Abbreviations without a glossary

pmt_v3_rlout_exp might make sense today. In six months, nobody will know if pmtmeans “payment” or “permit”. If you abbreviate, document it.

4. Shared flags for multiple behaviors

A single flag that controls two independent code paths is a production incident waiting to happen. One flag, one responsibility — always.

5. No prefix or type signal

Without a prefix, all flags look the same in dashboards and alert channels. Add the type signal from day one — retrofitting it across 40 flags is painful and error-prone.

Feature Flag Naming Checklist

Before creating a flag, run through these 6 checks:

An engineer reviewing a physical checklist before creating a feature flag
Does the name start with a type prefix (exp_, rel_, ops_, perm_)?
Is the name in lowercase_snake_case?
Does the name describe the behavior, not the state?
Does the name include the product area or system context?
Is there a recorded owner and a planned cleanup date?
Does this flag have one and only one responsibility?

If any check fails, rename before creating. It's free now; it costs real engineering time later. For a deeper look at how feature flags fit into your overall deployment strategy, see our guide on feature flags.

Frequently Asked Questions

How long should a feature flag name be?

Aim for 3–5 components: prefix + product area + short description (e.g., exp_billing_annual_cta). Names under 40 characters fit cleanly in dashboards, code, and log output. If you need more, the flag may be controlling too many things.

Should feature flag names match variable names in code?

Yes, wherever possible. If your flag key is rel_checkout_v2, name the corresponding constant REL_CHECKOUT_V2 or Flags.RelCheckoutV2. Consistency between the flag key and the code constant prevents a subtle class of bug where a casing mismatch causes the SDK to silently return the default value.

How often should we audit flag names?

Quarterly is a sensible minimum. Set a recurring review to identify flags older than 90 days with no active rollout — these are candidates for removal. A good feature flag platform surfaces flag age and last-evaluated timestamps in the dashboard, which makes this review significantly faster than a manual grep.

What about flags migrated from another tool?

Migration is the right moment to clean up naming debt. Establish your convention first and migrate flags to the new names rather than importing the old ones. It requires a short dual-write period, but you'll avoid carrying bad names into a clean system.

Conclusion

Feature flag naming is a small decision with a long tail. The {type}_{area}_{behavior} pattern, enforced with lowercase_snake_case, is the practical starting point for most teams. Pair it with the 6-item checklist above and a quarterly cleanup ritual and your flag inventory stays healthy as the codebase scales.

Good naming makes flag decisions visible, lifecycle management obvious, and code reviews faster. It's one of the highest-leverage 10 minutes a team can spend before shipping their third flag. If you're evaluating which feature flag platform to adopt, compare the leading tools to find the right fit for your team's scale and workflow.

Get started free

Put these conventions into practice with SignaKit

Feature flags, A/B testing, and multi-armed bandit — free up to 1 million events per month. No credit card required.