电商风控新盲区:行为分析断层致92%转化流失
|
崩在真机那一刻——你猜怎么着?用户点提交,页面白屏,但埋点根本没发出去。连个 error log 都没有,就安静得像我昨天关掉的那台显示器。 我原以为是热更新把缓存搞乱了,结果切回上个 tag 重打包,构建进度条卡在百分之八十七。李工蹲我旁边盯了三分钟,突然说“你这 node_modules 是不是又用 pnpm link 过头了”,我没理他,因为水杯底结了一圈渍,我正拿纸巾刮它,刮下来半片茶渍像地图轮廓。 去年八月。风控团队拉着我们做灰度,说新策略要覆盖所有转化漏斗。结果上线第二天,后端小陈直接冲到工位上,举着手机录像:同一台 iPhone 13,Safari 点加购→跳转结算页→点击提交,三步,前两步有行为日志,第三步连 DOM 都没渲染完就白屏了。我截图给他看控制台,空的。他不信,又跑去找测试妹复现——她用的是红米 Note 12,同样操作,埋点全了,连点击坐标都准得离谱。 你记得那个新版优惠券弹窗吗?就是点“立即领取”之后、还没进结算页之前弹出来的那个。设计稿里要求点击区域必须覆盖整个卡片,但我们为了防误触加了 300ms 延迟,结果埋点上报时机被压到了 setTimeout 里。而风控那边的规则引擎,只认同步触发的 click event ——你信不信?他们居然把 delay 300 当成用户犹豫,当成高风险行为打标。我们联调的时候谁都没提这事,因为接口文档里写的是“事件上报时间 ≤50ms”,可没人写清楚是哪个时间:冒泡时间?绑定时间?还是你手动 dispatch 的时间? 机箱风扇一直在转。嗡嗡的,像后台一直跑着的 logrotate 脚本。我调过样式——你说半句我就懂。你刚说“点击没上报”,我马上知道是你把 event.preventDefault() 放错位置了,还是你在 Vue 的 v-on:click.native 里混用了 @click.prevent;但你说“行为分析断层”,我第一反应是埋点 SDK 没挂载成功,第二反应是你们前端把 window.onerror 和 Promise.reject 拦得太死,连上报失败都吞掉了。结果呢?都不是。是风控侧根本没接你们上报的 custom event 类型,只认 click/mousedown/input/change。你们切图还原度做到 99.7%,但行为字段的 key 名从 coupon_click 改成 couponTap,他们没改 schema,直接丢弃。 外卖的塑料袋响个不停,隔壁老张开外放会议,说“这个需求下周一必须上线”。我盯着控制台刷新五次,每次 console.log(document.querySelector('.submit-btn')) 都是 null——可按钮明明在页面上。后来发现是 CSS 的 display:none 触发了回流重绘,但按钮父级用了 will-change: transform,导致 Chrome 在某些真机下不触发 layout,DOM 树里它还在,但 getBoundingClientRect() 返回空对象。我们修复了,但修复那天,风控已经拉出一份报告:92% 的转化流失,发生在“提交按钮可见但无行为上报”的用户群。他们叫它“静默放弃”。 我跟风控王姐吵过一回。她说:“你们前端只要把行为时间戳对齐服务器时钟就行。”我说:“我们连客户端时钟偏差都校正了,可你们规则引擎取的是 nginx access_log 里的 $time_local,和前端 Date.now() 差 187ms,中间还隔着两次 CDN 缓存和一次服务端日志采样延迟。”她摆手,“那不重要。”——我当场笑了,她真觉得不重要。后来我查了下,那个 92%,是他们在 7 天灰度期内,把“无 click 行为但订单创建成功”的样本剔除后算的。剔除理由是:“无法归因”。 桌上的数据线缠成一团,我扯了三次才分出 USB-C 那根。你肯定也这样——插了八根线,拔哪根都不确定会不会把 Jenkins 的 WebHook 断了。前天运维老周过来巡检,看见我显示器角落挂着一个自写的 log tail 工具,问他能不能帮我看一眼 Kafka 消费 lag,他摇头,“别碰,那是风控实时流的 Topic,配了 ACL,你账号没权限。” 我说“我就看看 offset”,他说“不行,审计日志会记。” 优胜劣汰站得住?当然站得住。不是算法淘汰人,是行为链条里断掉的任意一环,自然淘汰掉那些没留痕的转化。就像上次那个 iOS Safari 白屏,不是 bug,是 Safari 对 Promise.allSettled() 的 polyfill 不兼容我们那个旧版 core-js ——但风控系统不管这个,它只看到“用户在结算页停留 4 秒后离开”,就判定为“犹豫型放弃”。我们补了 polyfill,他们没改标签体系。所以现在所有 iOS 用户,都进了“需人工复核池”。至于为什么安卓没事?因为安卓 WebView 用的是系统级 V8,版本比我们锁的 core-js 还新。
文章配图,仅供参考 张工刚端着保温杯路过,往我屏幕上扫了一眼,“哦,又在看 log?” 我点头,他拧开杯盖吹了口气,“我听说你们那个风控流,最近开始抽样过滤低频事件了?” 我说“嗯”,他补了句:“那你留意下,他们是不是把 event_id 做了哈希截断——我上周看到他们 ES 的 _id 字段,前缀全是 hash-3e2a……” 我愣了三秒,没接话。因为浏览器开了三十来个标签,其中 12 个是不同环境的风控后台,每个标签右上角都挂着一个小红点,但我点开哪个,它都自动跳转到登录页。这事现在卡在产品那边。她说要等下个迭代排期,先统一埋点规范。但你知道的,上个“统一规范”落地是在前年十二月,那时候我们还用着 Vue 2 + webpack 4,连 vite 都没试过。我现在只打算明天上午把那段 polyfill 打包进 runtime.js,再加个 try-catch 把上报失败的 event 对象 console.warn 出来——至少让下次复现的时候,我能看清它到底卡在哪一行。 (编辑:52站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |



