Feature flags
Turn features on for a share of people, hand out variants, and pin a flag for testers.
A feature flag turns a feature on or off, or changes a value, for the people using your app without a new release. Your developers add the flag to the app once; from then on you control it in Studio.
Feature flags are in early access. Ask us on Discord, or email support@voidhash.com on a paid plan, to turn them on for your team.
Create a flag
- Open A/B testing → Feature flags and click New feature flag.
- Enter the Slug your developers use, such as
new-checkout. It must be unique in the project, archived flags included. - Add a Description of what the flag controls.
- Choose the Type. It can't change later.
- Click Create flag. The flag appears in the list; click it to open its page.
| Type | Hands out |
|---|---|
| Boolean | On or off. |
| String | One of its text variants, such as red or blue. |
| Number | One of its number variants. |
| JSON | One of its JSON variants, such as a configuration object. |
String, number and JSON flags need at least one variant, each with a Value and, except for JSON, an optional Label. People are split evenly between variants.
A new flag is Disabled, with a rollout of 0%. Changes on a flag's page apply only when you click Save changes.
Turn a flag on
A flag's status, targeting, overrides and history on one page
- Set Status to Enabled.
- For a Boolean flag, click the rollout next to Allocation and set the Rollout: the share of people who get it, in 1% steps.
- Click Save changes.
Studio sets the rollout for Boolean flags only. For string, number and JSON flags, ask a developer to set it through the API or CLI (developer docs).
| Status | What people get |
|---|---|
| Enabled | The flag, for the people your settings below select. |
| Disabled | Off for everyone, overrides included. The settings are kept. |
| Archived | Nothing; apps fall back to their built-in default. Restore brings it back. |
Archive and restore from the flag's menu. An archived flag keeps its slug.
Who gets the flag
For each person, Voidhash checks these in order and stops at the first that applies:
- The flag is Disabled: off.
- The person has an override: the overridden value.
- The person is on the deny list: off.
- There's an allow list and the person isn't on it: off.
- Otherwise, the rollout decides: on for that share of people, off for the rest.
Voidhash stops at the first check that applies. Each person keeps the same answer, and variant, until you change the flag.
Each person keeps the same answer, and the same variant, until you change the flag. Raising the rollout only adds people; nobody who had the flag loses it. Someone who signs in may get a different answer than they had before signing in.
The same flag answers in every environment: production, sandbox and test.
Allow and deny lists
- In Targeting, click Add a targeting rule (Add targeting rule once the flag has one).
- Pick the List (Allow or Deny) and the Identity: Person ID, or App user ID for the ID your app signs people in with. Enter its Value.
- Click Add rule, then Save changes on the flag.
- The deny list keeps people from getting the flag.
- The allow list limits the flag to the people on it. They still go through the rollout, so a 0% rollout gives them nothing. To guarantee someone the flag, use an override.
There are no rules by country, app version or other details. To compare paywalls, run an A/B test.
Overrides
An override pins a flag for one person, such as a tester.
- In Overrides, click Add an override (Add override once the flag has one).
- Choose the Identity type and enter its Value.
- Switch Force enabled on or off, and add a Note (optional) saying why.
- Click Add override, then Save changes on the flag.
Overrides beat the deny list and the rollout, but not a disabled flag. You can also add and remove a person's overrides on their profile in People; see Find and help a person.
History
Version counts changes to a flag's slug, name, description, status, rollout and variants. The change history at the bottom of the flag's page lists the flag's creation, changes to its slug, name, description, status and rollout, and archiving and restoring, each with the user ID of whoever made it, or System, and when; Changes shows the details.
Variant, allow and deny list, and override changes don't show there. They're kept in the audit log. Only admins and the owner can read either; Members see "Could not load activity." See Members and roles.
If something's off
- Nobody gets the flag: check it's Enabled, the rollout is above 0%, and you clicked Save changes.
- A tester doesn't get it: add an override for them; the allow list alone still applies the rollout.
- A change hasn't reached the app, or the flag isn't updating: apps pick up a change the next time they read the flag, usually within about 5 minutes.
- Create flag does nothing: the slug is already used in the project, archived flags included, or you're a Member.
- Save changes says you're not allowed: Members can open flags but not change them; see Members and roles.
Next steps
Still stuck? Check Troubleshooting, ask us on Discord, or email support@voidhash.com on a paid plan.
Something wrong or missing on this page? Tell us by email or on Discord.