核心做法是:不要删除或覆盖重复触发的那条转化记录,而是把它标记为“修复前样本”,同时用同一用户在修复后产生的下一条有效记录作为“修复后样本”,两者用同一个修复批次号关联。这样既能保留原始触发事实,又能对比修复效果,避免因去重而丢掉判断依据。
重复触发通常有三种成因,处理方式不同:
判断成因的实际动作:拉取最近一段时间内同一用户的转化时间戳,按分钟排序。如果多条记录集中在几秒内,优先怀疑页面层;如果分散在几分钟到几十分钟,更可能是代码或回传层。这个判断结果直接决定你修复的是前端、埋点还是回传链路。
不需要复杂系统,只要在原有转化记录上增加三个字段即可:
fix_batch:修复批次标识,同一次修复动作使用同一个值。record_role:取值为 before_fix 或 after_fix,标明这条记录属于修复前还是修复后。dedup_key:用于关联同一用户同一事件的键,可以是用户标识加事件类型的组合。假设某条表单提交在修复前被触发两次,修复后同一用户又提交一次。保留方式是:两条修复前记录都写入,record_role 为 before_fix;修复后那条写入,record_role 为 after_fix。三条记录共享同一个 dedup_key 和 fix_batch。后续分析时,你可以按 fix_batch 分组统计修复前后的有效转化数,而不必依赖原始流水。
只改代码不记录改动内容,后续无法解释为什么某段时间的记录结构变了。建议在修复批次中同时记录:
这些信息可以放在一个独立的修复日志中,与转化记录通过 fix_batch 关联。这样当有人质疑“为什么修复后转化数下降了”,你能直接指出下降来自去除了重复计数,而不是真实转化减少。
这里有一个容易被忽略的取舍:修复前已经进入报表的重复记录,是否要回改。两种做法各有前提。
保留原样、只做标记适用于:重复记录已经用于历史结算、对账或对外汇报,改动会引发口径不一致。此时修复前记录保持原值,仅在分析时通过 record_role 过滤。
改写为去重后数值适用于:重复记录尚未对外使用,且系统支持版本化更新。改写的条件是你能明确每一组 dedup_key 中哪一条是主记录,并且改写动作本身也留有日志。否则宁可保留原样。
一个可区分的证据是:如果同一 dedup_key 下的修复前记录时间戳完全一致或相差不到一秒,且来源字段相同,那么它们很可能是同一次触发的重复写入,去重风险较低。如果时间戳分散、来源字段不同,则可能是真实的多渠道触达,不应简单合并。
修复上线后,不要立刻停止记录重复数据。先跑一个观察窗口,确认同一 dedup_key 下不再产生新的 before_fix 记录,再把该批次标记为“已验证”。如果观察期内仍出现重复,说明修复未覆盖到该路径,应新建一个修复批次继续记录,而不是在原批次上追加。
这个动作的结果会直接影响下一步:验证通过后,你可以安全地按 after_fix 记录作为后续转化统计的基准;验证未通过,则说明需要回到成因判断环节,重新定位是页面、代码还是回传层的问题。