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

Node Python Ruby JavaScript PHP Objective-C Android Java Swift

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

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.
The Optimizely Full Stack SDK fits in perfectly with our continuous deployment microservice architecture. A/B tests are no longer an afterthought, but a part of the day-to-day life of our engineering teams. The SDK allows us to deliver fully formed, fully tested variations from our servers, with no heavyweight JavaScript requirements.
Photo of Sean Gustafson
Sean Gustafson, Product Manager, AutoScout24
Autoscout24 Logo

Let’s get started:

Developer Docs Try It Free