先给结论:不要在原转化事件上直接改代码或改配置来“修好”重复触发,而应把修复动作当成一次可回滚的版本切换。旧版本继续按原样记录,新版本单独记录,两段数据在报表里用时间区间和版本标记区分。这样做的代价是短期内转化数会偏高或口径不统一,但换来的是修复前后各自可解释、可对照,而不是把历史记录一并抹掉。
重复触发通常有两种成因,处理方式并不相同。
第一种:同一用户在一次完整观看或一次点击路径中,被同一事件重复上报。例如视频播放到某个进度点触发一次转化,用户暂停、拖动进度条后又经过同一进度点,事件被再次触发。这类问题的特征是重复集中在短时间内、同一用户标识上,时间间隔往往只有几秒到几分钟。此时修复的核心是加去重条件,但去重条件本身会改变历史可比性,所以必须保留旧记录。
第二种:多个来源同时上报同一转化。例如页面上的像素和视频播放器内的回调各自上报一次,或者旧合作关系留下的一个上报通道还没下线,与新通道并行。这类问题的特征是同一用户会出现两条来源不同、字段结构不同的记录,时间上可能接近也可能相隔较久。
区分这两类的实际动作:先按用户标识和时间戳排序,看重复记录的间隔分布。如果绝大多数重复落在同一分钟以内,偏向前者;如果重复记录带有明显不同的来源字段或参数结构,偏向后者。这个判断直接决定下一步是改触发逻辑,还是先梳理上报通道清单。
当旧系统、旧合作关系或旧内容仍在产生有效转化,只是上报方式有缺陷时,不要直接停掉它。可行的做法是让新旧两条记录并存,但加上可区分的标记。
具体动作可以这样安排:
这样做的结果:你能看到修复后重复率是否下降,也能看到转化总量是否因为去重而合理减少。如果新版本上线后转化数明显低于旧版本,需要先排除是去重生效还是触发条件本身被改窄了——这两者的区别在于,前者减少的是重复部分,后者会连首次触发一起减少。判断方法是看独立用户数:如果独立用户数基本不变而总事件数下降,说明去重生效;如果独立用户数也同步下降,说明触发条件被改窄了,需要回退调整。
如果旧系统或旧合作关系确定要退出,且其数据不再需要参与后续优化决策,可以选择冻结而非并行。冻结的意思是:旧记录原样保留在存储中,但不再写入新数据,报表默认只读新版本区间。
实施动作:
如果发现迟到上报仍在写入,说明冻结不彻底,需要在上报入口处明确拒绝旧版本标记的数据,而不是只在报表层过滤。只在报表层过滤的问题是:底层数据仍在增长,未来做归因分析时容易把两段数据混在一起。
这里的例外是:如果旧通道的迟到上报本身带有有效转化信息,直接拒绝会丢失真实转化。此时应保留写入但标记为迟到旧版本,并在分析时单独评估其占比。占比很小时可以忽略,占比明显时说明切换时机或客户端缓存策略需要重新考虑。
保留两段记录的目的是能对照,所以对齐口径比保留本身更重要。需要对齐的至少有三项:统计时间区间、去重规则、用户标识方式。
假设一个简化例子:修复前同一用户在一次观看中平均触发两次转化事件,修复后平均触发一次。如果只看总事件数,会得出转化下降的结论;但如果按独立用户数看,转化用户数没有变化,说明下降来自去重而不是转化能力变差。这个对比只有在两段记录使用同一套用户标识方式时才成立。如果修复同时更换了用户标识方式,那么两段数据就无法直接对照,只能各自内部比较趋势。
因此,修复方案里应明确:本次修复是否改变了用户标识方式。如果改变了,就不要把修复前后的转化数放在同一张趋势图里比较,而应分别看各自区间内的重复率和独立用户转化率。
最后一步是记录决策依据:把重复触发的成因判断、选择的保留方式、观察窗口的长度和判断结果写进同一份变更记录。这样下一次遇到类似问题时,不需要重新推断当时为什么保留旧记录,也能避免把已经排除的原因再排查一遍。整个修复过程的目标不是让数字立刻变干净,而是让每一段数字都能说清它代表什么。