先给结论:不要在发现重复触发的当下直接清空或覆盖原记录。更稳妥的做法是保留原始事件、用独立字段标记修复动作,并让修复前后的数据都能被单独核对。这样做的原因是,重复触发往往同时牵涉回传逻辑、页面行为和归因口径,直接改写会让后续判断失去参照。
重复触发通常出现在三个位置:页面上的转化动作被多次执行、回传请求被重发、平台侧把同一动作按不同规则计入。三者需要保留的证据不同。页面层要留下触发次数与时间戳,回传层要留下请求标识与响应状态,平台层要留下事件标识与计入结果。
如果只记录最终计数,修复后就无法回答“原来多算了多少、修复后是否真的只算一次”。因此第一步不是改代码,而是把当前能拿到的原始事件先固定下来。可以按下面的顺序处理:
做完这四步,再决定是保留、改写还是退出旧口径。保留适用于重复原因尚未查清、需要继续观察的情况;改写适用于确认是同一事件的重复计数、且能对应到具体记录的情况;退出适用于旧口径已经无法与业务事实对应、继续沿用只会误导判断的情况。
保留的前提是重复与真实转化还无法区分。比如同一用户在同一会话内提交了两次表单,但其中一次可能是误操作,这时直接删掉一条会掩盖真实行为。保留原始记录,另建一个“是否计入”的标记字段,后续分析时可以按标记筛选。
改写的前提是能定位到重复的具体记录,并且有独立依据证明它们指向同一次转化。例如订单号相同、时间接近、设备标识一致。改写时不要直接修改原值,而是新增修正字段,保留原值可追溯。这样即使后续发现判断有误,也能回退。
退出的前提是旧记录口径已经与当前业务定义冲突,且继续保留会造成持续误读。退出不等于删除,而是停止用它作为决策依据,并在记录中注明停用时间和替代口径。退出动作本身也要留下记录,否则下一次核对时仍然会有人把旧数据当成现行结果。
三种处理并不互斥。常见做法是:原始层保留,分析层改写,报表层退出旧口径。关键是每一层都写明适用条件,而不是只留一个最终数字。
假设某次投放中,同一订单在回传时被发送了两次,平台侧计为两次转化。修复前记录如下:
修复时新增字段而不是覆盖原值:
这样处理的结果是,修复前后的数字都能被查到。下一步核对时,可以先看“平台计入转化”与“修正后计入”的差值,再判断差值是否与其他订单的重复模式一致。如果差值只出现在个别订单,说明更可能是单点问题;如果差值成批出现,说明回传逻辑或触发条件需要整体检查。
这个例子是假设,用于说明字段设计方法,不代表任何真实账户数据。实际字段名称可以按团队习惯调整,但保留原值、新增修正字段、注明依据这三条不应省略。
多个角色对同一转化事实有不同理解时,分歧往往不在结论,而在各自看到的数据层不同。投放角色看平台报表,技术角色看回传日志,业务角色看订单系统。三者都合理,但如果没有统一的事件标识,就无法核对。
可执行的动作是:为每个转化事件分配一个稳定标识,并让页面、回传、平台报表三处都能带上这个标识。标识不需要复杂,能区分同一业务动作即可。完成这一步后,再出现重复触发时,各方可以先对齐同一标识下的记录,而不是各自引用不同来源的数字。
这个动作的结果会直接影响下一步:如果三处标识能对齐,修复就可以精确到具体事件;如果对不齐,就只能先做整体口径调整,暂时无法逐条修正。选择哪种修复方式,取决于标识对齐的程度,而不是取决于哪一方的数字看起来更合理。
只记录改了什么还不够。修复记录至少应包含:发现重复的时间、判断重复的依据、修复动作、执行人、修复后需要观察的指标。缺少依据字段时,后续接手的人只能看到结果,无法判断这个结果是否仍然适用于当前投放。
如果修复后重复触发仍然出现,不要直接否定修复动作。先检查修复覆盖的范围是否完整,例如是否只改了页面层而回传层仍在重发。此时应保留修复记录,并新增一条观察记录,说明重复是否仍在、出现在哪一层。这样处理比反复覆盖同一条记录更有利于定位问题。
最终要留下的不是一份完美无重复的数据,而是一条能说清“原来是什么、改了什么、现在按什么口径看”的链路。链路完整,修复前后的记录才有核对价值。