Feature flags

Target, release, relax

Split separates code deploy from feature release to safely execute Continuous Delivery at scale. Maintain a single source of truth for feature flags across the application stack, establishing a framework for Agile teams to safely increase release velocity.

Build and deploy with confidence

Create a foundation for Continuous Delivery

Continuous integration of small code increments into the main software branch increases development speed. A faster feedback loop means engineers spend less time debugging and more time building features. Split feature flags safely hide engineering work-in-progress until ready to release.

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 feature release status across the application stack. Split gives engineers peace of mind that just one click turns off problematic features.

Monitor engineering KPIs

Split directly links new features with the engineering metrics that
reflect your customer’s experience. Monitor functionality and performance of every change to find issues before your users do.
Split tracks engineering metrics such as page load time, service
latency, and exception rates.

Centralize feature flag management

Engineers create, change, and rollout feature flags throughout the application. Tracking and cleanup can be a challenge over time. Split centralizes feature flag management and records the who/what/why of each flag. Access control means development teams don’t have to worry about someone making a change they shouldn’t, and audit logs ensure compliance.

Features

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. We support many popular languages out of the box, including support 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 what users receive the new feature variation by defining detailed rollout plans. 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

Get immediate feedback on your front 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 Experimentation

Measure the value delivered of each new feature by monitoring business, product, and operational metrics.

Split help 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?

Try Split for 14 days. No credit card required.