Build better products faster

Optimizely X Full Stack is A/B testing and feature management for product development teams.

Experiment in any application. Make every feature on your roadmap an opportunity to learn.

Deliver at every step of the customer journey

Experiment deep into your stack to create exceptional customer experiences on everything from search results and promos to recommendations and payment structures.

Reduce risk and fail faster

Prove the impact of new features, performance improvements, or backend changes before rolling out to everyone. Empower your product managers to control feature rollouts separately from code deployment.

Know what works

Stats Engine delivers statistically relevant results in real time so your team can make faster decisions. Let your whole team experiment and watch the best idea win every time—no matter who it comes from.

Make updates in real-time

Remotely update your application and experiments in real-time - bypassing complex and long release cycles.

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");

Build Better Products with Full Stack

Companies like BlueApron and Stubhub are using Optimizely Full Stack to build better products faster and with less risk. See how these product teams experiment throughout their product development process.

Free your analysts

With Optimizely's Stats Engine you get statistically valid, real-time results. So you can act rapidly when the data calls for it, and dig into your analytics pipeline when you need a more complete picture.

Works in the languages you do

Optimizely includes easy-to-use SDKs for most major platforms

The complete solution for server-side experimentation

  • Feature flags

    Easily enable, disable, hide, or roll out a product feature at runtime. Choose who gets access to new features.
  • Event tracking

    Monitor all the conversion metrics and KPIs you care about, in your app or any other service.
  • Instant updates

    Make updates to your experiments and features in real-time without a code deploy.
  • Custom configuration

    Easily swap out your own components for logging, error handling, event dispatching, integrations, and more.
  • Rollouts

    Reduce the risk of launching new features by rolling them out first to a small set of users, either random or targeted.
  • Multichannel experimentation

    Set your own user IDs to create consistent personalized experiences across all your customer channels.
  • Audiences

    Define custom attributes for fine-grained targeting and segmentation.
  • Raw event export

    Easily download the complete event data from Optimizely.
  • Whitelists

    Quickly QA experiments by forcing specific users into variations.
  • Optimizely Stats Engine

    See the impact of your experiments in real-time, with the world’s leading Experimentation Platform.
  • Traffic splitting

    Easily create randomized traffic switches anywhere in your app without affecting performance.
  • Enterprise-ready security

    Roles and permissions, 2-factor authentication, and single sign on.
  • Environments

    Manage experiments across development, staging, and production environments.
  • Account-level experimentation

    Ensure consistent experiences when experimenting on customer accounts; optionally split traffic based on account IDs instead of user IDs.
We can now get an early signal from the Optimizely Results Dashboard within a few days, whereas before it would have taken weeks or longer for someone on our analytics team to pull the data and understand what was going on.
John Cline

Engineering Lead

Start experimenting in your stack today