Individual Identity Overrides in Flagsmith

Individual Identity Overrides in Flagsmith

How to give one single person, device, or account their own special answer for a feature, why this is the sharpest tool in the targeting toolbox, and how to use it without leaving traps behind. Explained from the first idea to production-grade practice.

Picture a school principal who has written one rule for the whole school: “Mobile phones must stay in bags.” One morning a student named Kavya arrives with a note from her doctor. She must keep a phone in her pocket to monitor a health condition. The principal does not change the school rule. She does not create a new rule for the whole class either. She writes a small note, “Kavya may keep her phone,” and gives it to the teachers. The rule stays the same for hundreds of children. One child has an exception.

That small note is exactly what Flagsmith calls an individual identity override. Flagsmith is a platform that lets a team switch features on and off, and change their settings, without publishing new software. Most of the time the team decides in groups: everyone in a country, everyone on a paid plan, ten percent of all users. But sometimes the right decision is about one person. A beta customer who asked for early access. A tester who must see an unfinished feature in the live product. An important client who is suffering from a bug and needs the old behaviour for a week. For these cases, Flagsmith lets you attach a special answer directly to one identity.

This guide teaches identity overrides from zero. We will first learn the words, then the layers of authority in which an override sits, then how to create, read, change, and remove one, then how overrides behave across environments, how they relate to segments, and how they can go wrong. We will look at security, monitoring, testing, and the patterns that keep overrides tidy. We assume you know nothing yet. Every new term is explained when it first appears, and every big idea has an everyday comparison.

One person
receives the special answer
One environment
is where that answer lives
Highest priority
beats segments and defaults
i
Tip

Flagsmith changes over time. Screen names, limits, and plan features may differ between versions. This guide teaches the lasting ideas. When you need an exact button name, limit, or price, check the official Flagsmith documentation for the version you use.

1Why We Need Exceptions for One Person

Before learning any Flagsmith words, let us feel the problem. Rules for groups are powerful, but real life keeps producing people who do not fit the groups.

Groups are not enough

A feature flag is a switch that turns a behaviour on or off without a new release. At the simplest level it has two positions for everyone. A smarter system lets you decide by group: “on for staff,” “on for premium customers,” “on for ten percent.” These group rules cover the great majority of decisions. But think about the daily life of a product team and you will meet a different kind of request, again and again.

Request 1

The eager beta customer

A customer who has helped you for years asks to try the new reporting screen before the launch. They belong to no special group. They are simply one person you want to please.

Request 2

The tester in the live product

A quality engineer must verify a feature using a real production account, while everyone else still sees the old version.

Request 3

The broken experience

One important client reports that the new design breaks their workflow. You want to switch it off for them today, while engineers fix the problem.

Request 4

The demo account

The sales team has a demo identity that must always show the newest features, even those that real customers have not received yet.

Request 5

The support investigation

Support wants to reproduce a customer’s problem by giving a test identity the same settings the customer has.

Request 6

The safety exclusion

A regulated customer must never receive a feature that has not been reviewed by their compliance team, whatever group rules say.

The cost of building a group for each exception

You could answer every one of these requests by inventing a trait and a segment. For the eager beta customer you would add a trait called “early_access,” send it from your application, build a segment that reads it, and attach the segment to the feature. That is the right answer when ten or a hundred people need the same exception. But for a single person, with a single feature, for a single week, it is heavy. You change application code, send new data about a person, and create a permanent object in your project that will confuse people next year.

An identity override is the light answer. You open that one person in the dashboard, pick the feature, and choose the answer they should get. No application change, no new trait, no new segment. The exception exists in one clearly visible place, attached to the person it concerns.

Analogy

Think of a restaurant with a printed menu. The menu is the same for every guest. If one guest is allergic to nuts, the waiter does not reprint the menu. He writes a small note on that guest’s order slip. The note is quick, personal, and clearly attached to one table. An identity override is the note on the order slip.

A short story

Rohan leads support at a company that sells accounting software. On Monday a large customer, “Sunrise Traders,” writes that the new invoice screen hides a button their staff use hundreds of times a day. Engineers need three days to fix it. Rohan does not wait. He opens the Sunrise Traders identity in the live environment, finds the feature “new invoice screen,” and creates an override that switches it off for that identity alone. Within minutes, Sunrise Traders sees the old screen again. Every other customer keeps the new one. On Thursday the fix ships, Rohan deletes the override, and the customer joins everyone else. The whole episode touched no code and no other customer.

A segment answers “who is like this?” An identity override answers “what about this one person?”

Three kinds of exception, three different needs

Not every exception is the same, and noticing the kind helps you choose the right tool. A privilege exception gives a person more than the rule allows: early access, a higher limit, a premium feature during a trial. A protection exception gives a person less than the rule allows, to shield them from harm or from change: a disabled feature for a client in a freeze. A diagnostic exception exists only so that someone can look at the product through another person’s eyes: a support engineer who reproduces a customer’s problem on a test identity.

Privilege exceptions carry the risk of giving away value by accident. Protection exceptions carry the risk of being forgotten and so denying a person a good thing for years. Diagnostic exceptions carry the risk of leaking real customer details into test accounts. All three are legitimate, and all three benefit from the same simple habits: a reason, an owner, and an end date.

i
Tip

When you write the reason in a ticket, begin with the kind of exception: “privilege,” “protection,” or “diagnostic.” It takes one word, and it tells the reviewer in a month’s time exactly which risk to look for.

2The Vocabulary: Organisation, Project, Environment, Feature, Identity

An override touches several parts of Flagsmith at once. A quick map of those parts makes everything else easy to follow.

The map of Flagsmith

Flagsmith arranges things like a set of boxes inside boxes. An organisation is the company account. Inside it live projects, usually one per product. Inside a project live features, which are the switches and settings, and segments, which are saved groups of people defined by rules. A project also holds environments such as Development, Staging, and Production, so that the same features can be tried safely before they reach real customers.

flowchart TB
    ORG["Organisation: the company account"] --> PRJ["Project: one product"]
    PRJ --> FEAT["Features: shared definitions"]
    PRJ --> SEG["Segments: shared group rules"]
    PRJ --> ENV1["Environment: Development"]
    PRJ --> ENV2["Environment: Staging"]
    PRJ --> ENV3["Environment: Production"]
    ENV3 --> ID1["Identity: customer 1001"]
    ENV3 --> ID2["Identity: customer 1002"]
    ID1 --> OV1["Override: new invoice screen is off"]
    ENV2 --> ID3["Identity: tester A"]
    ID3 --> OV2["Override: new invoice screen is on"]
    
Figure 1: Features and segments belong to the project, while identities and their overrides belong to one environment

Four words you must know

1

Feature

A named switch, setting, or experiment, such as “new invoice screen.” A feature is defined once for the whole project and then has a separate state in every environment.

2

Feature state

The actual answer for a feature in a given place: enabled or disabled, together with an optional value such as a number or a piece of text.

3

Identity

The record of one user, device, or account, recognised by a unique identifier that your application sends. Identities live inside one environment.

4

Trait

A small fact about an identity, stored as a key and a value, such as plan equals premium. Segment rules read traits.

The simplest definition of an identity override

An identity override is a feature state that belongs to one specific identity, for one specific feature, in one specific environment. It says: “For this person, in this environment, ignore all the group rules and the defaults for this feature, and give this answer instead.” It can set the enabled position, and, for features that carry a value, it can set the value as well.

TermScopePlain meaning
FeatureWhole projectThe named switch or setting
Environment default stateOne environmentThe answer everyone gets unless something more specific applies
SegmentWhole projectA saved group defined by trait rules
Segment overrideOne environmentA special answer for everyone who matches a segment
IdentityOne environmentOne recognised user, device, or account
Identity overrideOne environmentA special answer for exactly one identity
Analogy

Think of a hospital. The hospital has standing procedures for all patients, special procedures for groups such as children or diabetics, and a personal care plan written for one patient. The personal care plan is the identity override: written by a doctor, kept in that patient’s file, and overriding the general procedure for that one person only.

!
Warning

An override attaches to an identifier, which is just text. If your application later sends a different identifier for the same human, the override does not follow them. The new identifier is a new identity with no overrides.

Why the layers are designed this way

It is worth asking why Flagsmith places the personal override above everything else. The answer is predictability. When a human takes the trouble to say “this person gets this answer,” the human expects that answer to hold. If a segment could quietly overrule a personal decision, every exception would be unreliable, and support teams could never promise anything to a customer. By making the personal layer the strongest, Flagsmith lets an exception mean exactly what it says. The cost, as we will see, is that a forgotten exception keeps meaning what it says for as long as it exists.

3Where an Override Sits in the Order of Authority

Every time an application asks for a feature, Flagsmith works through layers from the most specific to the most general. The first layer with something to say wins. The identity override is the most specific layer of all.

The layers

flowchart TB
    START["Request: environment key and identifier"] --> L1{"Layer 1: is there an identity override for this feature?"}
    L1 -- Yes --> R1["Answer comes from the identity override"]
    L1 -- No --> L2{"Layer 2: does the identity match a segment that overrides this feature?"}
    L2 -- Yes --> P["If several match, choose the highest priority"]
    P --> R2["Answer comes from that segment override"]
    L2 -- No --> L3{"Layer 3: is the feature multivariate or a percentage split?"}
    L3 -- Yes --> H["Stable hash chooses a variation"]
    H --> R3["Answer comes from the chosen variation"]
    L3 -- No --> R4["Layer 4: the environment default state"]
    
Figure 2: The identity override is checked first and beats every other layer

Look at the diagram slowly. For one feature, Flagsmith first asks whether this exact identity has a personal override. If it does, the question is closed, and no segment is even consulted. If it does not, the segments are tested against the person’s traits. If none matches, a variation or percentage rule may decide. Only if all of that is silent is the environment default used.

What “wins” means in practice

The override beats segments even when the person matches a segment that would give the opposite answer. If a segment says “enable the new design for all premium customers” and one premium customer has an override saying “disabled,” that customer sees the old design. The override also beats the percentage rollout. A person who falls inside the ten percent still sees the feature disabled if they carry a disabled override. And it beats the default.

SituationDefaultSegment saysOverride saysPerson receives
No special rulesOffNo matchNoneOff, from the default
In an enabling segmentOffOnNoneOn, from the segment
In an enabling segment, with personal offOffOnOffOff, from the override
Not in segment, with personal onOffNo matchOnOn, from the override
Default on, personal offOnNo matchOffOff, from the override
Different valuesValue 5Value 10Value 20Value 20, from the override

The override is per feature

An override applies to one feature at a time. If you want a person to receive special answers for three features, you create three overrides. Their answers for every other feature continue to come from segments and defaults as usual. This keeps an exception narrow: you change exactly what you intended.

Analogy

Think of a school hierarchy of instructions. A written note from a parent about one child beats the class teacher’s rule. The class teacher’s rule beats the school’s general rule. The school rule applies to anybody left over. Flagsmith’s layers follow the same common sense: the more specific the instruction, the stronger it is.

i
Tip

Because the override is the strongest layer, it is also the easiest to forget. When someone says “the segment says on, but this user sees off,” the first place to look is that user’s identity page.

Reading the identity page as a story

The identity page is not just a list. It tells a short story for every feature, and learning to read that story makes you quick. For each feature the page shows the answer the person receives, and where it came from. If the source is an identity override, the story is “a human decided this for this person.” If the source is a segment, the story is “this person’s traits matched a rule.” If the source is the default, the story is “nothing special applies.” When the story does not match your expectation, the mismatch itself is the clue. A person who should be in a segment but shows the default has a trait problem. A person who is in a segment but shows a different answer has a stronger layer above it, and the strongest layer is the personal override.

Practise this reading on three or four identities in a quiet moment, before any emergency. Pick a feature, predict the layer that will win, then open the page and check. After a few rounds you will find the answer in your head before the page loads, and your confidence in the system will grow with it.

4How an Identity Comes to Exist

You cannot override a person Flagsmith has never heard of. This chapter explains how identities are created, so you know when an override is possible.

The environment key and the SDK

Your application talks to Flagsmith through an SDK, which stands for software development kit. It is a small library, written for your programming language, that handles the conversation. When the SDK starts, it is given the environment key, a code that tells Flagsmith which environment the application belongs to. Production applications carry the Production key, staging applications carry the Staging key, and so on.

Three ways an identity appears

Way 1

Created by use

The application asks for flags and includes an identifier. If Flagsmith has never seen that identifier in this environment, it creates the identity at that moment.

Way 2

Created through the API

A script or back-end job creates identities in advance using the management interface, perhaps from a list of beta customers.

Way 3

Created by the dashboard

A person with permission opens the identities screen in the dashboard and adds an identifier by hand, before the person has ever used the product.

Why this matters for overrides

Because identities can be created in advance, you can set an override before the person first arrives. A product manager can create the identity for a customer who is joining next week, attach the early access override, and the first time that customer opens the application the correct feature state is already waiting. This is useful for planned beta programmes and demos.

sequenceDiagram
    participant PM as Product manager
    participant D as Flagsmith dashboard
    participant FS as Flagsmith
    participant APP as Application
    participant U as Customer
    PM->>D: Create identity customer-884 in Production
    PM->>D: Add override: new reports is on
    D->>FS: Save identity and override
    U->>APP: Opens the app for the first time
    APP->>FS: Get flags for customer-884 with environment key
    FS->>FS: Find identity, find override, work out answers
    FS-->>APP: new reports is on, others from segments and defaults
    APP-->>U: Shows the new reports screen
    
Figure 3: An override can be prepared before the customer ever arrives

The identifier must match exactly

An override is attached to the identifier text. “customer-884” and “Customer-884” are different identifiers to a computer, and so are “customer-884” and “customer-884 ” with a space at the end. If the identifier your application sends differs by even one character from the one in the dashboard, the person will not find their override. Copy identifiers from your own database or from the identity search in the dashboard, never retype them from memory.

!
Warning

Never use an email address or phone number as an identifier merely to make overrides easy to type. Identifiers appear in dashboards, logs, and exports. Use an opaque internal number, and look it up from your own system when you need to create an override.

Analogy

Think of the library. A librarian can prepare a reserved-book slip with a member’s card number even before the member visits. When the member arrives and shows the card, the slip is found at once. But if the slip has a mistaken digit in the number, the member waits at the desk and nobody understands why.

5Creating, Reading, Changing, and Removing an Override

Like any record, an override has a life: it is created, read, changed, and removed. Knowing each action tells you where mistakes can enter.

Creating an override in the dashboard

In the Flagsmith dashboard, you choose the project and the environment, and open the identities area. You search for the identity by its identifier, or add it if it does not exist yet. On the identity’s page you see its traits and the list of features with the state each one currently gives that person. For a feature you want to change, you pick the action that overrides it for this identity, choose enabled or disabled, set a value if the feature carries one, and save. From that moment, the person’s answer for that feature comes from the override.

1

Choose the right environment

Check the environment name at the top of the screen. Overrides made in Staging do not exist in Production, and a Production override affects real customers at once.

2

Find or add the identity

Search with the exact identifier. If the person has never used the product, create the identity first.

3

Read the current answer

Before changing anything, read what the person receives now and why, from default, segment, or an existing override.

4

Create the override

Pick the feature, choose enabled or disabled, set the value if needed, and save.

5

Verify the result

Reopen the page and confirm the feature now shows the override as its source. Ask the person, or use a test device, to confirm the application really changes.

6

Record why

Write down who asked, why, and when the override should be removed, in the ticket or a shared log.

Other ways to manage overrides

The dashboard is the friendliest door, but it is not the only one. Flagsmith offers an Admin API, which is a set of web addresses that programs can call to read and change things. A script can create identities and overrides in bulk, for example for a list of two hundred beta customers. Teams that manage infrastructure as code may also use a Terraform provider, where the desired overrides are written in files and applied automatically. Which of these is available, and how exactly it is named, depends on your Flagsmith version, so confirm in the documentation.

MethodBest forMain risk
DashboardOne-off exceptions, support casesMistakes in the wrong environment, no record of reasons
Admin API with a scriptBulk creation, beta lists, clean-up jobsA bug in the script can change many identities at once
Infrastructure as codeLong-lived, reviewed, repeatable settingsSlower to change in an emergency
Application code through the SDKSetting traits that segments read, not overridesConfusing traits with overrides, since the SDK mainly reads

Changing and removing

To change an override, you edit it on the same identity page, for instance flipping enabled to disabled or editing the value. To remove it, you delete the override. Once removed, the person falls back to the next layer: segments, then the default. Removing is the step teams most often forget, which is why a later chapter is devoted to it.

Analogy

Think of the sticky notes on a fridge. Writing a note takes seconds. The notes pile up when nobody takes them down after the event has passed. A wise household writes a date on every note, and clears the board every Sunday.

i
Tip

Always do a “before and after” read of the identity page. It takes ten seconds, shows exactly which layer was winning before your change, and gives you a record you can paste into the ticket.

What a good request looks like

The quality of an override often depends on the quality of the request that led to it. A vague request such as “please give this customer the new thing” produces vague, forgotten overrides. A good request answers six questions. Which person, by exact identifier? Which feature, by exact name? Which environment? Which direction, enable or disable, and with which value if any? Why, in one sentence? Until when? A team that insists on these six answers, even in a hurry, produces overrides that can be understood a year later.

Make the request form easy. A short template in your ticket system with six boxes takes less than a minute to fill and removes most back-and-forth. For emergencies, allow the form to be filled afterwards, within a day, so help is never delayed, but make the later filling a firm rule. Emergencies are exactly when people forget to write things down.

Verifying with the person

After you create an override, the story is not finished until the person has seen the effect. Ask them to refresh, sign out and in, or restart the application, and to confirm. Customers appreciate being told what to expect: “In a few minutes, your invoice screen will return to the older layout. Please sign out and in once if it does not.” This small message turns a technical change into good service, and it gives you evidence that the override reached the real screen.

6What an Override Can Set: State, Value, and Variations

An override is a small bundle of answers. Understanding what is inside lets you decide exactly how much to change.

The enabled position

Every feature has an enabled position: on or off. An override can set this to either. “Enabled” means the feature is on for the person, “disabled” means it is off. Note that an override can switch a feature off for someone even when everyone else has it on. This is how you protect a customer from a risky launch.

The value

Besides the on or off position, a feature may carry a value: a number, a piece of text, or a small structured text. Teams use values as remote configuration, meaning settings that live in Flagsmith instead of in the application. Examples are the maximum number of items on a page, the colour of a button, or the address of a help page. An identity override can change the value just for one person, so a beta customer can receive “twenty items per page” while others see “ten.”

Setting

Enabled only

The classic on or off exception. Example: new design is disabled for one important client.

Setting

Value only

Keep the position, change the setting. Example: this beta customer gets a page size of twenty instead of ten.

Setting

Both together

Switch the feature on and set a special value. Example: enable the export tool and set the daily limit to one thousand for a pilot customer.

Setting

A chosen variation

For multivariate features, pin a person to a specific variation. Example: always show variation B to the demo account.

Multivariate features and overrides

A multivariate feature has several variations with weights, such as forty percent for blue, forty percent for green, and twenty percent for the control. Normally a hash chooses a variation for each person. An identity override can pin one person to one variation. This is helpful in two situations. First, to let a team member or a demo account always see a particular variation. Second, to remove a complaining person from an experiment while keeping everyone else in it.

!
Warning

Pinning people to variations skews experiment results. A pinned identity no longer behaves like a random member of the group. Keep pinned identities few, and exclude them from your analysis, or tell the analysts that they exist.

What an override cannot do

  • It cannot create a feature. The feature must already exist in the project.
  • It cannot change the feature’s definition. Name, type, and tags belong to the feature, not to the identity.
  • It cannot affect another environment. It lives only where it was made.
  • It cannot change traits. Traits and overrides are separate records on the identity.
  • It cannot apply to a group. One identity, one override per feature. Groups belong to segments.
Analogy

Think of a restaurant order slip again. The waiter can write “no onions” and “extra spicy” on one guest’s slip. He cannot rewrite the recipe in the menu, and he cannot change what the next table receives. The slip changes the dish for one guest only, and only for the items written on it.

Use case: a pilot customer with a higher limit

An export feature allows five hundred rows per day for everyone. A large customer is piloting a new data workflow and needs five thousand. The team creates an identity override on the “daily export limit” feature for that customer, setting the value to five thousand. The feature stays enabled by default, so the override only changes the value. When the pilot ends in a month, the override is removed and the customer returns to the standard limit, or is moved into a paid plan segment that carries a higher limit for all customers on that plan.

7Identity Overrides Versus Segment Overrides Versus Defaults

Three tools can change what a person sees. Choosing the right one is the most important skill in this guide.

The three tools side by side

AspectEnvironment defaultSegment overrideIdentity override
Who it affectsEverybody not covered by something more specificEveryone matching the segment rulesExactly one identity
Where it is definedThe feature in an environmentThe feature in an environment, linked to a segmentThe identity page in an environment
Needs traitsNoYes, rules read traitsNo
Needs application changeNoOnly if the needed traits are not sent yetNo
Scales to many peopleYesYesNo
PriorityLowestMiddle, ordered by priorityHighest
VisibilityHigh, on the featureHigh, on the featureLow, hidden on individual pages
Best forThe normal behaviourGroups with a shared reasonTrue one-off exceptions

The visibility problem

The biggest difference is visibility. A segment override is visible on the feature screen: anyone who opens the feature sees which segments override it. An identity override is visible only on the identity’s own page. A person who studies the feature screen will never see it. So a feature can look perfectly tidy while a hundred hidden personal exceptions change what a hundred people receive. This is why teams keep identity overrides rare, recorded, and reviewed.

Where identity overrides shine

  • Fast response to one person’s needs.
  • No data or code changes required.
  • Certain result, because it is the top layer.
  • Easy to remove cleanly when finished.

Where they struggle

  • Do not scale beyond a handful of people.
  • Hidden from the feature view.
  • Can silently outlive their purpose.
  • Not reflected in segment sizes or reports of groups.

A decision path

flowchart TB
    NEED["A person needs a different answer"] --> Q1{"Will more than a few people need the same exception?"}
    Q1 -- Yes --> SEGPATH["Create a trait and a segment, use a segment override"]
    Q1 -- No --> Q2{"Is it temporary, with a clear end date?"}
    Q2 -- No --> Q3{"Is there a lasting reason that could be a trait?"}
    Q3 -- Yes --> SEGPATH
    Q3 -- No --> OVR["Use an identity override, record the reason"]
    Q2 -- Yes --> OVR
    OVR --> END["Set a reminder to remove it"]
    
Figure 4: Choose a segment for groups and lasting reasons, and an identity override for short, personal exceptions

When one-off becomes a group

The clearest signal that you should leave overrides behind is repetition. The first time a beta customer asks for early access, an override is perfect. The fifth time, you are quietly building a group by hand. Stop, define a trait such as “beta_tester,” send it from your application or set it through the API, create a segment that reads it, and attach the segment to the feature. Then delete the five overrides. The group is now visible on the feature screen, easy to extend, and easy to measure.

Analogy

Think of a teacher who lets one child sit near the window because of poor eyesight. That is an exception for one person. Then three more children need the same seat, and the teacher realises she has a category: “children who need the front row.” She stops writing notes and creates a seating rule. A rule is easier to explain, easier to check, and does not depend on one teacher’s memory.

i
Tip

Use a simple count as an alarm. If one feature has more than about five identity overrides, schedule a review to ask whether a segment would serve better. The right number depends on your team, but having a number at all helps.

A worked comparison

Let us follow one feature, “new dashboard,” through all three tools. The environment default is off. A segment named “Premium customers” overrides it to on. Customer A is a premium customer with no personal override. Customer B is a premium customer with a personal disabling override. Customer C is a free customer with a personal enabling override. Customer D is a free customer with nothing special.

  • Customer A matches the segment, has no personal override, and so receives on, from the segment.
  • Customer B matches the segment, but the personal override is stronger, so B receives off.
  • Customer C matches no segment, but the personal override says on, so C receives on.
  • Customer D matches nothing and has nothing personal, so D receives off, from the default.

Notice that the feature screen alone would tell you only about the default and the segment. A reader of that screen would predict on for A and off for everyone else, and would be wrong about B and C. This is the hidden-exception effect in a small, concrete form.

8Environments: Why an Override Lives in Only One Place

The same person can exist in Development, Staging, and Production, and in each place they are a different record. This design protects you, and it also catches people out.

What belongs to the project and what to the environment

ItemShared across the projectSeparate per environment
Feature definitionYesNo
Segment definitionYesNo
Default feature stateNoYes
Segment override on a featureNoYes
IdentityNoYes
TraitsNoYes
Identity overrideNoYes
Environment keyNoYes

Three consequences

1

Staging overrides never leak into Production

A tester’s personal exception in Staging is invisible to real customers. You can experiment freely.

2

Staging tests prove less than you think

If testers relied on personal overrides in Staging, you have not tested the group rules that real customers will meet in Production.

3

Nothing is copied automatically

Creating a new environment as a copy of another copies feature states, but you should never assume identities and their overrides come along. Check.

flowchart LR
    subgraph STG["Staging environment"]
        S1["Identity: tester-1"] --> S2["Override: new screen on"]
    end
    subgraph PRD["Production environment"]
        P1["Identity: tester-1, a separate record"] --> P2["No override yet"]
    end
    S2 -. "does not travel" .-> P2
    
Figure 5: The same identifier in two environments is two records, and overrides never cross between them

The wrong-environment accident

The most common override mistake is a simple one: creating the override in the wrong environment. An engineer wants to help a Production customer but has Staging open. The override is saved perfectly, the customer sees nothing, and everyone is confused. The reverse is worse: an engineer experimenting in what he thinks is Staging changes a real customer’s experience in Production. The cure is habit. Always read the environment name before saving, and consider colouring or naming environments so that Production is unmistakable.

Analogy

Think of a bank with a practice branch used to train new clerks, next to the real branch. A clerk who writes a special instruction in the practice branch ledger has changed nothing for real customers. A clerk who mistakes the real ledger for the practice one can cause a real problem. Clear signs on the doors are the cheapest protection.

!
Warning

When you release a feature for real, retest it in Production with a real identity that has no overrides. A feature that works only for people with Staging overrides has not been verified.

Making environments hard to confuse

Teams reduce the wrong-environment accident with small, cheap habits. Name environments clearly and in capital letters for Production. Use different browser profiles, or different window colours, for Production and Staging administration. Require a second confirmation word before bulk changes in Production. And print the environment name at the top of every script output. None of these costs money, and each removes a class of errors that otherwise returns every few months.

It also helps to keep Production edits rare and deliberate, performed from a short written plan, while Staging edits can be casual. When the two feel different in daily work, people naturally slow down in the place that matters.

9The Life Cycle of an Override

A healthy override is born with a reason, lives for a short, known time, and dies on schedule. An unhealthy one is born in a hurry and lives for years.

stateDiagram-v2
    [*] --> Requested: Someone asks for an exception
    Requested --> Approved: Owner agrees and sets end date
    Approved --> Active: Override created and verified
    Active --> Reviewed: Scheduled review
    Reviewed --> Active: Still needed, new end date
    Reviewed --> Retired: No longer needed
    Active --> Promoted: Many people need it, becomes a segment
    Promoted --> Retired: Overrides deleted
    Retired --> [*]
    
Figure 6: An override should be requested, approved, active, reviewed, and then retired or promoted to a segment

The stages in plain words

  • Requested. A customer, tester, or colleague asks for an exception. A ticket records who, what, and why.
  • Approved. Someone with authority agrees and fixes an end date. Without an end date the override has no natural death.
  • Active. The override exists, was verified, and the people involved know it is there.
  • Reviewed. On a schedule, such as every month, someone reads the list of active overrides and asks if each is still needed.
  • Retired. The override is deleted and the person returns to normal rules.
  • Promoted. If many people need the same exception, it becomes a trait and a segment, and the personal overrides are deleted.

Why end dates are everything

Almost every override problem is an end-date problem. An override with an end date is a loan. An override without one is a gift that nobody remembers giving. Two years later, a new engineer asks why a customer behaves differently, and nobody knows. Writing an end date, even a rough one, turns an invisible exception into a visible promise.

Reason for the overrideTypical lifetimeWhat happens at the end
Bug workaround for one customerDays, until the fix shipsDelete the override after the fix
Beta access for a trusted customerWeeks, until general launchDelete when everyone gets the feature
Tester in ProductionAs long as the test lastsDelete after verification
Demo accountLong-lived, but reviewedDocument it as a permanent exception with an owner
Regulated customer exclusionUntil compliance approvesDelete after approval, or promote to a segment
Analogy

Think of a library lending a book to a student. Every loan has a return date stamped inside the cover. Without the stamp, books vanish into bags and bedrooms. The end date on an override is the return stamp inside the cover.

i
Tip

If your tools cannot store an end date on the override itself, keep a small shared register: identifier, feature, environment, reason, requester, created date, and review date. A simple table is far better than nothing.

Who owns the override?

Every override needs a human owner, a person who can answer “is this still needed?” The owner is usually the requester or the product manager responsible for the feature, not the engineer who clicked the button. Engineers change jobs, and a button-clicker is a poor long-term owner. When the owner leaves the company or changes teams, the register must show who takes over, or the override is retired. This one rule turns a pile of mysteries into a list of responsibilities.

The monthly review in practice

A review need not be long. Open the register and the list of overrides side by side. For each row, ask three questions: is the end date reached, is the owner still the owner, and would this be better as a segment? Delete the expired ones on the spot, with a before and after read. Move repeated cases into a plan to create a segment. Update the review date for the rest. Twenty minutes a month keeps the whole system tidy. Teams that skip the review for a year often spend a week untangling the result.

10Overrides and Traits: Two Separate Records

Traits and overrides live on the same identity page, which makes people think they are connected. They are not. Understanding this prevents a whole family of confusions.

Traits are facts, overrides are decisions

A trait is a fact about a person, sent by your application, such as plan equals premium. A segment reads traits and decides group membership. An override is a decision made by a human, saved in Flagsmith, which says what to give this person. Traits flow from your system to Flagsmith. Overrides flow from a human to the person’s answer.

Trait

A fact

Sent by your application. Describes the person. Read by segment rules. Example: country equals IN.

Override

A decision

Saved by a human or script. Describes the answer. Applied directly. Example: new screen is off.

What changes when traits change

When a trait changes, segment membership is worked out again, so the person’s answer from segments can change at once. But the override does not change. Suppose a customer has an override that disables a feature, and later their plan trait changes to premium, which would put them into an enabling segment. They still see the feature disabled, because the override outranks the segment. This is correct behaviour, but it surprises people who expected the plan upgrade to “fix” the situation.

EventEffect on segment answersEffect on override
A trait value is updatedMembership recalculated at onceNone
A trait is removedSegments that need it stop matchingNone
A segment rule is editedMembership changes for everyoneNone
The identifier changes in the applicationA new identity, no traits yetOverride stays with the old identity, new one has none
The override is deletedSegments take over againGone

Using traits to avoid overrides

If you find yourself creating overrides repeatedly for people who share a reason, the reason is a trait waiting to be named. A support agent might override twenty accounts for “customers affected by the March billing issue.” A trait named “billing_issue_march” set through the API on those accounts, and a segment that reads it, would give one visible group instead of twenty hidden exceptions, and a single place to switch the group off.

The visible identity page

The identity page shows both: traits at the top, and the list of features with the answer each gives and where the answer came from. Learn to read it like a report: for each feature, which layer won, and does that match what you expected? Most puzzling cases are solved by this one page.

Analogy

Think of a customer file at a shop. On one page are facts: address, birthday, favourite colour. On another page are decisions: “waive the delivery fee,” “send a call before delivery.” Changing the address does not cancel the decision to waive the fee. Facts and decisions live side by side but follow different rules.

!
Warning

Never store an exception by encoding it as a trait with a strange name, such as “special_access_bob,” and then matching it in a segment of one person. That is a hidden identity override disguised as a segment, and it carries the worst of both worlds: it is invisible and it adds clutter to the project.

11Overrides in Real Release Workflows

Overrides are not just a support trick. Skilled teams weave them into the way they launch, test, and protect features.

Workflow 1: the internal dark launch

A dark launch means deploying a feature to the live product but keeping it hidden. The code is in Production, the default is off, and a few named people see it through overrides. Product managers, designers, and testers explore the real thing on real infrastructure. When they are happy, the team moves to a segment such as “Employees,” then to a percentage rollout, and finally to everyone. Overrides are the first, smallest ring of this expanding circle.

Workflow 2: the design partner programme

Many companies work closely with a few customers who help shape new features. These design partners get early access and give feedback. Overrides are the quick way to include them. When the programme has five or ten partners, a trait and a segment become better, and the team converts the overrides at that point.

Workflow 3: the protected customer

Some customers cannot receive changes without notice: hospitals, banks, government offices. A policy might say “no new feature reaches these customers until their change board approves.” When a feature launches by percentage, a disabled override on each protected identity keeps them safe regardless of the dice. This works well for a handful of accounts. For dozens, a trait such as “change_freeze” and a segment is better, because the group will keep growing.

Workflow 4: the emergency exit for one customer

When a new feature harms one customer, the fastest relief is a disabled override for them. It buys engineers time without a rollback that would also take the feature from thousands of happy customers.

flowchart LR
    DARK["Ring 0: dark launch, a few overrides"] --> EMP["Ring 1: Employees segment"]
    EMP --> PART["Ring 2: Design partners segment"]
    PART --> PCT["Ring 3: Percentage rollout"]
    PCT --> ALL["Ring 4: Everyone, default on"]
    PROT["Protected customers: disabled overrides at every ring"] -.-> PCT
    HELP["Harmed customer: disabled override at any time"] -.-> ALL
    
Figure 7: Overrides serve the first ring and also act as guard rails at every later ring
WorkflowWho receives overridesDirectionMoves to a segment when
Dark launchProduct, design, testersEnableThe group of testers is stable
Design partnersA few customersEnableMore than about five partners
Protected customersRegulated accountsDisableThe protected list keeps growing
Emergency exitOne harmed customerDisableRarely, it ends with the fix
Demo accountSales demo identityEnableRarely, it stays a documented exception
Analogy

Think of a film release. First the director screens it privately for a few friends. Then the crew sees it. Then a small test audience. Then cinemas open widely. Meanwhile, a few special cinemas may be told not to screen it yet for contractual reasons. Overrides are the private screening list and the “do not screen” list.

i
Tip

Plan the exit from the first ring on day one. Write down in the launch plan when personal overrides will be deleted, because the moment the feature becomes default on, every “enable” override has become harmless noise.

Handing over from overrides to the next ring

The moment a feature graduates from the internal ring to a wider ring is the moment most overrides lose their purpose. Prepare the handover on paper. List the people who hold enabling overrides, and check that each of them will be covered by the next ring, for example the “Employees” segment. Only then switch the next ring on. If the person is covered, delete the override, because it is now redundant, and a redundant override is a future surprise. If the person is not covered, decide on purpose whether the exception should continue, and record the new reason and end date.

This tidy handover prevents a common confusion. Months later, someone removes the Employees segment from the feature, expecting staff to lose access, yet three staff still see it because of old personal overrides. The feature screen said one thing, and the people said another. A handover checklist closes that gap before it opens.

12Automation: Managing Overrides With Scripts and Code

Clicking works for one person. When you need to handle fifty beta customers or clean up hundreds of old exceptions, automation is safer and faster.

The Admin API

An API is a set of web addresses that programs use to ask a service to do things. Flagsmith’s Admin API lets a program read and change projects, environments, features, segments, identities, and overrides. To use it, a program presents a secret API token that proves it has permission. Because it can change live behaviour, the token must be guarded like a password.

What automation is good at

Task

Bulk creation

Read a list of beta customer identifiers from a spreadsheet and create the overrides in one reviewed run.

Task

Expiry clean-up

A scheduled job reads a register of overrides, finds those past their end date, and removes them, perhaps after asking an owner for confirmation.

Task

Audits

A weekly report lists every identity override in Production, sorted by age, and sends it to the feature owners.

Task

Environment checks

A job confirms that Production has no overrides left over from testing, and warns if it finds some.

Task

Support tools

An internal support page with a button “give this customer the old screen for a week,” which calls the API with a recorded reason.

Task

Conversion

When a group of overrides should become a segment, a script sets the trait on each identity and then removes their overrides.

Safe habits for scripts

1

Dry run first

Make the script print what it would change, without changing it. Read the list with a colleague.

2

Name the environment in the command

Require the environment as a clear input and refuse to run in Production without an explicit confirmation word.

3

Limit the blast radius

Process a small batch first, verify, and then continue with the rest.

4

Save a before-snapshot

Write the existing overrides to a file before changing them, so you can restore them if needed.

5

Keep the token safe

Store the API token in a secret manager, never in the script file or in a chat message, and give it only the permissions the job needs.

Infrastructure as code

Some teams describe their Flagsmith setup in files, using a tool such as Terraform, and apply the files automatically. The benefit is review: every change is a proposed edit that others can read before it goes live. The cost is speed: an emergency override for one customer should not wait for a code review. Many teams keep long-lived settings in code, and allow a small, audited, manual path for emergency exceptions, with a rule that emergency overrides are removed or captured in code within a few days.

Analogy

Think of a building manager who must update the access cards of two hundred employees. Walking to the door reader and editing each card by hand is slow and error-prone. A list-driven system does it in a minute, but a wrong list locks everyone out. So the manager tests the list on five cards first, keeps a copy of the old list, and keeps the master key safe. Scripts need the same careful manners.

!
Warning

A script that loops over every identity and deletes overrides, with a small bug in its filter, can wipe every exception in Production in seconds. Always filter by feature and environment explicitly, and print the count before you act.

Reports worth building

Once you can read overrides through the Admin API, a handful of small reports pay for themselves quickly. The first lists every identity override in Production with its age, so the oldest can be questioned. The second counts overrides per feature, so you can spot a feature that has outgrown personal exceptions. The third compares the live list with the register and prints any override that is missing from the register, which are the undocumented ones. The fourth lists every enabling override on a feature marked as paid, so a finance or product owner can confirm each one is intended. Each report is simple, and together they turn a hidden layer into a visible one.

Send these reports to the owners, not only to engineers. A product manager who receives a weekly list of the exceptions on her features will remove them faster than any reminder from the platform team.

13Governance: Who May Create Overrides and How to Track Them

A tool this sharp needs rules about who may hold it. Governance is the small set of habits that keeps personal exceptions honest.

Permissions

Flagsmith can limit who may view, edit, or approve changes in each project and environment. Depending on your plan, you can create roles or teams with different rights, such as “may read everything,” “may change Staging,” or “may change Production.” Good practice is to let many people read, fewer people edit Staging, and only a small group edit Production. Because an identity override in Production changes a real customer’s experience at once, the right to create it deserves a careful grant.

Approval and change requests

Some plans offer change requests, where a proposed change to a feature state must be reviewed and approved by another person before it takes effect. If your plan includes this, check whether it covers identity overrides or only the environment and segment levels, because this has varied between versions. If identity overrides are outside the approval flow, you need a substitute: a ticket with an approver’s name, and a second person reading the identity page after the change.

The audit log

The audit log is Flagsmith’s record of who changed what and when. It is your memory when someone asks, “who gave this customer that exception?” Make a habit of recording the ticket number in any note field that your version offers, so the audit entry points to the reason.

ControlQuestion it answersWeak versionStrong version
PermissionsWho is allowed to do this?Everyone is an administratorProduction editing limited to a small group
ApprovalDid a second person agree?NoneTicket with approver, or built-in change request
ReasonWhy does this exist?Nobody remembersTicket link, requester, and end date in a register
AuditWho did it and when?Never looked atLog reviewed after incidents and sent to alerts
ReviewIs it still needed?NeverMonthly review with removal of expired items

The register

A simple shared register, a table in a wiki or spreadsheet, makes governance real. Each row lists the identifier or a safe reference to it, the feature, the environment, the direction (enable or disable), the requester, the approver, the reason, the created date, and the review date. Anyone who wonders about an exception can read the register before bothering an engineer. Review it monthly, and remove rows as overrides are deleted.

DECISION 1Accepted
Context

Support and product managers create identity overrides in Production. Several old overrides were found that nobody could explain.

Decision

Every Production identity override requires a ticket with a reason, an approver, and an end date. A register is kept and reviewed monthly. Only members of the release group may create Production overrides.

Consequences

Emergency help is a few minutes slower, but overrides are explainable, short-lived, and removed on time. The audit log can be matched to tickets.

Analogy

Think of the master key of a hotel. It opens every door, so the hotel keeps a signed log of who took it, when, and why, and returns it to a locked box. Nobody thinks the log is rude. It is simply how powerful tools are handled without losing trust.

Separating duties

A useful governance idea is the separation of duties: the person who asks for an exception should not be the only person who approves and creates it. A product manager may request, a team lead may approve, and a release engineer may create. Even a small team can apply the idea by asking a colleague to read the ticket and the identity page before the override is saved. A second pair of eyes catches wrong environments, mistyped identifiers, and forgotten end dates, which are the three most common errors in this whole subject.

14Security and Privacy of Overrides

An override changes what a person can do and see. That makes it part of your security story, and the identifier it sits on makes it part of your privacy story.

The main risks

Risk

Overrides as hidden access

An override that enables a paid feature is a free upgrade. If created in error or abuse, a customer receives value they did not buy, and nobody notices.

Risk

Personal data in identifiers

Emails, phone numbers, or names used as identifiers spread through dashboards, logs, tickets, and exports.

Risk

Leaked tokens

An Admin API token in a script or chat can let an attacker create overrides, read identities, or change features.

Risk

Excess rights

Too many people holding edit rights in Production increases mistakes and the chance of insider misuse.

Risk

Trusting the client

Anything the browser or phone knows can be inspected by the user. A flag answer is a hint to the interface, not a lock on the data.

Risk

Stale data on deletion

When a person asks to be forgotten, their identity and overrides must be removed from every environment and every connected tool.

Flags are not locks

This point deserves its own heading. A feature flag decides what the application chooses to show. It does not by itself stop a determined user from calling the underlying service. If an override enables a paid report, the server that produces the report must also check that the customer is entitled to it, or that an authorised exception exists, using your own system of record. Think of the flag as the door sign and the server check as the lock.

Habits that reduce risk

  • Use opaque identifiers. A random internal number reveals nothing if it leaks.
  • Keep the secret key on servers. Browsers and apps use the public client key. Server keys and Admin API tokens never ship in code that users can download.
  • Grant the least access. Give edit rights to those who need them and no one else.
  • Review enabling overrides on paid features. They are the ones with money attached.
  • Rotate tokens. Replace API tokens on a schedule and whenever a person with access leaves.
  • Plan for deletion. Know how to remove one person from every environment, and from your register.
  • Mind the register. If it contains personal information, protect it like any customer file.
flowchart TB
    OVR["Override enables a sensitive feature"] --> UI["Application shows the feature"]
    UI --> CALL["User action calls your server"]
    CALL --> CHK{"Server checks entitlement in your own system"}
    CHK -- Entitled or approved exception --> OK["Request allowed"]
    CHK -- Not entitled --> NO["Request refused, feature hidden or denied"]
    
Figure 8: The flag shapes what the screen shows, and the server decides what is actually allowed
Analogy

Think of a cinema. The ticket sign says “Screen 3.” That sign guides people but does not stop anyone. The usher at the door checks the ticket. A flag is the sign. Your server is the usher.

!
Warning

This guide describes engineering practice, not legal advice. Rules on personal data differ by country and sector. Ask your privacy or legal team how long you may keep identifiers and registers.

Handling real customer data in test accounts

Diagnostic exceptions bring a special privacy risk. To reproduce a customer’s problem, support may copy that customer’s traits onto a test identity. If the traits contain personal data, the test identity now holds it, in an account that many staff can open. Copy only what the reproduction needs, such as plan, version, and country. Never copy names, emails, or free-text fields. Delete the test identity when the investigation ends, and record the deletion in the ticket. This habit keeps a helpful practice from becoming a quiet leak.

Insider misuse and mistakes

Most security failures with overrides are honest mistakes, not attacks. A well-meaning colleague enables a paid feature for a friendly customer without telling anyone. A tired engineer disables a safety feature for a complaining client. Strong governance protects against both: second-person review for enabling overrides on paid features, an announcement in a channel for every Production change, and a monthly look at the audit log. The goal is not to distrust people, but to make every exception visible so that mistakes are caught early and kindly.

15Testing Overrides

An override is a promise about what one person will see. Like every promise, it deserves a check before and after it is made.

What to test

  • The override itself. Does the person’s identity page show the override as the source of the answer?
  • The application effect. Does the real screen change when the answer changes?
  • The neighbours. Do other people with similar traits remain unaffected?
  • The removal. After deleting the override, does the person return to the right segment or default answer?
  • The identifier match. Does the application send exactly the identifier the override was created for?

A before-and-after checklist

1

Read before

Record what the person receives, and from which layer, before any change.

2

Make the change

Create or edit the override in the right environment.

3

Read after

Confirm the page shows the override and the new answer.

4

See it in the app

Open the application as that identity, or ask the person, after a refresh. Confirm the real behaviour.

5

Check a neighbour

Open another identity with the same plan and country and confirm it did not change.

6

Log it

Add the result to the ticket and the register.

Testing without hiding problems

Overrides make testing easy, and that is exactly the danger. A tester with an enabling override sees the feature working, but real customers depend on segments and percentages, which the tester never exercised. For release testing, create personas with the traits of real customer groups, and let them match segments. Use overrides only for the first, internal rehearsal, and for test accounts that need a fixed answer.

Test goalUse an override?Why
See the unfinished feature at allYesThe default is off, so a tester needs a personal answer
Check the segment rule for premium usersNoThe persona must match the rule through traits
Check the percentage rolloutNoOverrides would bypass the hash
Check what a harmed customer would see after disablingYesYou are testing the override itself
Confirm removal worksYes, then deleteThe return path must be proven
Analogy

Think of a driving test where the examiner lets the learner use a private road with no traffic. The learner drives perfectly. On the real road, with buses and bicycles, the learner struggles. A test that avoids the real conditions proves only that the road was empty.

i
Tip

End every release test with one step in Production: a real identity with no overrides, matching the target segment through traits only. If that person sees the feature, you have tested the real path.

16Monitoring and Debugging Overrides

When someone says “my screen is different,” you need a calm method. For overrides, the method starts and ends on the identity page.

A debugging routine

1

Confirm the environment

Which key does the application carry, Production or Staging? Many mysteries end here.

2

Find the identity by exact identifier

If it does not exist, the application never sent it, or sent a different one.

3

Read the feature row

Which layer produced the answer: override, segment, variation, or default?

4

Look at the traits

Check spelling, case, and type if a segment was expected to win.

5

Search the audit log

Find who created or changed the override and when.

6

Check the application

Did the application refresh its flags? Is it showing cached answers?

7

Fix at the cause

Remove the stale override, correct the segment, or fix the application, then add a note to the register.

What to measure

SignalWhy it mattersWarning sign
Number of identity overrides per environmentShows how much hidden exception existsSteady growth with no deletions
Overrides per featureFinds features that need a segmentMore than a handful on one feature
Age of the oldest overrideShows whether review worksOverrides older than a year with no owner
Overrides in Production not in the registerFinds undocumented exceptionsAny at all
Enabling overrides on paid featuresMoney riskUnexplained entries
Audit log entries for override changesDetects unusual activityEdits at odd hours or by unexpected people

Alerts that help

Connect Flagsmith’s webhooks or audit log, where your version supports it, to a shared channel, so that every Production override creation appears as a short message. This makes exceptions public inside the team. Public exceptions get explained, questioned, and removed. Quiet exceptions grow old.

Use case: the mystery of the missing banner

A customer complains that the new announcement banner never appears for their account, though colleagues in the same company see it. The engineer opens the customer’s identity page and reads the banner row. The source is an identity override that disables the banner, created fourteen months ago during a pilot for another feature. Nobody remembers it. The audit log shows the name of the colleague, who explains that the customer once asked not to see banners during an audit. The team decides the request has expired, deletes the override, records the incident, and adds the monthly review that would have caught it.

Analogy

Think of a mechanic who hears a strange noise. She checks the fuel, the battery, the oil, and the tyres, always in the same order, and writes down what she finds. The identity page is her checklist for feature questions.

Keeping a short incident note

Whenever an override causes surprise, write a short note of five lines: what the person saw, what the cause was, how long it had existed, how it was found, and what will prevent it next time. These notes cost five minutes and build a library of lessons. After a few months the notes show patterns, such as “most surprises come from overrides older than six months,” which tell you exactly where to improve your process.

17Performance, Caching, and Scale

A few overrides cost nothing. Thousands need thought. This chapter explains how they flow to your application and what changes at scale.

How the answer reaches the application

In the usual remote evaluation mode, the application asks Flagsmith’s servers for the flags of an identity, and Flagsmith works out the answer, including any override, and replies. The SDK then keeps the answer in memory. A new override does not appear in the application until the application asks again or its timer for refreshing expires. This delay explains many “I made the change and nothing happened” reports.

Local evaluation

With local evaluation, a back-end server downloads the rules and states of an environment and decides by itself, from memory, for every identity. Whether identity overrides are included in what it downloads has depended on version and settings, and very large numbers of overrides can make that download bigger. If you plan to use local evaluation and to keep many overrides, read the current documentation and test the behaviour with one example override before relying on it.

sequenceDiagram
    participant H as Human
    participant FS as Flagsmith
    participant SDK as Application SDK
    participant U as Customer screen
    H->>FS: Create override for customer-884
    Note over SDK: SDK still holds the old answer in memory
    SDK->>FS: Refresh flags for customer-884
    FS-->>SDK: New answer including the override
    SDK-->>U: Screen changes after refresh
    
Figure 9: The change appears only when the application next refreshes its flags

Practical advice

Tip

Know your refresh time

Tell support how long a change takes to appear: seconds, minutes, or at the next sign-in. Expectations prevent panic.

Tip

Offer a manual refresh

Ask the customer to sign out and in, or restart the application, to pick up a new answer at once.

Tip

Keep overrides few

Few overrides keep dashboards fast and data downloads small, and keep behaviour understandable.

Tip

Use safe defaults

If Flagsmith cannot be reached, the application should use built-in defaults, and not break.

AspectFew overridesThousands of overrides
Dashboard useEasy to read and searchHard to review without reports
Local evaluation downloadSmallMay become large
Understanding behaviourAnyone can explain itNobody can
Right toolIdentity overridesSegments built on traits
Analogy

Think of a shopkeeper who writes today’s prices on a small board by the till instead of phoning the supplier for each sale. The board is fast but may be out of date. When prices change at noon, the shopkeeper must walk to the board and rewrite it. A new override reaches customers when the board is rewritten, and not before.

i
Tip

Limits on identities, requests, and storage depend on your plan or on how you host Flagsmith. Treat any figure as something to confirm with Flagsmith documentation or your account contact.

Choosing the refresh rhythm

The rhythm at which an application asks for fresh flags is a design choice with a trade-off. A short rhythm, such as every few seconds, makes new overrides appear quickly but increases traffic and battery use. A long rhythm, such as once per session, is cheap but slow to show changes. Many applications ask at start-up, again after sign-in, and then on a timer of several minutes. For urgent protective overrides, such as disabling a harmful feature for one customer, support can ask the customer to restart the application, which forces a fresh request. Decide the rhythm once, write it in your runbook, and tell support the number, so that nobody wastes an hour wondering why a correct change has not yet appeared.

18Advantages, Disadvantages, and Trade-offs

Every strong tool has a price. Seeing both sides honestly helps you decide how much to use.

Advantages

  • Fast response to one person’s need.
  • No new trait, segment, or code change.
  • Most specific layer, so the outcome is certain.
  • Perfect for dark launches and design partners.
  • A quick safety valve for a harmed customer.
  • Easy to remove cleanly.

Disadvantages

  • Hidden from the feature view.
  • Does not scale to groups.
  • Easily forgotten, so it outlives its purpose.
  • Hides problems during testing.
  • Skews experiments if pinned identities are included.
  • Tied to an identifier that may change.

Key trade-offs

DecisionOption AOption BHow to choose
Tool for an exceptionIdentity override: quick, hiddenSegment: visible, reusable, needs traitsOverride for few, short, personal cases. Segment for groups and lasting reasons
Speed versus controlCreate at once in the dashboardCreate through ticket, approval, and codeFast path for emergencies with later review, controlled path for the rest
DirectionEnable overrides: give early accessDisable overrides: protect customersDisable overrides are safer by nature, enable overrides on paid features need review
Where to recordOnly in FlagsmithAlso in a registerAlways keep a register
LifetimeOpen-endedWith an end dateAlways an end date, except documented permanent accounts
DECISION 2Accepted
Context

Design partner customers need early access to new features, and the list changes with each programme.

Decision

Use identity overrides while there are five or fewer partners. Beyond that, introduce a trait named design_partner, set through the Admin API, and a segment that reads it. Delete the personal overrides when the segment goes live.

Consequences

Small programmes stay light. Larger ones become visible on the feature screen and are easy to extend, measure, and end.

Analogy

Think of a tailor who can make a custom suit or sell a ready-made one. Custom fits perfectly but costs time and does not scale. Ready-made suits many people in a standard size. A wise tailor knows when each is right, and does not make a custom suit for every customer.

Estimating the real cost of an override

An override looks free because it takes one minute to create. Its true cost is spread across time: the minute to create it, the minutes of every later person who wonders why a customer is different, the review time each month, the risk of a surprise, and the final minute to remove it. A single override costs very little in all. A hundred forgotten ones cost a great deal, because each adds a small piece of confusion to every investigation. When you decide between an override and a segment, count the whole life of the exception, and not only the first minute. A segment costs more to set up and less to live with, and for anything that will last, that is the better trade.

19Design Patterns and Anti-Patterns

Teams have faced these problems many times. Patterns are the habits that keep working. Anti-patterns are the traps that keep catching people.

Good patterns

Pattern

The override register

One shared table lists every override with its reason, owner, approver, and review date. Anyone can answer “why does this exist?” without asking an engineer.

Pattern

Expiry by design

Every override carries an end date at birth. A monthly job or meeting removes the expired ones.

Pattern

Promote to a segment

When the same exception repeats, create a trait and a segment, and delete the personal overrides.

Pattern

Named test accounts

A small set of clearly named internal identities, such as “qa-premium-01,” hold the overrides needed for testing, so real customers do not.

Pattern

Disable first for safety

When a customer is harmed, a disabling override is the quickest, safest relief, followed by a real fix.

Pattern

Announce in a channel

Every Production override creation sends a short message to a team channel, which keeps exceptions public.

Pattern

Server-side entitlement

The server checks entitlement independently, and the flag only shapes the interface.

Pattern

Before and after reads

Every change is bracketed by reading the identity page, and the result is recorded in the ticket.

Anti-patterns

Anti-patterns

  • Override sprawl. Hundreds of one-person exceptions nobody understands.
  • The immortal override. No end date, no owner, no review.
  • The disguised override. A segment of one person built from a strange trait.
  • Test by override. Testers who only see the feature through personal exceptions.
  • Email as identifier. Personal data spread through every tool.
  • The wrong-environment edit. Changing Production while believing it is Staging.
  • Free upgrades by accident. Enabling overrides on paid features without review.
  • Flag as lock. Relying on the interface alone to protect sensitive actions.

Better habits

  • Keep overrides rare, recorded, and reviewed.
  • Set an end date at creation.
  • Use a trait and a segment for groups.
  • Test through personas and segments.
  • Use opaque identifiers.
  • Read the environment name before saving.
  • Review all enabling overrides on paid features.
  • Verify permission on the server.
flowchart TB
    subgraph BAD["Anti-pattern: sprawl"]
        B1["Feature"] --> B2["Override for person 1"]
        B1 --> B3["Override for person 2"]
        B1 --> B4["Override for person 3"]
        B1 --> B5["Override for person 4"]
        B1 --> B6["Override for person 5 and more"]
    end
    subgraph GOOD["Pattern: promote to a segment"]
        G1["Feature"] --> G2["Segment: design partners"]
        G2 --> G3["Trait design_partner equals true"]
    end
    BAD --> GOOD
    
Figure 10: Many hidden personal exceptions become one visible group when promoted to a segment
Analogy

Think of a kitchen. A good kitchen has labelled jars, a written recipe, and one person who checks the stock. A bad kitchen has unlabelled jars, five kinds of salt, and notes from three years ago stuck on the fridge. Patterns are the labels. Anti-patterns are the old notes.

Spotting sprawl early

Sprawl does not arrive in one day. It arrives as one extra override each week, each of them reasonable on its own. Watch for three early signs. The count of overrides only goes up and never down. Several overrides on one feature share the same reason. Engineers say “I think that customer has an override” without being sure. Any one of these signs is enough to call a short clean-up. A clean-up in the first month is a quiet afternoon. A clean-up after two years is a project.

20Best Practices and Common Mistakes

If you remember only one chapter for daily work, make it this one. It gathers the habits that matter most.

Best practices

1

Prefer segments, use overrides for exceptions

Groups belong in segments. A personal override is for a person.

2

Write the reason and the end date first

Before clicking save, write both in the ticket or register.

3

Check the environment name every time

Read it aloud if you must. Production changes real lives.

4

Use opaque identifiers

Random internal numbers keep dashboards and registers safe.

5

Read before and after

The identity page tells you which layer won. Save the result.

6

Review monthly

Remove what is expired, promote what repeats, and confirm the rest still has an owner.

7

Limit who can change Production

A small group with audit and approval beats a large group with trust.

8

Keep servers in charge of permission

The flag chooses what to show. The server decides what is allowed.

Common mistakes

MistakeConsequenceFix
Creating the override in the wrong environmentNo effect, or an unwanted effect on real customersRead the environment name before saving, mark Production clearly
Typing the identifier by handOverride does not match, the person sees no changeCopy from the source system or search the dashboard
Forgetting to deleteOld exceptions keep winning for yearsEnd dates, register, monthly review
Expecting a plan upgrade to override an overridePerson still sees the old answerRemove the override, let segments decide
Using overrides for a groupHidden, unmanageable sprawlPromote to trait and segment
Skipping the application refreshChange seems not to workKnow the refresh time, ask for a sign-out and in
Testing only through overridesGroup rules untestedPersonas that match segments through traits
Enabling a paid feature by override with no reviewSilent revenue lossApproval and a periodic review of enabling overrides
Changing the identifier schemeAll overrides orphanedTreat as a migration, recreate overrides on new identifiers
Sharing the Admin API tokenAnyone can change live behaviourSecret manager, rotation, least rights
i
Tip

Add a five-line checklist to your override ticket template: Which environment? Which exact identifier? What reason? What end date? Who verifies? Five answers prevent most of the mistakes in the table above.

Questions for a design review

  • Why is this a personal override and not a segment?
  • Who owns it, and when does it end?
  • Does it enable something that costs money?
  • What does the person see after it ends?
  • How will we know it was removed?

A gentle adoption path for a new team

1

Week one: learn to read

Everyone practises opening an identity page and reading which layer produced each answer. No changes yet.

2

Week two: agree the ticket template

Reason, end date, environment, identifier, approver, and verification step.

3

Week three: build the register and the alert

A shared table and a channel notification for Production overrides.

4

Month two: clean the past

List every existing override, find owners, delete orphans, and promote repeating cases to segments.

5

Month three: make it routine

Hold the monthly review, track the count, and celebrate when the number goes down.

Most override failures are not technical failures. They are failures of memory, and a register, an end date, and a monthly review are the cure.

21Real-World and Industry Examples

The idea of giving one person a special answer is old. Large companies have done it for years, under many names. Here are the common patterns.

i
Tip

The company examples below describe publicly known practices in broad terms, written from general knowledge and not from searching for fresh sources. Internal details are private and change over time. Treat them as illustrations of ideas.

Large technology companies

Facebook

Employees first

Large social networks are widely known to release features to their own staff accounts before the public. Staff accounts are given early access by identity or group, which is the same idea as personal overrides and small segments.

Google

Trusted testers

Google has long run programmes in which named individuals receive early versions of products. Naming the person, and not a group, is what an identity override does.

Netflix

Test accounts

Streaming services keep internal accounts that can be pinned to specific experiences, so engineers and support can reproduce what a viewer sees without disturbing real experiments.

Amazon

Account-level exceptions

Global marketplaces handle special agreements with large sellers and partners, who may receive tools or limits that others do not. Exceptions are tied to an account.

Etsy and Flickr

Dark launches

These companies helped spread the practice of deploying hidden features and showing them first to chosen people. A personal exception is the smallest ring of that approach.

Banks and fintech

Change freezes

Financial firms commonly protect important clients from unannounced changes, while still rolling features out to others. A disabling exception for one client is a standard tool.

A famous warning: Knight Capital

In 2012, the trading firm Knight Capital lost a very large sum in under an hour after a deployment went wrong. Reports said that old code, controlled by a switch whose meaning had been reused for something new, was activated on one server that had not received the update. The lesson is about control and memory: old switches, forgotten exceptions, and reused names are dangerous. An override that nobody remembers is a small cousin of that old switch, waiting to surprise someone.

An invented story to tie it together

Leena runs the platform team at a company that sells online tutoring. She wants to launch a new whiteboard tool. She follows these steps.

1

Dark launch with three overrides

The tool is deployed with default off. Leena, a designer, and a tester each get an enabling override in Production, with an end date of two weeks.

2

Design partners

Four partner schools ask to try it. She creates four overrides, and sees that more are coming. She creates a trait “design_partner” and a segment, moves the four schools into it, and deletes the personal overrides.

3

A protected customer

A government school board has a change freeze. Leena creates a disabling override on its account before the percentage rollout begins. She records it in the register with the ticket number.

4

Percentage rollout

Ten percent, thirty percent, then everyone, while she watches errors by segment.

5

A harmed customer

On day nine, one large school reports a printing problem in the new tool. Leena adds a disabling override for that school and tells the engineers. The school is happy within minutes.

6

Clean-up

When the printing fix ships, she deletes the override. The tool becomes default on, so the three enabling overrides are deleted. The register shows only the permanent government school freeze, now with an owner and a review date.

Use case: the demo account that always shows the future

A software company’s sales team uses a demo identity in Production for customer presentations. The team wants it to show unreleased features, so the demo looks impressive. The platform team gives the demo identity enabling overrides for five upcoming features, and documents the identity as a permanent exception with an owner in sales. A rule is added: before each public launch, the matching override is deleted, and a monthly review checks that the demo account never shows a feature that is not yet safe to promise. The demo stays impressive, and the exception stays honest.

22Frequently Asked Questions

Short answers to the questions beginners ask most.

Q1

What exactly is an identity override?

It is a feature state attached to one identity, for one feature, in one environment. It tells Flagsmith to give that person a specific enabled position and value, ignoring segments and defaults for that feature.

Q2

Does an identity override beat a segment override?

Yes. The identity override is checked first. If it exists for that feature, segments are not consulted.

Q3

Can one override cover several features?

No. An override covers one feature. For several features, create several overrides.

Q4

Will an override created in Staging work in Production?

No. Identities and overrides belong to one environment. Create the override again in Production if you need it there.

Q5

Can I create an override for someone who has never used the product?

Generally yes, by creating the identity in advance through the dashboard or the Admin API. When the person first arrives with the same identifier, the override is waiting. Confirm the steps for your version.

Q6

I created an override but the person sees no change. Why?

Common causes are the wrong environment, an identifier that does not match exactly, the application holding an old answer until it refreshes, or the application not using the flag as expected. Read the identity page, then check the application.

Q7

What happens when I delete an override?

The person falls back to the next layer: a matching segment override if any, then a percentage or variation rule, then the environment default.

Q8

Do traits matter for an override?

No. An override applies to the identifier regardless of traits. Changing traits does not change or remove the override.

Q9

How many overrides are too many?

There is no magic number, but if one feature carries more than about five, ask whether a segment would serve better. Rising counts with no deletions are a warning sign.

Q10

Are overrides safe for paid features?

They can give free access, so review enabling overrides on paid features carefully. Also check entitlement on your server, because a flag is not a lock.

Q11

Do overrides work with local evaluation?

This has depended on version and settings. Test one example override in your setup and read the current documentation before relying on it.

Q12

What if the person changes their email or username?

If your identifier is an opaque internal number, nothing changes. If you used an email as the identifier, the person becomes a new identity and the override no longer applies. This is one more reason to use opaque identifiers.

Q13

How do I handle a deletion request from a customer?

Remove the identity, and with it its overrides, in every environment, update the register, and follow your legal team’s process. Plan this before the first request arrives.

Q14

Should testers use overrides?

For the first look at an unfinished feature, yes. For release testing, use personas that match segments through traits, because overrides bypass the rules real customers meet.

23Summary and Key Takeaways

We began with a principal who wrote a small note for one child and left the school rule alone. We end with a system that does the same for any product, safely.

An identity override is a feature state attached to one identity, for one feature, in one environment. It is the most specific layer in Flagsmith’s order of authority: it is checked first and beats segment overrides, percentage rules, variations, and defaults. It can set the enabled position, the value, or a chosen variation, and it applies only to the person it was made for.

Its strength is speed and certainty, and its weakness is invisibility. It does not appear on the feature screen, it does not scale to groups, and it is easily forgotten. For that reason, good teams keep overrides rare, give each a reason and an end date, record them in a register, announce them in a channel, review them every month, and promote repeated exceptions into traits and segments. They remember that environments are separate, that identifiers must match exactly, that new answers appear when the application refreshes, and that a flag is not a lock: the server must check permission itself.

Key Takeaways

  • An identity override gives one person, in one environment, a special answer for one feature, and it beats every other layer.
  • Use segments for groups and lasting reasons, and overrides only for short, personal, recorded exceptions.
  • Every override needs a reason, an owner, an approver, and an end date, kept in a register and reviewed monthly.
  • Overrides never cross environments, so check the environment name before saving and verify real behaviour in Production.
  • Test release rules through personas that match segments, since overrides bypass the rules real customers meet.
  • Use opaque identifiers, guard Admin API tokens, limit Production edit rights, and review enabling overrides on paid features.
  • Read the identity page before and after every change, and remember that the server, not the flag, decides what is allowed.
Make exceptions small, visible, and temporary, and they will stay a kindness instead of becoming a mystery.