Skip to content

Permanent Flags

Some flags are meant to stay. A kill switch for a payment provider can serve the same value for a year and still be doing its job, and so can the ops toggle you reach for when load spikes or the flag that gates a paid feature. Traffic analysis reads all of them as finished rollouts. Without a marker they keep turning up in cleanup work.

Marking a flag permanent records that intent. Featureflip then leaves it out of everything that suggests removing a flag. What the flag serves stays exactly the same.

Permanent flags are available on every plan, Free included.

The Create Flag page has a This flag is permanent checkbox. Tick it for a flag you know will stay. A permanent flag can’t have an expiry date, so ticking the box clears the Expires on field.

Open the flag and click Mark permanent in its header. The header then shows a Permanent badge and the line “Permanent flag, never reported for cleanup”.

If the flag has an expiry date, Featureflip asks first. The dialog names the date it’s about to remove, and Remove date and mark permanent does both in one step. If the mark can’t go through, the date stays where it was.

You can’t mark an archived flag permanent. Restore it first.

The flags list has a lifecycle filter with the other list filters. Pick Permanent to see only the flags you’ve marked, or Temporary for everything else. Any lifecycle shows both. Combine Permanent with Stale or Dead to review long-lived flags that have stopped changing, which is a good check that each one still deserves its marker.

Click Make temporary next to the Permanent badge. This is always allowed, on an archived flag too. Staleness keeps being worked out for a permanent flag in the background, so once it’s temporary again any Stale or Dead badge it has earned shows up straight away. You can also give it an expiry date again.

Evaluation is untouched. The flag keeps the same rules, rollout percentages and targeting, and the SDKs see no difference.

How the flag is reported does change:

  • No staleness badges. The flags list, the flag header and each environment tab show Permanent where a Stale or Dead badge would otherwise sit.
  • Out of the cleanup queue. Filtering the flags list by Stale or Dead leaves permanent flags out, unless you also set the lifecycle filter to Permanent.
  • Kept out of cleanup email. The daily cleanup notice never names a permanent flag.
  • Skipped by the cleanup Action. A permanent flag is never a removal candidate, so the flag cleanup Action won’t open a pull request to delete its code.
  • Left out of AI cleanup tools. The MCP server’s find_stale_flags and list_removal_candidates skip it.

Marking and unmarking both appear in the audit log as their own actions, MarkedPermanent and MarkedTemporary, so you can filter for them.

A permanent flag can’t have an expiry date, because the two say opposite things about the flag’s future. Featureflip refuses the combination and leaves you to pick which one to keep:

  • Setting an expiry date on a permanent flag is refused. Make the flag temporary first.
  • Marking a dated flag permanent through the API or the MCP server is refused. Clear the date first with DELETE .../expiry, then mark the flag. The dashboard does both in one step after its confirmation dialog.

The refusal carries the code PERMANENT_FLAG_HAS_EXPIRY on the field you sent.

Permanence has its own endpoints, separate from the main flag update call, so tools that rewrite the whole flag can’t clear the marker by accident.

Mark a flag permanent when you create it:

POST /api/v1/orgs/{org}/projects/{project}/flags
{
"key": "payments-kill-switch",
"name": "Payments Kill Switch",
"type": "Boolean",
"isPermanent": true
}

Or mark an existing flag:

PUT /api/v1/orgs/{org}/projects/{project}/flags/{flag}/permanent

Make it temporary again with:

DELETE /api/v1/orgs/{org}/projects/{project}/flags/{flag}/permanent

Both calls need at least the Member role. To list only permanent flags, add permanent=true to the list call (GET .../flags?permanent=true), or permanent=false for temporary ones. See the API Reference for the full contract and Authentication for tokens.

The MCP server has a set_flag_permanent tool. Ask your agent to mark a flag permanent, or to make it temporary with permanent: false. create_flag takes an isPermanent option, so an agent adding a kill switch can mark it while it writes the code behind it.

Mark flags whose job is to exist: kill switches, operational toggles, entitlement and plan gates, and long-lived configuration. Leave release flags and experiments temporary, even ones that will run for months. Those are exactly the flags stale detection is there to catch, and an expiry date is the better way to say how long they should live.