更快地构建更好的产品

优化完整堆栈是产品团队的强大A / B测试和功能标志。

用您的方式工作

完整堆栈为大多数主要平台具有SDK,或者作为微服务部署

在任何应用中进行实验。在路线图上制作每个功能的机会学习。

在客户旅程中的每一步都提供

在您的堆栈中进行实验,为从搜索结果和PROMOS到建议和支付结构的所有客户提供卓越的客户体验。

降低风险并更快地失败

在向每个人推出之前,证明新功能,性能改进或后端改变的影响。授权您的产品经理将功能转展栏与代码部署分开控制。

视觉第2部分

知道什么工作

Stats引擎实时地提供统计相关结果,因此您的团队可以做出更快的决策。让你的整个团队实验,并每次看最好的想法胜利 - 无论它来自谁。

fullstack sec3 2

实时进行更新

远程更新您的应用程序和实验,实时绕过复杂和长释放周期。

平台页面完整堆栈UI

为工程师建造的实验平台

开放平台

具有可插拔组件的开源SDK可为您提供网络活动,并与您自己的分析管道集成。

快速决策引擎

在性能关键核心区进行实验。我们的SDKS桶用户在内存中,因此实验对延迟没有影响。

可扩展的架构

全球数千个客户使用的实时事件收集服务器允许您立即获得实验结果。

阅读文档
                      
              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");

用全堆叠构建更好的产品

像蓝色围裙和StubHub这样的公司正在使用优化的完整堆栈,以更快地构建更好的产品,风险更少。了解这些产品团队如何在整个产品开发过程中进行实验。

为您的开发过程带来快速原型设计

通过使用优化的Web以及优化的完整堆栈来验证新的想法,以运行彩绘的门测试,构建原型或运行针对不同设计的重定向测试。

服务器端实验的完整解决方案

  • 特色标志

    在运行时轻松启用,禁用,隐藏或滚出产品功能。选择谁获取新功能。

  • 即时更新

    实时对实验和变量进行更新,而不等待您的下一个App Store版本。

  • 分阶段推出

    通过首先将它们滚动到一小组用户,无论是随机的还是有针对性的,降低推出新功能的风险。

  • 观众

    定义自定义属性以获取细粒度目标和分割。

  • 允许列表

    通过将特定用户迫使特定用户变为变体来快速QA实验。

  • 交通分裂

    轻松创建应用程序中的随机流量交换机,而不会影响性能。

  • 环境

    管理跨开发,分期和生产环境的实验。

  • 事件跟踪

    在您的应用程序或任何其他服务中监控您关心的所有转换度量和KPI。

  • 自定义配置

    轻松交换您自己的组件,以进行日志记录,错误处理,事件调度,集成等。

  • 多通道实验

    设置您自己的用户ID,以在所有客户频道上创建一致的个性化体验。

  • 原始事件出口

    轻松从优化下载完整的事件数据。

  • 优化统计引擎

    通过世界领先的实验平台,查看实验的影响。

  • 企业就绪安全性

    角色和权限,2因素身份验证和单点登录(SSO)。

  • 账户级实验

    确保在实验客户账户时的一致体验;可选地根据帐户ID而不是用户ID拆分流量。

我们现在可以在几天内从优化结果仪表板上获得早期信号,而在我们的分析团队中的某人将需要几周或更长时间以提取数据并理解正在发生的事情。
约翰坎丁

工程铅

立即开始尝试堆栈