先给结论:不要直接删除重复事件,也不要让新旧记录混在同一口径里对账。正确做法是把修复前的事件标记为“历史口径”,把修复后的事件标记为“当前口径”,让两套记录各自完整留存,再在报表层按口径分别汇总。这样既能追溯旧数据的来源,也不会让修复后的转化数被历史重复值污染。
重复触发通常有三种成因,处理方式完全不同。第一种是页面或播放器上的转化代码被加载了两次,例如同一段视频广告推广代码同时写在模板和组件里;第二种是用户行为本身重复,例如表单提交后刷新页面再次提交;第三种是回传链路重复,例如服务端和客户端各上报一次同一转化。
对第一种和第三种,重复是技术缺陷,修复后应当保留修复前记录作为历史证据,但不再计入当前口径。对第二种,重复是真实用户行为,不能简单当作错误删除,需要结合业务规则判断是否算多次转化。判断依据可以看时间戳间隔:同一用户在数秒内产生多条相同事件,更可能是技术重复;间隔较长且伴随不同会话,更可能是真实多次行为。
核心是给每条转化事件加上口径标识,而不是覆盖旧值。可以在事件参数中增加一个字段,例如:
conversion_version=before_fix 与 conversion_version=after_fix
修复上线时,不要修改历史数据,只在新事件上写入新标识。这样同一时间范围内的报表可以按该字段拆分,得到修复前口径和修复后口径两组数字。
同时要记录修复动作本身:修复时间点、影响的转化类型、涉及的事件名称。这份记录不必复杂,一张简单的变更日志即可。它的作用是当后续有人质疑“为什么转化数突然下降”时,能直接对应到口径切换,而不是重新排查一遍。
一个假设例子:某视频广告推广活动在周一修复了重复上报问题,修复前每天记录到 200 次转化,其中约 60 次是重复。修复后当天记录 140 次。如果不保留修复前记录,只看数字会以为转化骤降;如果保留两套口径,就能说明 140 才是修复后的真实水平,而此前的 200 需要打折扣理解。
改写旧记录只在一种前提下成立:重复事件可以被明确识别,且改写不会影响其他指标的连续性。例如重复事件带有唯一标识,去重后不影响归因窗口内的其他转化。这种情况下可以在分析层做去重视图,但原始表仍然保留。
必须保留原样的情况更多:无法确定哪些是重复、重复事件已经进入结算或考核、旧记录被下游报表引用。此时改写会造成对账断裂,后续无法解释差异来源。取舍原则是——原始层保留,分析层可以按口径过滤,但不要在两个层之间来回覆盖。
如果旧系统或旧合作关系即将退出,保留策略还要考虑数据可迁移性。把修复前后的关键字段导出为独立文件,比依赖即将下线的系统查询更稳妥。
修复上线不等于问题结束。需要验证三件事:新事件是否只触发一次、旧口径是否停止写入、两套口径在切换时间点附近是否出现无法解释的缺口。
具体动作是:在修复后的一个完整转化周期内,分别按新旧口径拉取数据,对比同一转化类型的数量差异。如果差异与修复前估算的重复比例大致吻合,说明修复生效;如果差异过大或过小,说明可能还有未识别的重复路径或漏报路径。这个验证结果决定下一步是继续排查,还是可以切换到单一当前口径。
需要提醒的是,广告平台侧的报告和自有统计工具的口径可能不同,验证时应以同一数据源的前后对比为准,不要用平台数字直接验证自有埋点。
当旧系统或旧合作关系退出时,保留修复前记录的价值在于可追溯,而不是继续使用。确认退出的前提是:当前口径已稳定运行至少一个完整周期,历史记录已归档到可独立访问的位置,且下游使用方已知悉口径切换。
如果这三个条件没有同时满足,更稳妥的选择是继续并行保留两套口径,而不是急于清理旧记录。清理动作本身不可逆,而保留的成本通常只是存储和少量维护。