Feature flags without the tech debt
Roll out to 5% of users, then to everyone. When the flag is done, you get a pull request that deletes it.
Free for up to 3 people, no credit card. Paid plans are one flat price, with nothing metered.
Your rollout finished in June, and the flag is still in the code.
It guards a branch every customer already gets, and someone still reads it in review and tests it in CI. Featureflip notices when a flag stops making decisions and writes the pull request that deletes it, so the dashboard and the code agree again.
- One pull request per flag
- Each dead flag gets its own small, reviewable change. Merge the ones you agree with and close the rest.
- No LLM in the loop
- The rewrites are syntax-tree transforms. Run it twice on one commit and you get one diff.
- Runs in your CI, with your token
- The Action checks out your repository in your own workflow. Your source never leaves your runner.
- Permanent flags stay put
- Mark a kill switch or an entitlement gate as permanent and the Action never proposes removing it.
Works across twelve languages: TypeScript, TSX, JavaScript, Java, Go, Python, Kotlin, C#, PHP, Ruby, Dart, Swift, plus ERB and Blade templates.
How removal works How a flag is marked stale Permanent flags Is it safe to let into my repo?
One price per plan, whatever your traffic does.
Your bill is the plan you picked. A traffic spike leaves it where it was, and so do ten new services or a launch that lands better than you planned. Rollouts, targeting and all fourteen SDKs come with every plan, Free included.
- Monthly active users Not counted
- Service connections Not counted
- Flag evaluations Not counted
- Overage Not counted
Prices in USD, per organization.
Free
$0 / month
Free forever
- Up to 3 people
- 1 project
- 10 flags per project
- 2 environments per project
Free forever, and built to run in production
Start freeTeam
$49 / month
Billed monthly
- Up to 5 people
- 3 projects
- Unlimited flags
- 3 environments per project
Adds scheduled changes and flag cleanup emails and require 2FA for every member
Choose TeamPro
$99 / month
Billed monthly
- Up to 10 people
- 10 projects
- Unlimited flags
- 5 environments per project
Adds flag owners
Choose ProBusiness
$249 / month
Billed monthly
- Up to 25 people
- 25 projects
- Unlimited flags
- Unlimited environments
Adds SSO with your identity provider (OIDC) and maximum API token lifetime
Choose BusinessNeed more than 25 people, or a contract your procurement team will sign? Talk to us about Enterprise. Every plan side by side is on the pricing page.
Coming from LaunchDarkly? Put your own numbers through the LaunchDarkly cost calculator, or read the full comparison. Moving off Flagsmith or ConfigCat? See the guides to Flagsmith alternatives and ConfigCat alternatives.
If we go down, your flags keep working.
Server SDKs keep your flag configuration in memory and evaluate inside your own process, so a flag check never waits on us. If Featureflip becomes unreachable, the SDK carries on with the last configuration it received and reconnects on its own. When it does, it pulls a full snapshot, so changes made during the gap still arrive.
How the SDKs recover from an outageFeatureflip
Flag updates
Your service
SDK + config in memory
Evaluations served locally: 0
Fourteen SDKs, from Go to Swift.
Install the package for your stack and ask it for a value. Server SDKs evaluate inside your own process, so a flag check never makes a network call. Client SDKs stream changes to the browser and the phone as they happen.
npm install @featureflip/js
import { FeatureflipClient, createNodePlatform } from '@featureflip/js';
const client = FeatureflipClient.get(
{ sdkKey: process.env.FEATUREFLIP_SDK_KEY, baseUrl: 'https://eval.featureflip.io' },
createNodePlatform(),
);
await client.waitForInitialization();
const enabled = client.boolVariation('new-checkout', { user_id: user.id }, false);
npm install @featureflip/node
import { FeatureflipClient } from '@featureflip/node';
const client = FeatureflipClient.get({ sdkKey: process.env.FEATUREFLIP_SDK_KEY });
await client.waitForInitialization();
const enabled = client.boolVariation('new-checkout', { user_id: user.id }, false);
npm install @featureflip/edge
let flags: EdgeClient | undefined;
// inside fetch(request, env, ctx)
flags ??= createEdgeClient({ sdkKey: env.FEATUREFLIP_SERVER_KEY });
const snapshot = await flags.load(ctx);
const enabled = snapshot.boolVariation('new-checkout', { user_id: userId }, false);
pip install featureflip
from featureflip import FeatureflipClient
client = FeatureflipClient(sdk_key=os.environ["FEATUREFLIP_SDK_KEY"])
enabled = client.variation("new-checkout", {"user_id": user.id}, default=False)
go get github.com/canopy-labs/featureflip-go/v2
client, err := featureflip.Get(os.Getenv("FEATUREFLIP_SDK_KEY"))
if err != nil {
log.Fatal(err)
}
ctx := featureflip.EvaluationContext{UserID: user.ID}
enabled := client.BoolVariation("new-checkout", ctx, false)
implementation("io.featureflip:featureflip-java:2.13.0")
FeatureflipClient client = FeatureflipClient.get(sdkKey);
EvaluationContext context = EvaluationContext.builder(userId).build();
boolean enabled = client.boolVariation("new-checkout", context, false);
dotnet add package Featureflip.Client
var client = FeatureflipClient.Get(sdkKey);
var context = new EvaluationContext { UserId = user.Id };
bool enabled = client.BoolVariation("new-checkout", context, false);
gem install featureflip
client = Featureflip::Client.new(sdk_key: ENV["FEATUREFLIP_SDK_KEY"])
enabled = client.bool_variation("new-checkout", { user_id: user.id }, false)
composer require featureflip/featureflip-php
$client = FeatureflipClient::get($sdkKey, $config);
$enabled = $client->boolVariation('new-checkout', ['user_id' => $user->id], false);
.package(url: "https://github.com/canopy-labs/featureflip-swift", from: "3.4.0")
let config = FeatureflipConfig(clientKey: clientKey, context: ["user_id": user.id])
let client = FeatureflipClient(config: config)
await client.initialize()
let enabled = client.boolVariation("new-checkout", default: false)
featureflip: ^2.0.0
final config = FeatureflipConfig(clientKey: clientKey, context: {'user_id': user.id});
final client = FeatureflipClient.get(clientKey, config: config);
await client.initialize();
final enabled = client.boolVariation('new-checkout', defaultValue: false);
implementation("io.featureflip:featureflip-android:3.5.4")
val config = FeatureflipConfig(clientKey = clientKey, context = mapOf("user_id" to user.id))
val client = FeatureflipClient.get(config)
client.initialize()
val enabled = client.boolVariation("new-checkout", false)
npm install @featureflip/react @featureflip/browser
import { FeatureflipProvider, useFeatureFlag } from '@featureflip/react';
<FeatureflipProvider clientKey={clientKey} context={{ user_id: user.id }}>
<App />
</FeatureflipProvider>
// in any component below the provider
const enabled = useFeatureFlag('new-checkout', false);
npm install @featureflip/browser
const client = FeatureflipClient.get({ clientKey, context: { user_id: user.id } });
await client.initialize();
const enabled = client.boolVariation('new-checkout', false);
Prefer a vendor-neutral API? There are OpenFeature providers for Node.js, .NET, Python, Go, Java, PHP, Ruby, Android and Web (browser and React).
And everything else a flag platform should do.
All featuresRelease
- Percentage rollouts
- Ramp from 1% to everyone, with each user staying in the same group.
- Targeting rules and segments
- Serve a variation by plan, region, email domain or any attribute you pass.
- Variations and A/B splits
- Return strings, numbers or JSON, and split traffic between them.
- Scheduled changes
- Turn a flag on at launch time without someone awake to click it.
Operate
- Kill switches
- Turn a feature off in production in seconds, with no deploy.
- Prerequisites
- Only evaluate a flag when the flag it depends on is serving the right value.
- Owners and expiry dates
- Give a flag a person to answer for it and a date it should be gone by.
- Audit log
- Who changed what, and when, for every flag and environment.
Automate
- Management API
- Everything the dashboard does, over REST.
- Terraform provider
- Keep flags in the same reviewed repo as your infrastructure.
- MCP server
- Let your coding agent read and change flags through your API token.
- Webhooks
- A signed request to your pipeline or chat channel the moment a flag changes.
In practice: Progressive rolloutsKill switchesFeature entitlementsBeta cohortsMigrating to a new LLM All use cases
Frequently asked questions
- What are feature flags?
- Feature flags (also called feature toggles) let you turn functionality on or off in a running application without deploying new code. That decouples deploy from release: you can merge to production with a feature switched off, then turn it on for 1% of users, expand to everyone, serve a different variation to one cohort for an A/B test, or kill it the moment a metric moves the wrong way. No rebuild, and the change reaches your SDKs in seconds.
- Is Featureflip free to use?
- Yes. The Free plan is free forever for up to 3 people and includes 1 project, 10 flags, and 2 environments. Paid plans start at $49/month ($39/month billed annually) for teams that need more projects, members, and advanced features.
- What programming languages are supported?
- Featureflip provides official server-side SDKs for JavaScript/TypeScript, Node.js, Cloudflare Workers, Python, C#, Java, Go, PHP, and Ruby, plus client-side SDKs for React, Browser, Swift, Flutter, and Android. You can also integrate directly with the Evaluation API using any HTTP client.
- How is Featureflip different from other feature flag platforms?
- Featureflip closes the loop on a flag. Once a flag is finished, a GitHub Action opens one reviewable pull request per dead flag, removes the code path in twelve languages plus ERB and Blade templates with no LLM involved, and archives the flag when you merge. The price is flat per plan and nothing is metered, so there is no charge for active users, service connections, evaluation volume, or overage. Percentage rollouts, targeting, kill switches, and all 14 SDKs are included at every tier, including the Free plan, which is meant to run in production rather than expire after a trial.
- Can I manage feature flags through an API?
- Yes. The Management API exposes everything the dashboard does over REST: create and toggle flags, manage environments, targeting rules, segments, and SDK keys. It is included on every plan, changes stream to your SDKs live, and every API change is recorded in the audit log. Webhook subscriptions live in the same API, so your deploy pipeline or chat channel can get a signed request the moment a flag changes.
- What happens to my app if Featureflip goes down?
- It keeps serving flags. Server SDKs hold your flag configuration in memory and evaluate it inside your own process, so a flag check never waits on a call to us. If Featureflip becomes unreachable, the SDK carries on evaluating against the last configuration it received, and any flag it cannot resolve returns the default you passed at the call site. It also reconnects on its own, retrying with capped exponential backoff and dropping to polling when a stream will not hold. Every reconnect pulls a full configuration snapshot, so a flag you changed during the gap gets picked up without anyone restarting a process.
Ship your first flag today.
The Free plan runs in production for as long as you like. There is no trial clock.