Experiment at scale

Test out new ideas directly with users and rigorously measure their impact on your business goals.

Create customer impact

Rigorous statistical analysis

Split determines causal effects, not just correlation. You can be confident that every impact you measure is statistically significant, from one ‘north star’ metric to dozens of guardrail metrics. In addition, Split provides advanced capabilities that guard the trustworthiness of your results:

  • Maintaining user experience across all their devices
  • Applying treatments for anonymous vs. logged in users
  • Randomization applied independently to each feature

Metrics that matter

Analyze the impact of every feature on hundreds of business, product, and operational metrics in real time. Split offers a robust set of metric types, including sum, count, and average. Ingest data from any source to determine feature impact. Out-of-the-box product data integrations and easy measurement setup make it easy to start your first experiment the same day.

Experimentation at scale

Split serves billions of impressions, helping organizations of all sizes to rapidly turn ideas into products.

  • Automatically create an experiment for every feature flag in your code.
  • Perform statistical analysis across millions of data points.
  • Integrate with the collaboration, DevOps, and analytics tools you already use.
How it works

Release faster with Split in 4 easy steps

1. Feature Flag

Feature flags are if/else statements that define the code path of a feature. Split’s open source SDKs support many popular languages for desktop, mobile, and web applications.

SplitClient split = SplitFactoryBuilder.build("YOUR_API_KEY").client();

String treatment = split.getTreatment("USER_ID", "my-feature");

if (treatment.equals("on")) {
  // insert on code here
} else if (treatment.equals("off")) {
  // insert off code here
} else {
  // insert control code here
}
split := client.NewSplitFactory("YOUR_API_KEY").Client()

treatment := client.Treatment("USER_ID", "my-feature")

if treatment == "on" {
  // insert on code here
} else if treatment == "off" {
  // insert off code here
} else {
  // insert control code here
}
let split = SplitFactory(apiKey: YOUR_API_KEY, key: user_id).client()

let treatment = split.getTreatment("my-feature")

if treatment == "on" {
  // insert on code here
} else if treatment == "off" {
  // insert off code here
} else {
  // insert control code here
}
SplitClient split = SplitFactoryBuilder.build("YOUR_API_KEY").client();

String treatment = split.getTreatment("USER_ID", "my-feature");

if (treatment.equals("on")) {
  // insert on code here
} else if (treatment.equals("off")) {
  // insert off code here
} else {
  // insert control code here
}
const clientConfig = {
  core: {
    authorizationKey: "YOUR_API_KEY",
    key: "USER_ID"
  }
};

const split = splitio(clientConfig).client();

split.on(split.Event.SDK_READY, () => {
  const treatment = split.getTreatment("my-feature");
  
  if (treatment === "on") {
    // insert on code here
  } else if (treatment === "off") {
    // insert off code here
  } else {
    // insert control code here
  }
});
var factory = new SplitFactory("YOUR_API_KEY");
var split = factory.Client();

var treatment = split.GetTreatment("USER_ID", "my-feature");

if (treatment == "on") {
  // insert on code here
} else if (treatment == "off") {
  // insert off code here
} else {
  // insert control code here
}
const clientConfig = {
  core: {
    authorizationKey: "YOUR_API_KEY",
    key: "USER_ID"
  }
};

const split = splitio(clientConfig).client();

split.on(split.Event.SDK_READY, () => {
  const treatment = split.getTreatment("my-feature");
  
  if (treatment === "on") {
    // insert on code here
  } else if (treatment === "off") {
    // insert off code here
  } else {
    // insert control code here
  }
});
$split = \SplitIO\Sdk::factory('YOUR_API_KEY')->client();

$treatment = $split->getTreatment('USER_ID', 'my-feature');

if (treatment == 'on') {
  // insert on code here
} else if (treatment == 'off') {
  // insert off code here
} else {
  // insert control code here
}
from splitio import get_factory

split = get_factory('YOUR_API_KEY').client()
treatment = split.get_treatment('USER_ID', 'my-feature')

if treatment == "on": 
  # insert code here to show on treatment
elif treatment == "off":
  # insert code here to show off treatment
else:
  # insert your control treatment code here
split = SplitIoClient::SplitFactory.new("YOUR_API_KEY").client

treatment = split.get_treatment("USER_ID", "my-feature")

if treatment == "on"
  # insert on code here
elsif treatment == "off"
  # insert off code here
else treatment
  # insert control code here
end

2. Rollout

Determine which users receive new variations of features by defining detailed rollout plans as part of your Continuous Delivery process. Control the distribution to a subset of users, segment them by a specific attribute, or define a split based on a percentage of total customers.

3. Track Events

Perform live multivariate testing and get immediate feedback on your frontend and backend systems as your customers interact with new features.

// Events are tracked using the Split.track() method
// 
// The format is as follows:
//   split.track(CUSTOMER_ID, TRAFFIC_TYPE, EVENT_TYPE, VALUE)

// Example #1: Track page load time
split.track(USER_ID, "user", "page_load_time", 5.5346);

// Example #2: Track API response time
split.track(USER_ID, "user", "api_response_time", 1.7459);

// Example #3: Track database query time
split.track(USER_ID, "user", "db_query_time", 0.2434);

// Example #4: Track clicks or engagements
split.track(USER_ID, "user", "clicked_purchase_button");

// Example #5: Track support ticket count creations
split.track(USER_ID, "user", "created_support_ticket");

4. Measure Outcomes with Feature Experimentation

Measure the value delivered of each new feature by monitoring product and business metrics. Understand the broader impact of your feature on other projects and organizational KPIs to guard against unintended consequences and discover unexpected benefits.

Split helps teams make smarter decisions

Split’s full-stack experimentation platform has been built with engineering and product teams in mind. It’s robust architecture and rich feature set integrates into our internal platforms and helps power experimentation across our entire engineering organization.

Photo of Laura Schaffer
Laura Schaffer
Product Manager, Twilio

Split provided the platform and integrations we needed to run full stack experiments for key technical and customer experience questions.

Photo of Julian Ganguli
Julian Ganguli
Principal Data Analyst, Surfline

On any given day we have hundreds of thousands of people coming to the website. That’s a lot of impression data. We needed to be able to determine what variation of a feature customers were going to get or when an anonymous person becomes a customer and Split takes care of all of that for you. Every time you visit thredUP.com, you’re fetching Split treatments.

Photo of Dan DeMeyere
Dan DeMeyere
VP Engineering, thredUP

Ready to get started?

Start using Split for free today. No credit card required.