Why Eppo
WHY EPPO
FEATURED CASE STUDY
Coinbase Saves Millions, Reduces Experiment Analysis Time by 40%, and Restores Trust in Experimentation with Eppo
Learn more
Metrics tell you how flags are performing across features, so you can predict the ROI
Run sophisticated experiments and find out what features will land best
Release to different regions, teams, or users to minimize risk
Turn off any feature with a single click without deploying new code
See exactly when changes occurred to understand performance
Work with a configurable evaluation flow across multiple services
Features are fast — in edge servers, in your own servers, and everywhere in between
Split flag configuration from evaluation data to scale intelligently
Built upon decades of knowledge about storing and accessing feature flags at scale
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"
)
{
"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"
}
}
}
}
Availability for all our systems
Of flag evaluations processed
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.”