Manage every feature

Feature flags separate code deployment from releases to enable continuous feature delivery at scale.

Build and deploy with confidence

Centrally manage feature flags

Deploy feature flags throughout your app with client, server, and mobile SDKs. Split provides your development team with centralized access controls and audit logs so you can enforce changes and ensure compliance.

Safely phase into production

A phased rollout plan provides a safety net when deploying new features. Gradually increase user exposure with Split’s granular targeting rules, and assess release status across the application stack. Split gives engineers peace of mind that just one click turns off problematic features.

Finely tune feature rollouts

Precisely control user experience with sophisticated segmentation rules. Target feature flags to users by location, account name, or any custom attribute known within your application, with the confidence that private customer data is never sent to Split.

How it works

Release faster with Split feature flags 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 release features faster

Every team – from product and engineering to design and support – leverages Split to confidently create a great experience for our users.

Photo of Eric Crane
Eric Crane
Product Manager, Envoy

What’s interesting is that we’re actually able to move faster with Split. In the past, there were a lot of questions like ‘if something goes wrong how will we roll it back?’ Now we just put it behind Split, and then we have the flexibility to make changes on-the-fly once it’s in production.

Photo of Dan DeMeyere
Dan DeMeyere
VP Engineering, thredUP

Split has transformed the way that we deliver software. Granular targeting of features to customers has made us more responsive, and data from Split gives us an audit trail in case any issues arise.

Photo of QuanticMind
QuanticMind

Ready to get started?

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