React SDK
Client-side SDK for React web apps.
Overview
The React SDK exposes a singleton Flags client plus React hooks for subscribed reads.
Get started
Understand version compatibility
This package targets modern React apps and uses hook-based subscriptions.
Install the SDK
npm install react-featureflags-clientInitialize the client
import { useEffect } from "react";import Flags from "react-featureflags-client"; export default function AppBootstrap() { useEffect(() => { void Flags.configure({ apiKey: process.env.NEXT_PUBLIC_TRUFLAG_CLIENT_KEY!, user: { id: "anon-session", }, }); }, []); return <AppRoutes />;}Login the context
import Flags from "react-featureflags-client"; await Flags.login({ id: "user-123", attributes: { plan: "enterprise", country: "US", },});Access flag values
Always pass a meaningful fallback. It is used before SDK state is ready and when the key is missing.
import Flags, { useFlag, useFlagsReady } from "react-featureflags-client"; export function CheckoutGate() { const ready = useFlagsReady(); const enabled = useFlag("new-checkout-experience", false); if (!ready) return <LoadingSkeleton />; return enabled ? <CheckoutV2 /> : <CheckoutV1 />;} const checkoutVariant = Flags.getFlag("checkout-ui-variant", "control");Optional: subscribe to SDK state changes
In normal React usage, hooks are already stateful and subscribe automatically. Use this only for advanced imperative integrations.
import { useEffect } from "react";import Flags from "react-featureflags-client"; useEffect(() => { return Flags.subscribe(() => { // Optional imperative listener for non-hook integrations. });}, []);Hooks
useFlagsReady(): booleanuseFlag<T>(flagKey: string, fallback: T): TuseFlagPayload(flagKey: string): Record<string, unknown> | nullConfiguration options
Flags.configure({ apiKey: process.env.NEXT_PUBLIC_TRUFLAG_CLIENT_KEY!, user: { id: "user-123", attributes: { plan: "pro" } }, streamEnabled: true, pollingIntervalMs: 60_000, cacheTtlMs: 300_000, requestTimeoutMs: 6_000, logLevel: "warn", telemetryEnabled: true, telemetryBatchSize: 50, telemetryFlushIntervalMs: 10_000,});Full option details: SDK API reference.
Events
Flag reads emit exposures automatically. Use Flags.track() for custom events. Truflag automatically tracks Flag read events (i.e., getFlag or useFlag).
import Flags from "react-featureflags-client"; await Flags.track("checkout_completed", { source: "web", value: 1,});Flag keys in the React SDK
Use the exact flag key string from the dashboard in runtime reads and hooks.
Importing types
import type { ConfigureOptions, TrackOptions,} from "react-featureflags-client";Troubleshooting
Network error
Verify the public environment key, relay reachability, and request timeout settings.
CORS errors in local development
Confirm local app origin is allowed and the relay endpoint URL is correct for your environment.
Example app
import { useEffect } from "react";import Flags, { useFlag, useFlagsReady } from "react-featureflags-client"; function Checkout() { const ready = useFlagsReady(); const enabled = useFlag("new-checkout-experience", false); if (!ready) return <p>Loading...</p>; return <p>{enabled ? "New checkout" : "Legacy checkout"}</p>;} export default function App() { useEffect(() => { void Flags.configure({ apiKey: process.env.NEXT_PUBLIC_TRUFLAG_CLIENT_KEY!, user: { id: "user-123", attributes: { plan: "pro" } }, }); }, []); return <Checkout />;}