我们有一款使用 Cocos Creator 3.8.4 开发的微信小游戏,目前接入了 ThinkingData(TD)进行数据分析,SDK 版本为 3.6.1。
最近在对比微信公众平台和 TD 看板的数据时,发现 TD 统计的新增用户数、活跃用户数始终比微信后台少。
因为目前项目用户量不算大,所以不排除绝对差值不大、换算成比例后显得比较高。不过制作人反馈,他之前公司的一些项目,第三方数据平台与微信后台的误差可以控制在 1% 左右,因此怀疑我们这里可能存在初始化时机、埋点方式或者统计口径的问题。
数据差异示例
之前某一天的数据如下:
- 微信新增用户:581
- TD 新增用户:550
- 新增用户差异约:5.3%
- 微信活跃用户:739
- TD 活跃用户:686
- 活跃用户差异约:7.2%
最近几天观察下来,部分日期的误差会接近 10%。
当前 TD 初始化方式
我们已经将 TD 初始化放在第一个 Load 场景组件的 onLoad() 中,并且是 onLoad() 里最先执行的业务逻辑之一:
onLoad() {
super.onLoad();
// 微信端进入 Load 场景后立即初始化 TD
// 不等待隐私、广告、后台配置或其他异步请求
this.initThinkingDataEarly();
// 后续才执行其他加载逻辑
}
目前微信端没有等待隐私授权,TD 初始化也不依赖登录、广告 SDK、后台配置等异步流程。
TD 初始化完成后,会由 SDK 自动上报 ta_mg_show 。理论上,这已经是我们在 Cocos 业务代码层面能够做到的比较早的初始化时机。
当前看板统计方式
目前大致按以下方式统计:
- 活跃用户:当天触发事件的去重用户数,主要参考 SDK 自动上报的
ta_mg_show - 新增用户:触发事件且
is_new_user=true的去重用户数 - 时区统一使用东八区
- 游戏名称、渠道均进行了相同筛选
我们也尝试过使用“任意事件的触发用户数”,数据变化只有个位数,没有明显缩小与微信后台的差距。
我们目前的猜测
我们怀疑微信后台和 TD 的用户统计起点可能不同。
例如:
- 微信是否在用户点击广告、卡片或小游戏入口并开始拉起游戏时,就已经将其计入访问/活跃用户?
- 如果玩家点击后,在小游戏代码包、引擎或首场景初始化完成前退出、崩溃或者加载失败,微信是否仍然计数?
- TD 必须等 JavaScript 运行,并且 TD SDK 初始化成功后才能上报事件。这部分未成功进入到业务代码的用户,是否就是主要差值来源?
- Cocos Creator 第一个场景的
onLoad(),相对于微信开始统计用户的时间点,是否已经晚了一段? - 是否应该在 Cocos 构建生成的入口脚本、启动脚本或者
game.js阶段初始化 TD,而不是等第一个场景的onLoad()?这样做是否安全,会不会受到构建覆盖影响?
想请教大家的问题
想请教有类似接入经验的开发者:
- 微信公众平台的“新增用户”和“活跃用户”,准确统计起点分别是什么?
- TD 的
ta_mg_show触发用户数,是否可以直接与微信后台活跃用户进行对比? - 微信新增用户和 TD 的
is_new_user=true,两者是否本来就不是同一口径? - Cocos Creator 微信小游戏中,TD 放在首场景
onLoad()初始化是否足够早? - 有没有必要把 TD 初始化继续提前到引擎或小游戏入口脚本?
- 微信开发者工具能否准确模拟、观察玩家点击小游戏入口到首场景执行之间的过程,还是必须在真机上验证?
- 大家实际项目中,微信后台与 TD、神策等第三方平台的用户误差通常是多少?1% 是否是普遍可以达到的水平?
- 如果大家的误差可以控制在 1% 左右,具体使用的是哪个事件和统计口径?
目前我们认为,10% 的差距可能同时包含以下因素:
- 微信与 TD 的统计口径不同
- 用户在 TD 初始化完成前退出或加载失败
- 微信旧版本代码包缓存,不同版本埋点字段不一致
- TD 网络上报失败或事件尚未成功发送
- 微信与 TD 对新增用户的身份识别方式不同
- 数据延迟、去重身份及时区边界差异
但暂时还没有足够证据判断哪一项是主要原因。
如果有做过 Cocos Creator 微信小游戏,并且成功将微信后台与第三方数据平台误差控制在较低范围的朋友,希望能分享一下初始化位置、事件配置、看板口径和排查方法,非常感谢!
