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
Changes in the Eppo UI publish updated flag configuration (evaluation rules) to CDN.
Configuration files are static, easily cachable on the edge
SDK only talks to CDN which is extremely fast, robust, and available
Assignments computed with context available at time of evaluation, no need to have all targeting information ready beforehand
Assignments assigned synchronously using the configuration--no new network requests needed
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"
)
Direct users to different experiences or quickly remove problematic code
Randomize users between multiple test variants to measure impact
Reduce risk by slowly exposing traffic to new features
Automatically exclude small amount of customers to measure business impact
Easily isolate experiments to avoid unwanted interaction effects
Build dynamic, personalized experiences to optimize outcomes
One interface for requesting assignment, regardless of what is being evaluated.
Uptime for feature flagging config API
Daily assignments
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.
Eppo has first-class support for all common deployment modes and development workflows, and we can flex to support your unique setups and requirements.
PII data never leaves your system, so rest assured that Eppo complies with the highest level of data security.
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.”