先把重复触发拆成两类:同一真实转化被多次上报,或页面/接口在修复前后各上报一次。前者要在上报链路去重,后者要在修复前冻结原始记录、修复后另开标记,不要直接覆盖旧数据。这样既保留修复前的可比基线,也让修复后的口径可追溯。
发现重复触发时,最危险的动作是先删记录再改代码。删掉之后,你无法判断重复是偶发还是持续,也无法评估修复是否真的生效。更稳妥的做法是先冻结:把当前上报的原始日志、转化时间、事件标识和来源参数完整留存一份,作为修复前基线。
判断是否该冻结,看两个条件:
冻结动作本身会带来一个结果:你手上有了可用于对比的旧样本,后续修复后的数据才有参照。若跳过这一步,修复后只能看到“变少了”,却说不清少的是重复还是真实转化。
是否保留修复前的重复记录,取决于重复的性质,而不是取决于数据量大小。
这种情况下,重复记录里只有一条对应真实用户行为,其余是噪声。选择是保留原始记录、另做去重视图,而不是物理删除。保留的价值在于:你能回看重复发生的时间段,确认是否与某次投放调整或页面改版重合。实施动作是给这批记录打上“修复前-含重复”标记,后续报表引用去重视图,原始层不动。
这种情况常见于边修边测:旧链路还没下线,新链路已经上线,同一个转化被两套逻辑各记一次。此时选择是按时间切分,而不是按去重合并。修复前时段用旧口径,修复后时段用新口径,中间切换点单独标注。若强行合并成一个口径,切换点附近的转化数会既不是旧值也不是新值,无法解释。
一个注明假设的短例子:假设某账户每天约 20 条转化记录,修复当天新旧链路并行,出现 35 条。若直接按 35 条入报表,会高估当天效果;若直接删到 20 条,又抹掉了修复动作的痕迹。合理做法是保留 35 条原始记录,标注其中约 15 条为并行期重复,报表引用时按切换点分段呈现。
光靠时间戳区分不够,因为修复可能跨天、跨批次。需要在上报数据里加一个可区分的字段,常见做法是加版本标记或链路标记,例如 report_version=pre_fix 与 report_version=post_fix。这个字段不参与去重判断,只用于筛选和回溯。
标记动作会直接影响下一步:当你要对比修复效果时,可以只取 post_fix 且经过去重的数据,与 pre_fix 去重后的基线比较。若没有这个字段,任何对比都只能靠人工猜时间段,结论不可复用。
例外情况:如果重复触发已经持续很久,且历史记录没有可加字段的位置,那么退而求其次,用外部对照表记录“某日期起切换口径”,并在报表里注明。这不如字段标记精确,但比直接覆盖强。
修复上线后,不要立刻用新数据替换旧报表。先做一次验证:在相同投放条件下,观察一个完整周期内转化事件是否仍成对出现。验证通过后,再决定是否回填历史数据。
回填的取舍是:回填能让趋势连续,但会掩盖修复动作本身。如果团队需要复盘“修复到底改变了什么”,就不回填,保留断点;如果只需要一条干净的趋势线,可以回填,但必须在数据说明里写明回填规则和假设。
无论是否回填,都要保留一份未修改的原始层。这样当有人质疑某个时间段的转化数时,你能拿出修复前后的两套记录,而不是只有一个已经加工过的结果。修复动作的最终价值,不是让数字变好看,而是让下一次遇到同类问题时,你知道该先冻结什么、该保留什么。