先给结论:不要在原记录上直接改状态,也不要只留一份“修复后”的汇总表。正确做法是把每次重复触发都当成独立事件落库,用同一业务键串起来,再单独标记哪一条是修复后的有效转化。这样你既能看到重复发生的规模,也能在后续对账时解释清楚为什么某天的转化数比后台显示的少。
转化事件重复触发通常来自两个完全不同的方向,处理方式也不一样。
第一种是页面侧重复上报:用户提交表单后刷新页面、返回再提交,或者同一段转化代码在单页应用里被多次执行。这类重复的特征是时间戳接近、设备标识相同、转化参数几乎一致。此时应保留全部原始上报,用event_id加时间戳做去重键,修复动作放在代码层,记录层不动历史数据。
第二种是回传或对接环节重复:同一笔线索被多次推送到统计系统或客户系统,可能因为重试机制、接口超时重发、人工补录。这类重复的时间间隔可能很长,参数也可能被后续修改。此时要保留每次回传的原始报文和接收时间,另建一张映射表标明哪条是首次、哪条是补发。
判断依据很简单:如果重复事件的时间戳集中在几秒内,优先查页面触发;如果分散在几小时甚至几天,优先查对接和人工操作。这个判断会直接决定你下一步是改代码还是改流程。
很多团队的做法是发现重复后直接删除多余记录,只留一条。这会让修复前的证据消失,之后如果有人问“为什么上周转化数突然下降”,你无法回答。
更稳妥的做法是给每条转化记录分配一个不可变的主键,修复动作只新增标记字段,不覆盖原始值。可以按下面的顺序操作:
dedup_status,取值如“首次”“重复”“修复后有效”。repair_batch,记录这次修复属于哪一批处理,方便回滚和对比。dedup_status为“首次”或“修复后有效”的记录,原始表保持完整。这样做的实际结果是:修复后的转化数会下降,但下降幅度可以被解释。如果修复后数字没有变化,反而说明去重规则没有生效,需要回头检查业务键是否选错。
是否保留全部重复记录,取决于你的对账需求和数据量。
条件一:需要与客户或财务逐笔对账时,必须保留全部原始记录。因为每一笔重复都可能对应一次真实的接口调用或人工操作,删掉之后对账双方的数字对不上,责任无法划分。此时存储成本是必要代价,可以用分区表按天归档,降低查询压力。
条件二:只用于内部效果分析、不涉及逐笔结算时,可以保留原始记录但只把去重后的结果同步到分析层。分析层不承担对账职责,保留汇总和去重键即可。前提是你仍然保留原始表,只是不把它暴露给日常看板。
例外情况是:如果重复触发是由已知的、一次性的代码故障造成,且故障时间窗口明确,可以在原始表上打一个fault_window标记,而不是删除记录。标记之后,分析时排除该窗口,但审计时仍能还原。
假设某账户某天后台显示转化 40 条,修复重复触发后降到 28 条。直觉会认为“改坏了”,但更合理的解释是原先有 12 条属于重复上报。
验证方法是抽出这 12 条,按业务键分组,看是否集中在少数几个用户或少数几个时间段。如果集中在同一分钟内的多次提交,基本可以确认是页面侧重复;如果分散在不同天,则要检查回传重试。只有确认重复来源之后,才能决定是继续优化去重规则,还是回退某一次修复。这个动作的结果会直接影响下一步:来源确认了,就固定规则;来源没确认,就不要扩大修复范围。
把这些细节落实之后,重复触发就不再是一个只能靠删除来解决的问题,而是一段可以还原、可以解释、可以逐步收敛的记录过程。下一步该改代码还是该改对接流程,取决于你在这段记录里看到的重复分布,而不是取决于后台数字本身的高低。