先给结论:不要急着把重复上报关掉。更稳妥的做法是先把重复触发的原始证据固定下来,再决定是在前端加去重、在回传层加去重,还是同时保留两条链路。修复前后的记录必须能分别对应,否则你无法判断修复是否真的生效,也无法向需要看数据的人解释为什么某天的转化数突然下降。
重复触发通常有两种来源,处理方式完全不同。
第一种:同一页面内多次触发。用户提交表单后页面没有跳转,按钮仍可点击,或者提交成功后回调函数被调用两次。这类重复的特征是时间戳非常接近,往往在几秒内,且设备、IP、用户标识高度一致。此时前端的去重记录最有价值,因为你能看到原始触发次数和被拦截次数。
第二种:不同链路各自上报。比如页面埋点和后端回传同时生效,或者两个投放账户共用同一个转化目标。这类重复的特征是时间间隔较长、来源字段不同,但转化价值相同。此时要保留的是两条链路各自的记录,而不是简单合并成一条。
判断依据可以这样用:导出重复事件列表,按用户标识分组,看时间差分布。如果绝大多数集中在十秒内,优先查前端;如果分布分散且来源字段有明显差异,优先查链路配置。这个判断动作的结果直接决定你接下来改哪一层,改错层会导致修复后重复依旧存在。
在动任何代码或配置之前,先做一件事:把当前一段时间内的原始转化事件完整导出,存成只读文件或独立数据表,并记录导出时间点。
这份记录要包含:事件时间、用户标识、来源渠道、转化目标名称、上报方式(前端还是回传)、以及当时的去重状态。不要在这一步做清洗,不要删除看起来重复的行。原因是修复后你很可能需要回头对比,而清洗过的数据无法还原当时的真实触发情况。
假设一个场景:某账户连续三天转化数偏高,你怀疑是重复触发,于是直接在前端加了防抖。结果第四天转化数下降,但你无法确认下降是因为重复被消除,还是因为防抖误拦了正常提交。如果修复前冻结了原始记录,你就能按用户标识逐条比对,看被拦掉的是否都是真正的重复。这个对比动作会告诉你防抖阈值是否设置过严,从而决定下一步是放宽还是保持。
前端去重和后端去重各有适用条件,不要默认选一个就完事。
两种可以同时用,但要分工明确:前端负责拦截明显的短时间重复点击,后端负责兜底跨链路重复。同时用时,前端拦截掉的事件也要记录,标记为“已拦截”,而不是直接丢弃。这样修复后的总账才能对上:原始触发数等于成功上报数加已拦截数加失败数。
修复上线后,不要只盯着转化总数变化。总数下降可能是重复被消除,也可能是正常转化被误伤,两者含义完全不同。
验证方法是取修复前后各一段相同长度的时间窗口,按用户标识做对照:
如果第二项出现异常减少,说明去重范围过大,需要缩小时间窗口或调整匹配键。如果第三项显示拦截记录分散在较长时间段,说明可能误拦了正常复购或多次提交,需要重新确认业务上是否允许同一用户多次转化。
这里有一个容易被忽略的例外:某些转化目标本身允许同一用户多次完成,比如不同订单的提交。这种情况下,去重键必须包含订单标识或会话标识,否则会把正常的多笔转化当成重复。修复前冻结的记录里如果包含订单字段,这个判断就能直接做,不需要重新翻日志。
修复前后的记录建议至少保留一个完整的业务周期,比如覆盖一次活动从上线到结束的时间。保留的目的不是存档,而是当后续有人质疑数据波动时,你能拿出对应关系。
也有不该去重的情况:如果重复触发本身反映了真实的用户行为,比如用户确实提交了两次不同内容的表单,那么强行去重会掩盖真实需求。这时应该做的是区分记录,而不是合并。判断标准是重复事件是否对应不同的业务实体,如果是,保留两条并分别标注来源,比去重更有价值。
最后,付费广告的转化数据与自然搜索的转化数据是不同机制,广告侧的去重修复不会影响自然搜索的统计口径。如果你同时在两个渠道投放,修复记录时要分别标注渠道来源,避免把广告的重复修复结果直接套用到自然流量上。