主题切换
数据分析与埋点设计
预计阅读 30 分钟
版本信息
最后更新:2026-07-09 · 适用基础库:≥ 3.9.0(最低兼容 ≥ 2.30.0)
"如果无法衡量,就无法改进。" 数据分析是游戏迭代和变现优化的核心能力。本章讲解小游戏埋点体系的设计原则、微信数据助手与 wx.reportAnalytics 的使用边界,以及如何设计一套可扩展的自定义事件系统。
埋点体系的分层
| 层级 | 工具/方式 | 用途 | 实时性 |
|---|---|---|---|
| 运营诊断 | wx.reportAnalytics | 异常监控、简单计数 | 分钟级延迟,可能采样 |
| 业务分析 | 自建后端 / 云开发 | 留存、付费、漏斗 | 实时或准实时 |
| A/B 实验 | 自建实验平台 | 策略效果对比 | 准实时 |
| 崩溃监控 | Sentry / 微信异常监控 | 错误堆栈、性能告警 | 近实时 |
wx.reportAnalytics 不是 BI 工具
wx.reportAnalytics 适合轻量诊断事件,不适合作为收入核算、A/B 实验结论或用户画像的权威数据源。关键业务指标必须通过自建后端或专业数据分析平台统计。
事件设计原则
1. 事件命名规范
采用 "动作_对象_场景" 的三段式命名,便于聚合和筛选:
game_start → 游戏开始
level_complete → 关卡完成
ad_show_rewarded → 激励视频展示
purchase_success → 支付成功
ui_click_shop → 点击商店按钮2. 事件参数设计
每个事件应携带"who、when、where、what、how"五个维度的上下文:
typescript
interface BaseEvent {
event: string
userId: string // openId 或设备指纹
sessionId: string
timestamp: number
version: string // 游戏版本号
platform: string // android / ios / devtools
baseLib: string // 微信基础库版本
}
interface GameStartEvent extends BaseEvent {
event: 'game_start'
source: string // 启动来源:share / search / history
level: number
}3. 用户隐私合规
- 不要采集 IMEI、MAC 地址等敏感设备信息。
- openId 虽非明文个人信息,但仍需在隐私政策中声明用途。
- 未成年人相关事件需做脱敏或不上报。
常用指标与漏斗
核心指标
| 指标 | 计算方式 | 用途 |
|---|---|---|
| DAU/MAU | 日/月活跃用户 | 衡量用户规模 |
| 次日留存 | D2 活跃 / D1 新增 | 衡量首日体验 |
| 平均游戏时长 | 总时长 / 游戏次数 | 衡量玩法粘性 |
| 广告渗透率 | 看广告用户数 / 活跃用户数 | 衡量广告变现空间 |
| ARPU | 总收入 / 活跃用户数 | 衡量变现效率 |
| 付费率 | 付费用户 / 活跃用户 | 衡量付费转化 |
典型漏斗
曝光商店 → 点击商品 → 调起支付 → 支付成功
100% 40% 15% 10%通过漏斗可以定位最大流失环节。例如 "点击商品→调起支付" 流失严重,可能说明价格锚点或商品展示有问题。
上报实现示例
typescript
class Analytics {
private static queue: Record<string, any>[] = []
private static flushTimer = -1
private static readonly BATCH_SIZE = 20
private static readonly FLUSH_INTERVAL = 10000
static init() {
this.startFlushTimer()
}
static track(event: string, params: Record<string, any> = {}) {
this.queue.push({
event,
...params,
timestamp: Date.now(),
sessionId: this.getSessionId(),
// ⚠️ 可选链需要双重保护:方法可能不存在,调用结果也可能为 undefined
baseLib: wx.getAppBaseInfo?.()?.SDKVersion ?? '',
})
if (this.queue.length >= this.BATCH_SIZE) {
this.flush()
}
}
private static startFlushTimer() {
clearInterval(this.flushTimer)
this.flushTimer = setInterval(() => this.flush(), this.FLUSH_INTERVAL)
}
private static flush() {
if (this.queue.length === 0) return
const batch = this.queue.splice(0, this.BATCH_SIZE)
wx.request({
url: 'https://your-analytics-server.com/track',
method: 'POST',
data: { events: batch },
success: (res) => {
if (res.statusCode >= 400) {
this.queue.unshift(...batch) // 失败回队,限制长度防止无限增长
}
},
fail: () => {
this.queue.unshift(...batch)
if (this.queue.length > 100) this.queue.length = 100
},
})
}
private static getSessionId(): string {
try {
let sid = wx.getStorageSync('analytics_session_id')
if (!sid) {
sid = `s_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`
wx.setStorageSync('analytics_session_id', sid)
}
return sid
} catch {
return `s_${Date.now()}`
}
}
}A/B 测试埋点
A/B 测试需要单独的事件来记录分组和结果:
typescript
// 用户进入实验分组时上报
Analytics.track('ab_exposure', {
experimentId: 'ad_interval_v2',
group: 'B',
strategy: { adInterval: 240000 },
})
// 实验关注的目标事件
Analytics.track('ad_rewarded_show', {
experimentId: 'ad_interval_v2',
group: 'B',
scene: 'revive',
})服务端根据 experimentId + group 聚合,计算各组的广告渗透率、人均观看次数、留存等指标。
📝 课后练习
练习 1:设计一个付费漏斗
题目: 为皮肤商店设计一个从曝光到支付的完整事件体系,列出至少 5 个事件及其关键参数。
参考答案:
shop_expose— 商店曝光:skinId,positionskin_click— 点击查看皮肤:skinId,pricepurchase_click— 点击购买按钮:skinId,price,currencypurchase_invoke— 调起米大师支付:skinId,orderIdpurchase_success— 支付成功:skinId,orderId,amountpurchase_fail— 支付失败:skinId,errorCode
本章小结
- 埋点体系应分层:
wx.reportAnalytics用于诊断,业务指标用自建后端。 - 事件命名采用 "动作_对象_场景" 三段式,参数包含完整上下文。
- 核心指标包括留存、时长、ARPU、付费率、广告渗透率等。
- A/B 测试需要单独记录分组曝光和目标事件,便于服务端聚合分析。
- 注意用户隐私合规,敏感设备信息不应采集。