结论先行:如果重复触发来自代码部署或事件规则变更,正确做法不是删掉重复数据,而是把“修复前原始记录”和“修复后校正记录”分两层保留,并让每个下游角色看到同一套版本标识。这样做的代价是报表短期会出现两段口径,但它能让投放、开发、财务对同一事实有可核对的依据。若重复来自平台侧回传且你无法控制触发源,这套方法只能用于内部对账,不能用来改写平台已归因的结果。
重复触发通常有三种来源,处理方式不同。第一种是页面或应用内代码被加载两次,例如同一段转化脚本同时出现在全局模板和活动页模板里。第二种是事件规则被改动,例如原先按“提交成功页”触发,后来改成按“接口返回成功”触发,两段逻辑并行了一段时间。第三种是平台回传或接口重试导致的重复,此时你手里只有接收侧记录。
前两种可以定位到自己的触发源,适合保留修复前后两套记录。第三种缺少触发侧证据,只能把平台回传记录当作外部事实单独存档,并在内部标注“来源不可控”。区分方法很直接:在测试环境用一次真实动作触发事件,看日志里出现几次相同事件标识;如果一次动作产生多条记录,且时间戳接近,基本可以判断为触发源重复。
保留记录的关键不是留一份“正确数据”,而是留一份可追溯的变更链。建议在内部数据结构里增加三个字段:事件版本、记录状态、替代关系。事件版本标记这条记录属于修复前还是修复后;记录状态区分原始、已校正、已排除;替代关系指向这条记录被哪条记录取代。
实际操作可以这样落地:先导出修复前一段时间的原始事件,原样保存,不改数值。再为每条重复记录生成一条校正记录,校正记录里写明去重依据,例如“同一用户同一事件在十秒内出现两次,保留首次”。最后让报表默认读取校正层,但保留一个入口可以切回原始层。这样投放角色看校正后的转化数,开发角色看原始日志,双方核对时用的是同一批事件标识,而不是各自导出的两份表。
分歧往往不是因为数字不同,而是因为各自不知道对方看的是哪一层。把分歧转成可核对项目,需要三个共享物:一份事件定义说明、一个版本标识、一条变更时间线。
一个假设例子:某次活动页改版后,开发把转化脚本从页脚移到表单提交回调里,结果旧脚本没有移除,同一提交动作触发两次。修复前一周的原始记录显示转化数偏高,校正层按“同一用户同一事件保留首次”处理后数值回落。此时投放角色用校正层评估效果,开发角色用原始层确认重复模式,财务角色按校正层对账。三方核对的是同一批事件标识,分歧就从“数字对不对”变成“这条记录该不该保留”。
反例出现在触发源完全在外部且无法关联到内部用户标识时。比如平台回传的事件只带广告点击标识,不带你内部的订单号或用户标识,你就无法判断两条回传是同一动作的重复,还是两个真实动作。此时强行去重可能把真实转化误删,保留原始记录又无法校正。遇到这种情况,正确动作是停止在内部做去重判断,改为在平台侧核对回传规则,并把内部记录标注为“待平台确认”,而不是自行给出一个校正数字。
另一个失效条件是重复发生在归因窗口边界附近。如果两条记录跨越了不同的归因窗口,去重规则需要先明确按哪个窗口计算,否则校正层本身也会产生新的口径分歧。
不要先改代码再补记录,那样修复前的证据会丢失。建议的顺序是:先导出并冻结修复前的原始事件,标注版本;再在测试环境复现重复触发,确认触发源;然后修改触发逻辑,同时上线校正层;最后把事件定义说明和变更时间线同步给投放、开发、财务三个角色。完成这一步后,下一次核对转化数时,先问“看的是哪一层”,再讨论数字差异,这比直接争论哪个数字正确更能推进项目。