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.
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.
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.
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.
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.
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.
The support investigation
Support wants to reproduce a customer’s problem by giving a test identity the same settings the customer has.
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.
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.
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.
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"]
Four words you must know
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.
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.
Identity
The record of one user, device, or account, recognised by a unique identifier that your application sends. Identities live inside one environment.
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.
| Term | Scope | Plain meaning |
|---|---|---|
| Feature | Whole project | The named switch or setting |
| Environment default state | One environment | The answer everyone gets unless something more specific applies |
| Segment | Whole project | A saved group defined by trait rules |
| Segment override | One environment | A special answer for everyone who matches a segment |
| Identity | One environment | One recognised user, device, or account |
| Identity override | One environment | A special answer for exactly one identity |
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.
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"]
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.
| Situation | Default | Segment says | Override says | Person receives |
|---|---|---|---|---|
| No special rules | Off | No match | None | Off, from the default |
| In an enabling segment | Off | On | None | On, from the segment |
| In an enabling segment, with personal off | Off | On | Off | Off, from the override |
| Not in segment, with personal on | Off | No match | On | On, from the override |
| Default on, personal off | On | No match | Off | Off, from the override |
| Different values | Value 5 | Value 10 | Value 20 | Value 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.
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.
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
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.
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.
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
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.
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.
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.
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.
Find or add the identity
Search with the exact identifier. If the person has never used the product, create the identity first.
Read the current answer
Before changing anything, read what the person receives now and why, from default, segment, or an existing override.
Create the override
Pick the feature, choose enabled or disabled, set the value if needed, and save.
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.
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.
| Method | Best for | Main risk |
|---|---|---|
| Dashboard | One-off exceptions, support cases | Mistakes in the wrong environment, no record of reasons |
| Admin API with a script | Bulk creation, beta lists, clean-up jobs | A bug in the script can change many identities at once |
| Infrastructure as code | Long-lived, reviewed, repeatable settings | Slower to change in an emergency |
| Application code through the SDK | Setting traits that segments read, not overrides | Confusing 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.
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.
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.”
Enabled only
The classic on or off exception. Example: new design is disabled for one important client.
Value only
Keep the position, change the setting. Example: this beta customer gets a page size of twenty instead of ten.
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.
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.
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.
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
| Aspect | Environment default | Segment override | Identity override |
|---|---|---|---|
| Who it affects | Everybody not covered by something more specific | Everyone matching the segment rules | Exactly one identity |
| Where it is defined | The feature in an environment | The feature in an environment, linked to a segment | The identity page in an environment |
| Needs traits | No | Yes, rules read traits | No |
| Needs application change | No | Only if the needed traits are not sent yet | No |
| Scales to many people | Yes | Yes | No |
| Priority | Lowest | Middle, ordered by priority | Highest |
| Visibility | High, on the feature | High, on the feature | Low, hidden on individual pages |
| Best for | The normal behaviour | Groups with a shared reason | True 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"]
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.
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.
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
| Item | Shared across the project | Separate per environment |
|---|---|---|
| Feature definition | Yes | No |
| Segment definition | Yes | No |
| Default feature state | No | Yes |
| Segment override on a feature | No | Yes |
| Identity | No | Yes |
| Traits | No | Yes |
| Identity override | No | Yes |
| Environment key | No | Yes |
Three consequences
Staging overrides never leak into Production
A tester’s personal exception in Staging is invisible to real customers. You can experiment freely.
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.
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
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.
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.
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 --> [*]
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 override | Typical lifetime | What happens at the end |
|---|---|---|
| Bug workaround for one customer | Days, until the fix ships | Delete the override after the fix |
| Beta access for a trusted customer | Weeks, until general launch | Delete when everyone gets the feature |
| Tester in Production | As long as the test lasts | Delete after verification |
| Demo account | Long-lived, but reviewed | Document it as a permanent exception with an owner |
| Regulated customer exclusion | Until compliance approves | Delete after approval, or promote to a segment |
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.
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.
A fact
Sent by your application. Describes the person. Read by segment rules. Example: country equals IN.
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.
| Event | Effect on segment answers | Effect on override |
|---|---|---|
| A trait value is updated | Membership recalculated at once | None |
| A trait is removed | Segments that need it stop matching | None |
| A segment rule is edited | Membership changes for everyone | None |
| The identifier changes in the application | A new identity, no traits yet | Override stays with the old identity, new one has none |
| The override is deleted | Segments take over again | Gone |
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.
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.
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
| Workflow | Who receives overrides | Direction | Moves to a segment when |
|---|---|---|---|
| Dark launch | Product, design, testers | Enable | The group of testers is stable |
| Design partners | A few customers | Enable | More than about five partners |
| Protected customers | Regulated accounts | Disable | The protected list keeps growing |
| Emergency exit | One harmed customer | Disable | Rarely, it ends with the fix |
| Demo account | Sales demo identity | Enable | Rarely, it stays a documented exception |
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.
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
Bulk creation
Read a list of beta customer identifiers from a spreadsheet and create the overrides in one reviewed run.
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.
Audits
A weekly report lists every identity override in Production, sorted by age, and sends it to the feature owners.
Environment checks
A job confirms that Production has no overrides left over from testing, and warns if it finds some.
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.
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
Dry run first
Make the script print what it would change, without changing it. Read the list with a colleague.
Name the environment in the command
Require the environment as a clear input and refuse to run in Production without an explicit confirmation word.
Limit the blast radius
Process a small batch first, verify, and then continue with the rest.
Save a before-snapshot
Write the existing overrides to a file before changing them, so you can restore them if needed.
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.
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.
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.
| Control | Question it answers | Weak version | Strong version |
|---|---|---|---|
| Permissions | Who is allowed to do this? | Everyone is an administrator | Production editing limited to a small group |
| Approval | Did a second person agree? | None | Ticket with approver, or built-in change request |
| Reason | Why does this exist? | Nobody remembers | Ticket link, requester, and end date in a register |
| Audit | Who did it and when? | Never looked at | Log reviewed after incidents and sent to alerts |
| Review | Is it still needed? | Never | Monthly 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.
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.
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
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.
Personal data in identifiers
Emails, phone numbers, or names used as identifiers spread through dashboards, logs, tickets, and exports.
Leaked tokens
An Admin API token in a script or chat can let an attacker create overrides, read identities, or change features.
Excess rights
Too many people holding edit rights in Production increases mistakes and the chance of insider misuse.
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.
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"]
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.
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
Read before
Record what the person receives, and from which layer, before any change.
Make the change
Create or edit the override in the right environment.
Read after
Confirm the page shows the override and the new answer.
See it in the app
Open the application as that identity, or ask the person, after a refresh. Confirm the real behaviour.
Check a neighbour
Open another identity with the same plan and country and confirm it did not change.
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 goal | Use an override? | Why |
|---|---|---|
| See the unfinished feature at all | Yes | The default is off, so a tester needs a personal answer |
| Check the segment rule for premium users | No | The persona must match the rule through traits |
| Check the percentage rollout | No | Overrides would bypass the hash |
| Check what a harmed customer would see after disabling | Yes | You are testing the override itself |
| Confirm removal works | Yes, then delete | The return path must be proven |
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.
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
Confirm the environment
Which key does the application carry, Production or Staging? Many mysteries end here.
Find the identity by exact identifier
If it does not exist, the application never sent it, or sent a different one.
Read the feature row
Which layer produced the answer: override, segment, variation, or default?
Look at the traits
Check spelling, case, and type if a segment was expected to win.
Search the audit log
Find who created or changed the override and when.
Check the application
Did the application refresh its flags? Is it showing cached answers?
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
| Signal | Why it matters | Warning sign |
|---|---|---|
| Number of identity overrides per environment | Shows how much hidden exception exists | Steady growth with no deletions |
| Overrides per feature | Finds features that need a segment | More than a handful on one feature |
| Age of the oldest override | Shows whether review works | Overrides older than a year with no owner |
| Overrides in Production not in the register | Finds undocumented exceptions | Any at all |
| Enabling overrides on paid features | Money risk | Unexplained entries |
| Audit log entries for override changes | Detects unusual activity | Edits 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.
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
Practical advice
Know your refresh time
Tell support how long a change takes to appear: seconds, minutes, or at the next sign-in. Expectations prevent panic.
Offer a manual refresh
Ask the customer to sign out and in, or restart the application, to pick up a new answer at once.
Keep overrides few
Few overrides keep dashboards fast and data downloads small, and keep behaviour understandable.
Use safe defaults
If Flagsmith cannot be reached, the application should use built-in defaults, and not break.
| Aspect | Few overrides | Thousands of overrides |
|---|---|---|
| Dashboard use | Easy to read and search | Hard to review without reports |
| Local evaluation download | Small | May become large |
| Understanding behaviour | Anyone can explain it | Nobody can |
| Right tool | Identity overrides | Segments built on traits |
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.
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
| Decision | Option A | Option B | How to choose |
|---|---|---|---|
| Tool for an exception | Identity override: quick, hidden | Segment: visible, reusable, needs traits | Override for few, short, personal cases. Segment for groups and lasting reasons |
| Speed versus control | Create at once in the dashboard | Create through ticket, approval, and code | Fast path for emergencies with later review, controlled path for the rest |
| Direction | Enable overrides: give early access | Disable overrides: protect customers | Disable overrides are safer by nature, enable overrides on paid features need review |
| Where to record | Only in Flagsmith | Also in a register | Always keep a register |
| Lifetime | Open-ended | With an end date | Always an end date, except documented permanent accounts |
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.
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
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.
Expiry by design
Every override carries an end date at birth. A monthly job or meeting removes the expired ones.
Promote to a segment
When the same exception repeats, create a trait and a segment, and delete the personal overrides.
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.
Disable first for safety
When a customer is harmed, a disabling override is the quickest, safest relief, followed by a real fix.
Announce in a channel
Every Production override creation sends a short message to a team channel, which keeps exceptions public.
Server-side entitlement
The server checks entitlement independently, and the flag only shapes the interface.
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
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
Prefer segments, use overrides for exceptions
Groups belong in segments. A personal override is for a person.
Write the reason and the end date first
Before clicking save, write both in the ticket or register.
Check the environment name every time
Read it aloud if you must. Production changes real lives.
Use opaque identifiers
Random internal numbers keep dashboards and registers safe.
Read before and after
The identity page tells you which layer won. Save the result.
Review monthly
Remove what is expired, promote what repeats, and confirm the rest still has an owner.
Limit who can change Production
A small group with audit and approval beats a large group with trust.
Keep servers in charge of permission
The flag chooses what to show. The server decides what is allowed.
Common mistakes
| Mistake | Consequence | Fix |
|---|---|---|
| Creating the override in the wrong environment | No effect, or an unwanted effect on real customers | Read the environment name before saving, mark Production clearly |
| Typing the identifier by hand | Override does not match, the person sees no change | Copy from the source system or search the dashboard |
| Forgetting to delete | Old exceptions keep winning for years | End dates, register, monthly review |
| Expecting a plan upgrade to override an override | Person still sees the old answer | Remove the override, let segments decide |
| Using overrides for a group | Hidden, unmanageable sprawl | Promote to trait and segment |
| Skipping the application refresh | Change seems not to work | Know the refresh time, ask for a sign-out and in |
| Testing only through overrides | Group rules untested | Personas that match segments through traits |
| Enabling a paid feature by override with no review | Silent revenue loss | Approval and a periodic review of enabling overrides |
| Changing the identifier scheme | All overrides orphaned | Treat as a migration, recreate overrides on new identifiers |
| Sharing the Admin API token | Anyone can change live behaviour | Secret manager, rotation, least rights |
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
Week one: learn to read
Everyone practises opening an identity page and reading which layer produced each answer. No changes yet.
Week two: agree the ticket template
Reason, end date, environment, identifier, approver, and verification step.
Week three: build the register and the alert
A shared table and a channel notification for Production overrides.
Month two: clean the past
List every existing override, find owners, delete orphans, and promote repeating cases to segments.
Month three: make it routine
Hold the monthly review, track the count, and celebrate when the number goes down.
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.
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
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.
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.
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.
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.
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.
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.
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.
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.
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.
Percentage rollout
Ten percent, thirty percent, then everyone, while she watches errors by segment.
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.
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.
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.
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.
Can one override cover several features?
No. An override covers one feature. For several features, create several overrides.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.