Experiment in any application

Optimizely X lets you quickly and reliably run experiments, learn, and launch new features anywhere in your technology stack.

Optimize experiences on any channel or device

Full Stack

Run experiments on algorithms, pricing, redesigns, new architectures, omnichannel marketing campaigns, and more.

Mobile

Run experiments and launch new features in your iOS or Android apps to improve engagement and retention.

OTT

Run experiments in your Apple TV or Android TV channels to drive more video engagement and expand your subscriber base.

An experimentation platform you can trust

Open platform

It’s your data, where you want it. Open-source SDKs with pluggable components give you control over network activity and integrating with your own analytics pipeline.

Fast decision engine

Our SDKs bucket users in memory so experiments have no impact on latency. Feel free to conduct experiments in performance-critical codepaths.

Scalable architecture

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

Works in the languages you do

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

Node

Python

Ruby

JavaScript

PHP

Objective-C

Android

Java

Swift

C#

Node Python Ruby JavaScript PHP Objective-C Android Java Swift C#

The power of experimentation without the hassle

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

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

#import <OptimizelySDKiOS/OptimizelySDKiOS.h>

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

// Asynchronously initialize the Optimizely client
[manager initializeWithCallback:^(NSError * _Nullable error, OPTLYClient * _Nullable client) {
  // Activate an experiment
  OPTLYVariation *variation = [client activate:@"my_experiment" userId:@"user_123"];

  if ([variation.variationKey isEqualToString:@"variation_a"]) {
    // Execute code for variation A
  }
  else if ([variation.variationKey isEqualToString:@"variation_b"]) {
    // Execute code for variation B
  }
  else {
    // Execute default code
  }

  // Track an event
  [client track:@"purchase_completed" userId:@"user_123"];
}];

import OptimizelySDKiOS

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

// Asynchronously initialize the Optimizely Client
manager?.initialize(callback: { [weak self] (error, client) in
  // Activate an experiment
  let variation = client?.activate("my_experiment", userId: "user_123")
  if (variation?.variationKey == "variation_a") {
	// Execute code for variation A
  }
  else if (variation?.variationKey == "variation_b") {
    // Execute code for variation B
  }
  else {
    // Execute default code
  }

  // Track an Event
  client?.track("purchase_completed", userId: "user_123")
})
import com.optimizely.ab.android.sdk.OptimizelyClient;

OptimizelyClient optimizelyClient = optimizelyManager.getOptimizely();

// Activate an experiment
Variation variation = optimizelyClient.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
optimizelyClient.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);

Traffic splitting

Split traffic to different code paths anywhere in your technology stack. No network requests needed means no impact on your app’s performance.

Event tracking

Monitor all the conversion metrics and KPIs you care about, with real-time results powered by Optimizely Stats Engine, integrated with the systems you already use.

Open-source SDKs

Install any of our SDKs and run your first experiment in 10 minutes. Get started now.
Full Stack has opened up new doors for our business. Any time we deploy something new in our product, we do it as a test to measure conversion and revenue impact, ensuring every change to the customer experience is a positive one.
Photo of Colin Gardiner
Colin Gardiner, VP of Product and Analytics, Tripping.com
Autoscout24 Logo
Read Case Study

Let’s get started:

Developer Docs Try It Free