先给结论:不要在原回传链路上直接覆盖修复,而是把修复前的历史回传冻结为一份只读快照,再用新的事件标识或新链路承接修复后的数据。保留两份记录并在报表层做去重对照,才能既查清重复来源,又不让修复动作抹掉问题证据。是否值得这样做,取决于重复触发是否已经进入出价或结算口径。
重复触发分两种处境,处理优先级完全不同。第一种是重复事件只落在分析工具或自建日志里,广告平台回传仍是单次,那么出价模型没有因此多算转化,修复重点只是内部口径对齐。第二种是重复事件已经通过回传接口进入平台,平台按多次转化累计,再被用于智能出价或成本考核,这时修复前必须留档,否则你无法解释账户数据为什么在某个时间点前后出现断层。
区分方法不复杂:取同一时间窗,把平台侧转化数与自建日志按事件去重后的数量并列比对。如果平台数明显高于去重数,且差额集中在某几个页面路径或某类设备上,基本可以判断重复已进入回传。反过来,如果两边数量接近,只是日志内部出现成对记录,那多半是前端埋点或服务端重试造成的本地重复,影响面小得多。
需要冻结的是可核对的最小证据集:事件名称、触发时间、去重键、来源渠道标识、回传状态。不要冻结整张明细表后就不管,因为明细里往往混有用户标识等敏感字段,长期留存会带来合规负担。更稳妥的做法是保留去重键的哈希值和统计口径,原始明细按内部数据保留策略限期清理。
有一个容易被忽略的点:修复前如果继续让重复数据实时回传,等于一边留证据一边继续污染。因此留档和止损要同时做。具体动作可以是先在回传前加一层去重判断,把重复事件拦在平台之外,同时把被拦下的事件写入独立日志。这个动作的结果是平台侧新增转化立刻变干净,而拦截日志成为你后续核对“到底重复了多少”的依据。下一步再决定是否需要向平台申请数据修正,而不是先改历史。
三种做法各有前提,不必都选。
判断依据可以落在一个假设例子上:假设某活动页在移动端因页面重复加载,同一提交被触发两次回传,一天内平台记录转化数约为去重后的两倍。若该活动仍在投放且以转化为出价目标,应选旁路或改写并立即拦截;若活动已结束、只用于事后复盘,则冻结快照后逐步清理即可,不必动线上链路。
留档不是终点,能对上才算修复完成。建议在修复上线后设一个观察窗口,把平台转化数、拦截日志数、去重后日志数三者并列。合理的状态是:平台数接近去重后日志数,拦截日志数等于被拦下的重复量,且三者之和能与修复前的总量大致闭合。如果对不上,先查时间戳口径是否统一,再查去重键是否在修复前后发生变化,不要急着判定修复失败。
还要注意,转化数下降本身不能单独证明修复正确。投放预算缩减、素材疲劳、落地页改动、平台归因窗口调整,都会让转化数下降。要排除这些解释,可以固定其他变量,只对比同一批定向人群在修复前后的转化率,而不是看总量。只有定向、素材、预算基本不变时,转化数的变化才更可能来自去重本身。
这次修复结束后,值得固化两件事:一是任何回传字段变更都先产出快照再上线,二是去重键的版本号写进事件命名,避免新旧数据混在同一口径里。这样下次再遇到重复触发,你不需要重新争论要不要留档,而是直接按已有规则执行。定向广告投放的转化数据一旦被重复计数,修复的难点从来不是改代码,而是证明改之前发生了什么、改之后是否真的变干净。