GTM 里配了加购触发器,预览模式能看到事件,正式环境报表里一条 add_to_cart 都没有。翻页面源码,GTM 片段下面还有一行 var dataLayer = [];。乍看像缓存或者权限的锅,追下去往往不是。
window.dataLayer = window.dataLayer || [];
// 删掉这种二次声明
// var dataLayer = [];
dataLayer.push({ event: 'add_to_cart', value: 99 });
追下去是这么回事:dataLayer 本质是一个普通数组,容器初始化时会把已有内容当历史事件读一遍,后面再执行 var dataLayer = [] 就换成了新数组,之前 push 的对象和 gtm.js 的引用一起断掉。事件不是没触发,是发去了一个没人读的数组。
「dataLayer 被重置」这类改动最怕改一半,回滚脚本先准备好,再动生产。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
具体做法是,删掉页面里第二次声明的 dataLayer,只在 head 最前面保留 window.dataLayer = window.dataLayer || [];把业务事件 push 写在 GTM 片段之后,别在它前面另起一个数组;用 Tag Assistant 连正式环境,看事件是否真的进入容器。
验收就看一点,Tag Assistant 里能看到 add_to_cart,报表十分钟内出现对应事件,数量与加购次数一致。
