本手册带你从零走通一个 A/B 实验:先建流量层和指标,再建实验、接 SDK 上报数据,最后在数据页看懂指标与显著性。
一、平台入口
在 WeBFunny 顶部导航「A/B测试」下拉内,一共有四个菜单:
|
菜单 |
干什么 |
|
实验列表 |
创建/复制/编辑实验,状态机流转,发布入口,操作记录,示例代码 |
|
流量层管理 |
流量层与分组的增删改,定分流主体,看剩余流量 |
|
用户测试白名单 |
维护白名单,调试阶段指定用户命中 |
|
实验指标管理 |
建指标(转化率/漏斗/留存/人均值等),配分子事件 |
功能模块总览(四菜单)
二、一分钟看懂流程
建流量层(定分流主体) → 建指标(定分子点位) → (可选)建白名单
→ 建实验(选层/配分组参数/挂指标) → 调试中(白名单验证)
→ 上线(运行中,按流量比例分流) → (可选)发布计划(放量)
→ SDK 拉取 results + 上报实验点位/业务事件
→ 触发日聚合 → 数据页看指标 → 与落库核对
三、核心概念
3.1 分流主体与身份列
分流主体在创建流量层时选定、之后不可改,决定指标计算时分子分母按哪一列 join:
|
流量层「分流主体」 |
对应埋点身份列 |
|
用户 ID(userId) |
weUserId |
|
内置 ID(innerId) |
weCustomerKey |
|
设备 ID(deviceId) |
weDeviceId |
3.2 短编号 vs UUID 主键
配置表主键是 UUID(内部稳定),但对外(SDK、实验点位字段)用的是短编号:expCode(实验短编号,项目内自增数字)与 groupCode(分组短编号,实验内 1..N)。SDK 拉到的 experimentId/groupId 就是短编号。
3.3 状态机(九态)
调试中 → 准备中 → 运行中 →(发布)→ 已发布 → 已发布(暂停)/ 待发布(已回滚)→ 已结束;另有「运行中(暂停)」「上线失败」。「变更」下拉按状态动态展示:上线 / 暂停 / 继续运行 / 发布 / 下线 / 回滚 / 重发。
实验九态状态机
3.4 分流优先级
白名单 > 进组锁定 > 受众筛选 > 发布策略/哈希分流 > 默认值
- 进组锁定:已进组用户复用首次分组,发布放量/暂停不影响老用户;
- 受众筛选:attributes 未携带筛选所需属性时,该实验不返回;
- 调试中实验仅白名单用户命中。
四、完整操作步骤
步骤 1:创建流量层
- 进入「流量层管理」→ 新建流量层;
- 填名称,选「分流主体」(用户 ID / 内置 ID / 设备 ID),创建后不可改;
- 可建「流量层分组」,同层实验共享流量池,层内剩余流量是创建实验时流量占比的上限。
流量层管理
步骤 2:创建实验指标
- 进入「实验指标管理」→ 新建指标,选类型:转化率 / 漏斗 / 留存 / 人均值等;
- 配「分子」:选业务点位 + 统计方式(用户数 userCount / 总次数 totalCount / 求和 sum / 均值 avg);漏斗类按顺序配多步骤点位,留存类配回访事件 + 窗口期;
- (可选)配「分母」点位事件,不配则分母 = 实验点位去重用户数。
步骤 3:(可选)创建用户测试白名单
- 进入「用户测试白名单」→ 新建白名单,手动粘贴 ID(逗号/回车分隔,≤1000 个)或扫码录入;
- 该白名单后续在实验分组 / 发布计划里挂载。
步骤 4:创建实验
- 进入「实验列表」→ 新建实验;
- 选流量层(下拉内可「+添加」直接建层);
- 填实验名称、流量占比(区间 = 所选层剩余流量,实时校验整数 %);
- 配分组 + 参数:至少 1 个对照组 + 1 个实验组,每分组 ≥1 个参数(参数名即 SDK 取值 key);
- 挂指标(下拉内可「+创建指标」),选择上线方式(立即 / 指定时间)或「暂存」为草稿;
- 保存后进入「调试中」状态。
创建编程实验
实验列表
步骤 5:调试(白名单验证)
- 调试中实验只有白名单用户能命中;
- 在实验分组挂白名单 → 用白名单用户 ID 调 results 接口 → 应返回对应分组参数;
- 调试 OK 后点「上线」。
步骤 6:上线与发布
- 「上线」→ 运行中:按流量占比 + 分组比例做哈希分流;
- 「发布」(可选)→ 建发布计划(优胜组 + 放量比例 + 兜底组 + 周期)→ 已发布:按发布比例放量,老用户靠进组锁定保持分组稳定。
创建发布计划
五、SDK 对接与数据上报
5.1 拉取实验结果(results)
curl -X POST "http://{域名}/wfEvent/buryPointAbSplit/results" \
-H "Content-Type: text/plain" \
-d '{"distinctId":"user_001","distinctType":"weUserId","projectId":"event_xxx_m"}'
响应:results 数组返回该用户命中的全部实验及分组参数,experimentId/groupId 为短编号,params 为参数名→值。
SDK 对接页签(示例代码)
5.2 上报实验点位(分母数据源)
用户命中实验后,SDK 经埋点通道上报【全埋点】实验点位(AbTestPointId),需带 7 个 abtest* 字段(驼峰):
|
字段 |
取值来源 |
|
abtestExperimentId |
results[].experimentId(短编号,转字符串) |
|
abtestExperimentName |
results[].experimentName |
|
abtestGroupId |
results[].groupId(短编号,转字符串) |
|
abtestGroupName |
results[].groupName |
|
abtestParamName |
命中的参数名 |
|
abtestParamValue |
命中的参数值 |
|
abtestIsDebug |
'1' / '0' |
- 身份字段须与分流主体对应列一致(userId→weUserId),且与 results 请求的 distinctId 同值,否则分母 join 不上;
- 多环境项目(_m 后缀)必须带 weEnv(pro/sit/stag/dev)。
5.3 上报业务事件(分子数据源)
分子就是普通业务点位事件,无需任何 ABTest 字段,靠身份列与实验点位 join 计算指标。
六、指标怎么看、怎么算
6.1 分母与分子
- 分母(默认)= 当日实验点位去重用户数(按 expCode + groupCode 过滤、joinKey 去重);配了分母事件则取该事件值;
- 分子 = 当日进组用户中触发分子事件的值,统计方式决定取用户数 u / 总次数 e / 字段求和 v。
6.2 六类指标
|
类型 |
公式 |
说明 |
|
转化率 |
u ÷ d |
×100 加 % |
|
漏斗 |
u ÷ d |
u = 窗口期内按 1→2→…→n 顺序完成全部步骤的人数 |
|
留存 |
u ÷ d |
u = 第 D+窗口期 日回访人数(次日留存 = D+1) |
|
人均值 |
v ÷ d |
数值字段求和 ÷ 分母 |
|
人均事件均值 |
e ÷ d |
事件总次数 ÷ 分母 |
|
人均事件比值 |
按统计方式取列 ÷ d |
totalCount→e / sum·avg→v / userCount→u |
选多天区间时,每天 d/u/e/v 各自求和后再相除(按每日进组人数加权的加权平均)。
6.3 统计检验(实验组 vs 对照组)
- 差异相对值 =(实验组指标值 − 对照组指标值)÷ 对照组指标值 × 100%;
- p-value:比率类两比例 z 检验、人均类泊松近似,双侧检验;
- 置信区间:绝对差异 ± z*×SE,再换算成相对百分比;
- 显著性:p-value < α(α = 1 − 置信度)→ 显著;等价于置信区间含 0 ⇔ 不显著。
实验数据页 · 试验概述(提升摘要自动计算)
实验数据页 · 指标分析(指标值 / 差异 / p-value / 置信区间)
实验数据页 · 漏斗(分步转化 + 双分组对比)
七、常见问题
|
问题 |
说明 |
|
指标为什么是 0? |
缺【全埋点】实验点位上报,分母数据源缺失算不出指标 |
|
SDK 漏报实验点位会怎样? |
该用户分子分母一起丢失(纯 SDK 账,无对账兜底,可接受) |
|
受众筛选不生效? |
attributes 未携带筛选所需属性时该实验不返回(神策语义) |
|
参数在多个实验运行 |
该实验「发布」置灰,提示不支持发布 |
|
流量层删不掉 |
层内有运行类实验时删除置灰(调试中/已结束不阻塞) |
|
上报 weEnv 非法 |
非 dev/sit/stag/pro 的条丢弃并写 fail 表 |