Monitor every release

Detect performance degradation, alert responsible teams, and quickly turn off features at fault.

Release with less risk

Instantly detect degradation

Split identifies within 30 minutes exactly which features improve or harm user experience, even for subtle changes in metrics across many concurrent features. Split ingests error and exception metrics from popular tools like Sentry and ties these to the feature a user is exposed to, reducing the risk of performance degradations large and small.

Track user experience changes

Split’s Real User Monitoring (RUM) Agent tracks data such as page load time, time to DOM interactive, and time to interactive that are critical indicators of user experience. In addition, Split collects key properties like browser information and connection speed to give you a full picture of the user using your feature.

Confidently alert the right teams

Respond to performance degradations quickly with statistically confident alerts that come with a kill switch. Split matches user experience data with the features they are exposed to, so engineers know right away which portions of their release are performing poorly. Restoring services is as fast as a click of button.

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 derisk releases

With Feature Monitoring, our engineering team can deploy rapidly while ensuring that new functionality won’t negatively impact our core KPIs such as page load time and errors per user.

Photo of Seth Moore
Seth Moore
Lead Software Engineer, Vistaprint

Our team uses Split feature flags to deploy quickly and experiment with new ideas. Feature Monitoring gives us a safe way to release features to our global user base with less risk.

Photo of Björn Levidow
Björn Levidow
Sr. Director Product Management for Analytics, GoDaddy

Ready to get started?

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