先把重复触发分成两类再决定记录方式:一类是同一真实转化被多次上报,另一类是页面或接口在修复前确实产生了多条有效事件。前者应保留原始日志并标注去重依据,后者应保留修复前后的两套口径并说明切换时点。不要直接覆盖旧数据,否则后续对账、申诉和归因复核都会失去参照。
重复触发通常有三种可区分的原因。第一种是同一用户动作被监听器绑定了多次,例如按钮点击同时触发页面事件和标签管理器事件。第二种是回传链路重试,例如服务端在超时后重发同一事件。第三种是修复动作本身造成的,例如改完代码后旧事件仍在缓存期内继续上报。
判断依据不是看总数变化,而是看事件标识。如果同一笔转化带有可关联的订单号、请求号或时间戳,就能判断哪些记录指向同一次动作。如果缺少唯一标识,只能按时间窗口和用户路径做近似分组,这时保留原始记录比改写更重要。
一个可执行动作是先导出修复前后的完整事件日志,按事件标识分组,统计每组出现次数。这个动作的结果会直接决定下一步:若重复集中在少数标识上,可以只对这部分做去重标注;若几乎每条都重复,说明触发条件本身有问题,应优先修代码而不是修数据。
保留原始记录适用于需要对账、申诉或跨角色核对的情况。多个角色对同一事实理解不同时,原始日志是共同参照。它的代价是数据量变大、看板口径暂时偏高,需要额外字段标记哪些是重复项。
改写汇总数据适用于重复原因已经确认、且下游只关心最终转化数的情况。前提是原始日志已经单独存档,改写过程可追溯。如果直接在看板或报表里覆盖,等于把判断依据一起删掉,之后没人能复原当时为什么这样处理。
两种做法可以并存:底层保留原始事件,汇总层增加一个去重后的口径字段。这样既不丢证据,也不让日常查看被重复数据干扰。需要说明的是,去重口径本身也是一种假设,应记录它依据的是事件标识、时间窗口还是其他规则。
当投放、技术、财务对转化数各有一套说法时,不要先争论谁对,而是把分歧拆成可以逐项核对的项目:
把这五项列成一张对照表,让每个角色填写自己依据的来源。多数分歧会在填写过程中暴露出来,例如一方用的是平台报表的归因转化,另一方用的是后端订单表。两者本来就不是同一件事,不需要强行统一成一个数字。
假设某广告落地页的提交按钮在修复前绑定了两次上报,修复后只保留一次。但修复上线后,缓存中的旧页面仍在部分用户端运行,导致一段时间内新旧事件同时到达。此时如果直接按新口径统计,会低估这段窗口的真实转化;如果直接按旧口径统计,又会高估。
可行的处理是:保留这段窗口的原始事件,按事件标识去重后得到中间口径,并在记录中注明窗口起止时间和去重依据。下一步的看板展示使用中间口径,同时对账使用原始日志。等缓存窗口结束后,再确认是否切换回单一新口径。
这个例子的关键不是数字本身,而是先记录假设再行动。假设写清楚了,后面发现口径不对时才知道该改哪一步。
如果重复触发已经无法通过标识或时间窗口区分,继续维护两套口径的成本会高于收益。这时可以考虑退出当前记录方式,改为只保留一份经过确认的口径,并在文档中说明放弃原始明细的原因。退出前应确认没有正在进行中的对账或申诉依赖旧记录。
另一种需要退出的情况是修复动作已经稳定运行足够长时间,旧事件不再到达。此时继续保留双口径只会增加理解成本,可以把历史记录归档,日常查看切换到单一口径。归档不等于删除,保留可查即可。
选择保留、改写还是退出,取决于当前是否有人需要核对这段历史。只要还有角色依据旧数据做判断,就不宜直接覆盖。等到分歧消除、核对需求结束,再简化记录方式也不迟。