Get started
In this guide, you will create a feature flag in Flagship and evaluate it inside a Cloudflare Worker.
In this example, you will create a boolean flag called new-checkout that controls whether users see a new checkout experience.
- Log in to the Cloudflare dashboard ↗ and select your account.
- Go to Compute > Flagship.
- Select Create app. Give the app a name that matches your project or service (for example,
checkout-service). - Inside the app, select Create flag.
- Create a boolean flag with the key
new-checkout. Optionally, add targeting rules to control who sees the flag. - Turn on the flag and select Save.
Add the Flagship binding in your Wrangler configuration file so your Worker can evaluate flags through a binding.
{ "flagship": { "binding": "FLAGS", "app_id": "<APP_ID>", },}[flagship]binding = "FLAGS"app_id = "<APP_ID>"Replace <APP_ID> with the app ID shown in the Cloudflare dashboard ↗. The binding field sets the name you use to access Flagship in your Worker code. In this example, the binding is available as env.FLAGS.
After updating the Wrangler configuration, run npx wrangler types to generate TypeScript types for the binding.
Use the env.FLAGS binding to evaluate the flag. The binding provides type-safe methods that return the flag value and fall back to the default you provide if evaluation fails.
export default { async fetch(request, env) { const url = new URL(request.url); const userId = url.searchParams.get("userId") ?? "anonymous";
const showNewCheckout = await env.FLAGS.getBooleanValue( "new-checkout", false, { userId }, );
if (showNewCheckout) { return new Response("Welcome to the new checkout experience!"); }
return new Response("Standard checkout."); },};export default { async fetch(request: Request, env: Env): Promise<Response> { const url = new URL(request.url); const userId = url.searchParams.get("userId") ?? "anonymous";
const showNewCheckout = await env.FLAGS.getBooleanValue( "new-checkout", false, { userId }, );
if (showNewCheckout) { return new Response("Welcome to the new checkout experience!"); }
return new Response("Standard checkout."); },};The third argument to getBooleanValue is the evaluation context. Flagship uses the context attributes to match targeting rules. In this example, the userId attribute is passed so that percentage rollouts and user-specific targeting work correctly.
Deploy your Worker:
npx wrangler deployTest flag evaluation by sending a request:
curl "https://<YOUR_WORKER>.<YOUR_SUBDOMAIN>.workers.dev/?userId=user-42"Change the flag value or targeting rules in the dashboard and observe the updated response. Flag changes propagate globally within seconds.
If you prefer the OpenFeature ↗ standard interface, or if you are running outside of a Cloudflare Worker, you can use the @cloudflare/flagship ↗ SDK instead of the binding.
Install the SDK:
npm i @cloudflare/flagship @openfeature/server-sdk yarn add @cloudflare/flagship @openfeature/server-sdk pnpm add @cloudflare/flagship @openfeature/server-sdk bun add @cloudflare/flagship @openfeature/server-sdk Evaluate flags using the OpenFeature client:
Pass the Flagship binding directly to the provider. This avoids additional HTTP requests and is the recommended approach inside a Worker. Authentication is handled automatically through the binding.
import { OpenFeature } from "@openfeature/server-sdk";import { FlagshipServerProvider } from "@cloudflare/flagship";
export default { async fetch(request, env) { await OpenFeature.setProviderAndWait( new FlagshipServerProvider({ binding: env.FLAGS }), );
const client = OpenFeature.getClient();
const showNewCheckout = await client.getBooleanValue( "new-checkout", false, { targetingKey: "user-42" }, );
return new Response( showNewCheckout ? "New checkout!" : "Standard checkout.", ); },};import { OpenFeature } from "@openfeature/server-sdk";import { FlagshipServerProvider } from "@cloudflare/flagship";
export default { async fetch(request: Request, env: Env): Promise<Response> { await OpenFeature.setProviderAndWait( new FlagshipServerProvider({ binding: env.FLAGS }), );
const client = OpenFeature.getClient();
const showNewCheckout = await client.getBooleanValue( "new-checkout", false, { targetingKey: "user-42" }, );
return new Response( showNewCheckout ? "New checkout!" : "Standard checkout.", ); },};Use an app ID, account ID, and an API token when running outside of a Worker (for example, in Node.js). The provider makes HTTP requests to the Flagship evaluation endpoint. Generate an API token from your Cloudflare account with Flagship read permissions.
import { OpenFeature } from "@openfeature/server-sdk";import { FlagshipServerProvider } from "@cloudflare/flagship";
await OpenFeature.setProviderAndWait( new FlagshipServerProvider({ appId: "<APP_ID>", accountId: "<ACCOUNT_ID>", authToken: "<API_TOKEN>", }),);
const client = OpenFeature.getClient();
const showNewCheckout = await client.getBooleanValue("new-checkout", false, { targetingKey: "user-42",});import { OpenFeature } from "@openfeature/server-sdk";import { FlagshipServerProvider } from "@cloudflare/flagship";
await OpenFeature.setProviderAndWait( new FlagshipServerProvider({ appId: "<APP_ID>", accountId: "<ACCOUNT_ID>", authToken: "<API_TOKEN>", }),);
const client = OpenFeature.getClient();
const showNewCheckout = await client.getBooleanValue("new-checkout", false, { targetingKey: "user-42",});Refer to the SDK documentation for detailed setup instructions.
- Learn about targeting rules to serve different values based on user attributes.
- Explore the full binding API reference for all evaluation methods.
- Read about percentage rollouts for gradual feature releases.