Feature Flagging

High performance feature flags for every use case

High-performance, low-latency feature flagging to handle everything from simple feature gates to gradual rollouts and full-blown experiments.

How Eppo's feature flags are faster and more resilient

Our "dumb server, smart client" approach means there's no real-time reliance on the Eppo API - offering several advantages over other feature flagging tools

See Docs
  • 1

    Changes in the Eppo UI publish updated flag configuration (evaluation rules) to CDN.
    Configuration files are static, easily cachable on the edge

  • 2

    SDK only talks to CDN which is extremely fast, robust, and available

  • 3

    Assignments computed with context available at time of evaluation, no need to have all targeting information ready beforehand

  • 4

    Assignments assigned synchronously using the configuration--no new network requests needed

Every language you need, one lightweight architecture

import * as EppoSdk from "@Eppo/js-client-sdk";

const variation = EppoSdk.getInstance().getStringAssignment(
  "my-feature-flag",
  user.id,
  { country: user.country },
  "flag-default-value"
);
import * as EppoSdk from "@Eppo/node-server-sdk";

const variation = EppoSdk.getInstance().getStringAssignment(
  "my-feature-flag",
  user.id,
  { country: user.country },
  "flag-default-value"
);
import eppo_client

variation = eppo_client.get_instance().get_boolean_assignment(
    'my-feature-flag', 
    user.id, 
    { 'country': user.country }, 
    'flag-default-value'
)
import com.eppo.sdk.EppoClient;
import cloud.eppo.api.Attributes;

String variation = EppoClient.getInstance().getStringAssignment(
    "my-feature-flag",
    user.getId(),
    new Attributes(Collections.singletonMap("country", user.getCountry())),
    "flag-default-value"
);
using Eppo.Sdk;

var variation = EppoClient.GetInstance().GetStringAssignment(
  "my-feature-flag", 
  user.Id, 
  new Dictionary<string, string> { { "country", user.Country } }, 
  "flag-default-value"
);
use Eppo\Client\EppoClient;

$variation = EppoClient::getInstance()->getStringAssignment(
  'my-feature-flag', 
  $user->id, 
  ['country' => $user->country], 
  'flag-default-value'
);
import "github.com/Eppo-exp/golang-sdk/v6/eppoclient"

var eppoClient = &eppoclient.EppoClient{}

variation, err := eppoClient.GetStringAssignment(
  "my-feature-flag", 
  user.Id, 
  map[string]string{"country": user.Country}, 
  "flag-default-value"
)
use eppo::ClientConfig;

let mut client = ClientConfig::from_api_key("api-key").to_client();

let variation = client.get_string_assignment(
        "my-feature-flag",
        &user.id,
        &[("country", &user.country)].into_iter().collect(),
        "flag-default-value",
    )
    .unwrap_or("flag-default-value".to_string());
require 'eppo_client'

variation = EppoClient::Client.instance.get_string_assignment(
  'my-feature-flag',
  user.id,
  { country: user.country },
  'flag-default-value'
)
import * as EppoSdk from "@Eppo/react-native-sdk";

const variation = EppoSDK.getInstance().getStringAssignment(
  'my-feature-flag',
  user.id,
  { country: user.country },
  'flag-default-value'
);
import EppoSDK

let variation = EppoClient.shared().getStringAssignment(
    experimentKey: "my-feature-flag",
    subjectId: user.id,
    subjectAttributes: ["country": user.country],
    defaultValue: "flag-default-value"
)
import cloud.eppo.android.EppoClient
import cloud.eppo.ufc.dto.SubjectAttributes

val variation = EppoClient.getInstance().getStringAssignment(
    experimentKey = "my-feature-flag",
    subjectId = user.id,
    subjectAttributes = SubjectAttributes(mapOf("country" to user.country)),
    defaultValue = "flag-default-value"
)
  • Feature gates & switches

    Direct users to different experiences or quickly remove problematic code

  • Experiments

    Randomize users between multiple test variants to measure impact

  • Controlled Rollouts

    Reduce risk by slowly exposing traffic to new features

  • Global Holdouts

    Automatically exclude small amount of customers to measure business impact

  • Mutual Exclusion Layers

    Easily isolate experiments to avoid unwanted interaction effects

  • Contextual Bandit

    Build dynamic, personalized experiences to optimize outcomes

Reliable. Scalable. Resilient.

  • 99.99%

    Uptime for feature flagging config API

  • Billions

    Daily assignments

Adaptable deployment you can trust

  • 1
    Multiple levels of redundancy

    Multiple levels of redundancy with Eppo application, CDN, and local cache are designed to be resilient in case there is an issue to ensure a seamless experience on your side.

  • 2
    Highly composable

    Eppo has first-class support for all common deployment modes and development workflows, and we can flex to support your unique setups and requirements.

  • 3
    Private, no PII concerns

    PII data never leaves your system, so rest assured that Eppo complies with the highest level of data security.

Customers love us

Filip Stenbeck

Engineering Manager

“We spent almost two months meeting suppliers, testing open source tools, and setting up small- to medium-sized proof of concepts. We ended up with a shortlist of seven suppliers and after the evaluation we chose Eppo. We could not be happier with that choice. Thanks to Eppo, we were up and running fast and now Eppo is playing a very important role in our work with scaling the experimentation program.”

Not ready to talk just yet?

Take a tour and see the platform for yourself.

Get a demo