High performance feature flags for every use case

Fast, reliable feature flags, plus feature targeting, A/B testing, release insights, and more, all in one product.
4.8/5

Request a demo

Start Now

Thanks, please book a time with our team!

Go to Home PageGo to Home Page
Join the innovative companies using Eppo
ClickUpDraftKingsGojekGold BellyMiroDescript

Key benefits for
your development workflow

  • Proven gains & validation

    Metrics tell you how flags are performing across features, so you can predict the ROI

  • Experiments

    Run sophisticated experiments and find out what features will land best

  • Controlled Rollouts

    Release to different regions, teams, or users to minimize risk

  • Instant Shutdowns

    Turn off any feature with a single click without deploying new code

  • Perfect Evaluation Graphs

    See exactly when changes occurred to understand performance

  • Consistent Density

    Work with a configurable evaluation flow across multiple services

How Eppo's feature flags are faster and more resilient

  • 1

    Features are fast — in edge servers, in your own servers, and everywhere in between

  • 2

    Split flag configuration from evaluation data to scale intelligently

  • 3

    Built upon decades of knowledge about storing and accessing feature flags at scale

Explore features

Every language you need, one lightweight architecture

Use Eppo with any programming language or framework in your technology stack.
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"
)

Easy to debug

Find out why flags were evaluated the way they were with detailed logs and debugging tools.
{
    "enabled": true,
    "evaluation": {
        "variationId": "var_123abc",
        "reason": "part_of_experiment",
        "details": {
            "experimentId": "exp_456def",
            "assignment": "treatment",
            "attributes": {
                "userId": "user_789ghi",
                "country": "US",
                "browser": "Chrome",
                "device": "mobile"
            }
        }
    }
}

Reliable. Scalable. Resilient.

  • 99.99%

    Availability for all our systems

  • Billions

    Of flag evaluations processed

Adaptable deployment you can trust

Multiple levels of redundancy

Multiple levels of redundancy with fast evaluation
CDN, in-memory caching, and automatic failover
Reliably evaluate flags even without backend connection

Highly composable

Adaptable to any tech stack that your team might use
Choose the modules and components you need
We help adapt it for your business and user experience

Private, no PII concerns

Only share what's needed to evaluate
PII data stays on your end
Keep strategies on your server to keep it tight and well-audited

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.”

Ready to use
high-performance
feature flags?

Let's talk