Ship smarter and faster with experimentation and feature flags

Improve your product quality and velocity with feature management. Drive measurable impact with product experimentation. Optimize the experience across any platform including websites, backend code, mobile and conversational apps.

Blue Apron validates products faster with Optimizely experimentation

The Blue Apron engineering team moved from a homegrown testing solution to Optimizely Full Stack and were able to increase their experiment velocity by 10x. With Optimizely's real-time results, they were able to get to experiment learings a few days instead of having to wait weeks for data science resources.

Reduce risk and drive impact with feature flags and experimentation

  • Release faster with less risk

    Innovate faster by validating new features with a percentage of your users or key segments before rolling out to everyone with powerful feature management.

  • Improve software performance

    Maximize the responsiveness of new APIs, microservices, and architecture designs by running A/B tests to validate performance and reliability.

  • Experiment in any application, on any device

    Test experiences that span websites, mobile devices, over-the-top apps, IoT, conversational interfaces, and other experiences.

  • Prove impact of software releases

    Real-time experiment results help you determine whether the features you are building are having a positive impact on your customers.

  • Ensure better continuous delivery

    Integrate feature flags into your development cycle for greater development velocity, safer code deployments, and increased developer productivity.

  • Remotely configure your application

    Update your application and experiments in real-time without a code deploy. Optimize your features by running experiments testing different feature configurations.

Faster, more confident software releases

  • Confidently launch features by gradually rolling them out
  • Build experimentation into your software development cycle
  • Quantify the impact of new features
We want to rapidly prune out the ideas that will lower conversion. If we put something out in production that doesn’t seem to be working, we want to get rid of it quickly.
EMILY DRESNER
EMILY DRESNER

CTO

Experiments that load in the blink of an eye

Optimizely has the most performant experimentation solution regardless of whether you are running client-side or server-side experiments. With Performance Edge, experiments load blazing fast by moving key experiment decisions from the browser to the Edge.* Server-side experiments are bucketed in memory with zero-latency. Scale experimentation without impacting performance.

* Performance Edge is in development and is subject to change. Optimizely makes no commitments regarding the future availability, release date, functionality or terms applicable to this feature.

An experimentation platform you can trust

Open platform

Open-source SDKs with pluggable components give you control over network activity and integrating with your own analytics pipeline.

Fast decision engine

Conduct experiments in performance-critical codepaths. Our SDKs bucket users in memory so experiments have no impact on latency.

Scalable architecture

Real-time event collection servers used by thousands of customers across the globe allow you to get experiment results immediately.

Read the Docs
                      
              import optimizely
              
              optimizely = optimizely.Optimizely(datafile)
              
              

# Activate an experiment

variation = optimizely.activate('my_experiment', 'user_123') if variation == 'variation_a':

# Execute code for variation A

elif variation == 'variation_b':

# Execute code for variation B

else:

# Execute default code

# Track an event

optimizely.track('purchase_completed', 'user_123')
                      
              import com.optimizely.ab.Optimizely;
              
              Optimizely optimizely = Optimizely.builder(datafile).build();
              
              

// Activate an experiment

Variation variation = optimizely.activate("my_experiment", "user_123"); if (variation != null) { if (variation.is("variation_a")) {

// Execute code for variation A

} else if (variation.is("variation_b")) {

// Execute code for variation B

} } else {

// Execute default code

}

// Track an event

optimizely.track("purchase_completed", "user_123");
                      
              import "optimizely"
              
              project = Optimizely::Project.new(datafile)
              
              

# Activate an experiment

variation = project.activate('my_experiment', 'user_123') if variation == 'variation_a'

# Execute code for variation A

elsif variation == 'variation_b'

# Execute code for variation B

else

# Execute default code

end

# Track an event

project.track('purchase_completed', 'user_123')
                      
              var optimizely = require('optimizely-server-sdk');
              
              var optimizely = optimizely.createInstance({ datafile: datafile });
              
              

// Activate an experiment

var variation = optimizely.activate('my_experiment', 'user_123'); if (variation === 'variation_a') {

// Execute code for variation A

} else if (variation === 'variation_b') {

// Execute code for variation B

} else {

// Execute default code

}

// Track an event

optimizely.track('purchase_completed', 'user_123');
                      
              use Optimizely\Optimizely;
              
              

// Initialize an Optimizely client

$optimizelyClient = new Optimizely($datafile);

// Activate an experiment

$variation = $optimizelyClient->activate('my_experiment', 'user_123'); if ($variation == 'variation_a') {

// Execute code for variation A

} elseif ($variation == 'variation_b') {

// Execute code for variation B

} else {

// Execute default code

}

// Track an event

$optimizelyClient->track('purchase_completed', 'user_123');
                      
              using OptimizelySDK;
              
              

// Initialize an Optimizely client

Optimizely OptimizelyClient = new Optimizely(datafile);

// Activate user in an experiment

var variation = OptimizelyClient.Activate("my_experiment", userId); if (variation != null) { if (variation == "control") {

// Execute code for variation A

} else if (variation == "treatment") {

// Execute code for variation B

} } else {

// Execute default code

}

// Track conversion event

OptimizelyClient.Track("my_conversion", userId);
                      
              var optimizely = require('optimizely-client-sdk');
              

// Initialize an Optimizely client

var optimizelyClientInstance = optimizely.createInstance({ datafile: datafile });

// Alternatively, if you don't use CommonJS or npm, you can install the minified snippet and use the globally exported varible as follows

var optimizelyClientInstance = window.optimizelyClient.createInstance({ datafile: datafile });

// Activate user in an experiment

var variation = optimizelyClientInstance.activate('my_experiment', userId); if (variation === 'control') {

// Execute code for variation A

} else if (variation === 'treatment') {

// Execute code for variation B

} else {

// Execute default code

}

// Track conversion event

optimizelyClientInstance.track('my_conversion', userId);
                      
              

// Initialize an Optimizely manager

OPTLYManager *optlyManager = [OPTLYManager init:^(OPTLYManagerBuilder * _Nullable builder) { builder.projectId = @"projectId"; }];

// Initialize an Optimizely client by asynchronously downloading the datafile

[optlyManager initializeWithCallback:^(NSError * _Nullable error, OPTLYClient * _Nullable client) {

// Activate user in a test

OPTLYVariation *variation = [client activate:@"my_experiment" userId:@"userId"]; if ([variation.variationKey isEqualToString:@"control"]) {

// Execute code for the control

} else if ([variation.variationKey isEqualToString:@"treatment"]) {

// Execute code for the treatment

} else {

// Execute default code

}

// Track conversion event

[client track:@"my_conversion" userId:@"userId"]; }];
                        
              

// Initialize an Optimizely manager

let optimizelyManager : OPTLYManager? = OPTLYManager.init {(builder) in builder!.projectId = "projectId" }

// Initialize an Optimizely client by asynchronously downloading the datafile

optimizelyManager?.initialize(callback: { [weak self] (error, optimizelyClient) in

// Activate user in a test

if let variation = optimizelyClient?.activate("my_experiment", userId: "userId") { if (variation.variationKey == "control") {

// Execute code for the control

} else if (variation.variationKey == "treatment") {

// Execute code for the treatment

} } else {

// execute default code

}

// Track conversion event

optimizelyClient?.track("my_conversion", userId: "userId") })
                          
              import com.optimizely.ab.Optimizely;
              
              Optimizely optimizely = Optimizely.builder(datafile).build();
              
              

// Activate an experiment

Variation variation = optimizely.activate("my_experiment", "user_123"); if (variation != null) { if (variation.is("variation_a")) {

// Execute code for variation A

} else if (variation.is("variation_b")) {

// Execute code for variation B

} } else {

// Execute default code

}

// Track an event

optimizely.track("purchase_completed", "user_123");