页面浏览告诉你访客去了哪里,事件告诉你他们做了什么。本文分 5 步做事件埋点:带属性的起步事件清单、命名规则、代码、统计代码已经自动发送的事件,以及一轮核对,在有人基于数据做报表之前,把重复触发和缺失属性找出来。
读完你会知道
- 一份 10 个事件的起步清单,每个都写明属性和要回答的问题
- 代码、限制,以及不用自己加的自动事件
- 上线核对流程,以及「钱从服务端发」的规矩
事件埋点是什么
事件埋点记录页面浏览(PV)覆盖不到的行为:注册、点击「开始试用」、播放视频、下单。每个事件有一个名称(发生了什么)和若干属性(之后要按它拆分的细节,比如套餐、价格)。页面浏览告诉你访客去了哪里,事件告诉你他们在那里做了什么。
各家工具对事件的分法大同小异。Google Analytics 4 分为自动收集的事件、增强型衡量事件、推荐事件和自定义事件(Google:关于事件)。实际工作中可以分得更简单:统计代码自己会发的事件,以及因为只有你知道它重要、所以要你在代码里加的事件。本文讲的是后一种,分 5 步做完。
第 1 步:先规划事件
先写清单,再写代码。清单很短:有哪些事件、什么时候触发、带哪些属性、回答什么问题。起步不超过 10 个;起步的埋点方案一屏能放下就够了。
下面这份起步清单适合 SaaS 网站。电商的话,把中间几行换成商品浏览、加购和结算步骤。
属性有两条规矩。只加之后真会按它拆报表的属性,「按钮颜色」一般不算。不要把访客输入的原文放进属性:既没法分组,还可能带个人信息。属性的更多说明见术语页事件属性。
| 事件 | 触发时机 | 属性 | 回答的问题 |
|---|---|---|---|
signup_completed | 账号创建完成 | plan, source | 注册多少,从哪来? |
email_verified | 点了验证链接 | — | 注册卡在哪一步? |
project_created | 保存了头一个项目 | template | 新用户迈出头一步了吗? |
invite_sent | 邀请了同事 | role | 账号在团队里扩散吗? |
feature_used | 用了关键功能 | feature | 哪些功能带来留存? |
checkout_started | 打开定价结算 | plan, interval | 多少人尝试付款? |
purchase_completed | 付款确认(服务端) | plan, value, currency, order_id | 收入和转化 |
subscription_cancelled | 确认取消(服务端) | plan, reason | 流失及原因 |
起步不超过 10 个事件,有问题需要时再加。
第 2 步:给事件起名
事件名是数据里的键。报表、漏斗、目标都依赖 signup_completed 以后,再改名历史数据就断了。定一种规则并一直用:小写下划线、先对象后动作、已完成的动作用过去式。Segment 的规范对 track 调用推荐的也是「对象 + 动作」(Segment:Track 规范)。完整规则和例子见事件命名规范。
在 TapCub 里,登记进事件目录的名称必须是小写下划线格式、字母开头、不超过 40 个字符,不能以 $、_、tc_ 开头。网站、App、小程序上同一个行为用同一个名字,全端报表才能合在一起。
第 3 步:加代码
网站上记录一个事件只要一行:tapcub.track(name, props)。如果调用可能在统计脚本加载之前执行(比如页面顶部的内联脚本),就先放进队列,脚本加载后自动发送。
设计属性之前要知道几个限制:事件名超过 100 个字符会被截断;每个事件最多保留 20 个属性键;键超过 50 个字符、字符串值超过 200 个字符会被截断;只保存字符串、数字和布尔值,对象和数组会被丢掉。调用失败不会在页面上报错;同一访客在同一页面 1 秒内发出完全相同的事件,会被当成重复触发丢掉(见文档自定义事件)。
访客登录后,用你自己的用户 ID 调一次 identify。不调的话,事件一直挂在匿名访客上,没法跨设备追踪同一个人(见用户识别)。
// 脚本加载前:先放进队列
window.__tcq = window.__tcq || [];
window.__tcq.push(['track', 'signup_completed', { plan: 'pro', source: 'pricing' }]);
// 脚本加载后
tapcub.track('project_created', { template: 'blank' });
tapcub.track('invite_sent', { role: 'editor' });
// 访客登录后调一次
tapcub.identify('user_8f21', { plan: 'pro' });第 4 步:用好自动事件
在给每个点击都加自定义事件之前,先看看统计代码已经发了什么。TapCub 的网页脚本会自动记录外链点击、文件下载、404 页面、Web Vitals 和站内搜索词。表单提交也能自动记录,但默认关闭,要在脚本属性里打开。以上这些可以用 data-auto-track="false" 一起关掉。
没有埋过的点击,可以交给自动采集(无埋点):它记录可点击的元素(不会记录密码框,也不会记录 data-tc-ignore 区域里的内容),生成候选事件。候选事件要有人在事件收件箱里接受并命名后才会成为正式事件,接受时会回填最近 90 天的数据(见帮助审核候选事件)。
第 5 步:在有人做报表之前核对
多数埋点问题,是上线几周后头一个做漏斗的人发现的。其实一个下午就能查出来:
- 打开实时视图,自己把每个事件触发一遍。
- 确认每个事件只到一次、名称对、属性都有值。
- 第二天拿计数和可信的数据比:注册数对数据库,购买数对支付平台。
- 在清单上给每个事件标「已核对」和日期。
示例里的列表就是头一次核对的典型样子:大部分正常,一个触发了两次,一个缺属性。
上线当天核对
实时,最近 30 分钟signup_completedplan, source14已核对trial_startedplan9已核对project_createdtemplate23已核对invite_sentrole46重试时触发两次checkout_startedplan, interval5已核对purchase_completedplan, value, currency3缺 currency__outboundurl(自动)61自动事件
和钱有关的事件从服务端发
金额、退款和订阅变化应该从服务端上报。浏览器事件在「感谢页」加载时触发,这不等于付款成功,而且可能被拦截或重复触发。等支付平台确认后由后端发送收入事件,并带上订单号,方便查重(见文档服务端事件)。
常见错误
- 什么都埋。一百个没人看的事件,会把真正有用的十个淹没。
- 一个按钮一个事件。
signup_button_header_clicked和signup_button_footer_clicked应该合成一个事件,加一个location属性。 - 悄悄改名。改显示名称,别改事件的键。
- 属性里放自由文本。搜索词、留言、表单输入会把报表拆碎,还可能含个人信息。
- 没有负责人。每个事件都要有人知道它为什么存在,并在它停了的时候发现。
常见问题
页面浏览和事件有什么区别?
页面浏览记录的是一个页面加载了。事件记录的是页面上的一个动作,比如点击、提交表单、购买,并带着描述它的属性。
应该埋多少个事件?
先埋 10 个以内、能对应到决策的:注册、激活、购买,以及中间的两三步。某个问题没有它答不了,再加。
埋点一定要开发来做吗?
自定义事件一般要,因为得有人加代码。自动事件和自动采集不需要写代码,只需要有人审核并命名采到的内容。
用户行为追踪是什么?
泛指记录访客在网站或 App 上做了什么:页面浏览、事件、会话,以及它们之间的路径。事件埋点是其中记录具体动作的那部分。
怎么确认事件埋对了?
打开实时视图自己触发每个事件,确认它只到一次、属性齐全,第二天再拿计数和数据库或支付平台对一下。
另见:制定埋点方案。
这篇文章对你有帮助吗?
我们会根据反馈修改和补充这篇内容。
提交没有成功,请稍后再试。
谢谢你的反馈,我们会据此改进这篇内容。你已经反馈过这篇了,谢谢。



