Make your TV apps
even better

Experiments that fuel continuous improvement across the OTT experience

TV is changing fast. Lead the charge.

Insights to engage your customers

Customer actions are louder than words. Are you listening? Experiment with subscription flows, content discovery, ad placement and layouts to find out what they crave.

Optimize every channel

Every viewing medium is different. What works for mobile viewing won’t cut it for a home theater. That’s why Optimizely’s SDKs all work together so you can discover the best experience for each step of the customer journey.

Faster iteration. Less risk. Phased rollouts and instant updates

Phased rollouts and instant updates let you iterate quickly and launch fearlessly. Test new ideas and adjust on the fly with live variables and simple traffic allocation.

Target each experience

Deliver the right experience to the right audience with advanced targeting. And since Optimizely’s SDKs all work together, you can easily experiment and personalize across channels and devices with server-side experiments—and across your full tech stack.

Ship confidently. No surprises.

Flexible configuration options

Run experiments in any part of your app. Easily configure networking, logging, exception handling, integrations, and much more to meet your production needs.

Focus on performance

Experiment in real time with minimal performance impact. Our lightweight, open source SDKs make no network requests, and enable instant updates to your app—no App Store or Google Play Review required.

A trusted solution

Optimize your app on the world’s leading Experimentation Platform that is already delivering billions of experiences globally. Powered by Optimizely’s industry-leading Stats Engine.


// 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 an experiment

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 an experiment

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;

// Get an Optimizely client

OptimizelyClient optimizelyClient = optimizelyManager.getOptimizely();

// Activate user in an experiment

Variation variation = optimizelyClient.activate("my_experiment", "user_id"); if (variation != null) { if ("control")) {

// Execute code for variation A

} else if ("treatment")) {

// Execute code for variation B

} } else {

// Execute default code


// Track conversion event

optimizelyClient.track("my_conversion", user_id);

Experiment anywhere in your tech stack

Test pricing, search algorithms, and more. Optimizely Full Stack enables you to experiment beyond your mobile client and deep into your backend.

A complete solution for app experimentation, without the developer headaches

  • Open source SDKs

    Our tvOS, and Android TV SDKs are transparent, so you know exactly how they work.
  • Event tracking

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

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

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

    Define custom attributes for fine-grained targeting and segmentation.
  • Multichannel experimentation

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

    Run experiments that span both frontend and backend code, in conjunction with any of Optimizely’s SDKs.
  • Optimizely Stats Engine

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

    Make updates to your experiments and variables in real-time without waiting for your next App Store release.
  • Raw event export

    Easily download the complete event data from Optimizely.
  • 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.

Get started with our developer documentation

Native TV and mobile apps are a huge opportunity to engage our audience where they are and stay ahead of quickly changing viewing habits. With Optimizely, we can easily run experiments in our apps and ensure the product, marketing, and engineering teams are all working together to achieve a common goal—providing the best customer experience possible.
Courtney Sanchez

SVP Business Intelligence and Strategy

Start experimenting in your over-the-top app today