GTM多域名场景下如何捕获用户首次访问的域名?
跨域名追踪用户首次访问站点的解决方案
核心问题分析
- 会话级自定义维度会随每次页面浏览更新,无法保留用户首次访问的站点值
- 你之前写的自定义JS变量里,
var originSite是函数内的局部变量,每次GTM解析变量时都会重新声明,根本无法跨页面、跨域名持久化存储值 - 跨域会话未正确识别,导致你设置的"仅会话触发一次"的数据层推送在每个域名的首次浏览都重复触发
具体解决方案
方案1:LocalStorage持久化+用户级自定义维度(推荐)
利用浏览器LocalStorage存储用户首次访问的站点,结合用户级变量绑定到用户身份,跨域名有效:
- 在GA(UA/GA4)后台创建用户级自定义维度(比如命名为「初始访问站点」),记录好对应的维度索引
- 在GTM中创建自定义JavaScript变量,代码如下:
function() { // 先从LocalStorage读取已存储的初始站点 const storedOrigin = localStorage.getItem('originSite'); if (storedOrigin) { return storedOrigin; } // 没有存储的话,获取当前主机名并存入LocalStorage const currentHost = {{Page Hostname}}; localStorage.setItem('originSite', currentHost); return currentHost; }
- 创建GA标签(UA或GA4),将上述变量值映射到你配置的用户级自定义维度上,触发器设置为「所有页面 - 页面视图」即可
- 确保跨域配置正确:
- GA4:后台启用「跨域测量」,添加所有6个域名到跨域列表;GTM的GA4标签勾选「启用跨域链接器」
- UA:后台将所有域名加入「引荐排除列表」;GTM的UA标签勾选「启用跨域链接器」,链接器域名匹配模式设为「自动」
方案2:会话存储+数据层推送
如果不想用LocalStorage,可以借助会话存储(SessionStorage)+数据层传递值:
- 创建自定义HTML标签,代码如下:
<script> const storedOrigin = sessionStorage.getItem('crossDomainOrigin'); if (storedOrigin) { window.dataLayer.push({ 'event': 'originSiteLoaded', 'originSite': storedOrigin }); } else { const currentHost = window.location.hostname; sessionStorage.setItem('crossDomainOrigin', currentHost); window.dataLayer.push({ 'event': 'originSiteSet', 'originSite': currentHost }); } </script>
- 给这个标签设置「所有页面 - 页面视图」触发器
- 创建数据层变量
originSite,用来读取数据层中的对应值 - 必须确保跨域跳转时携带GA链接器参数,否则SessionStorage无法跨域名共享(GTM的跨域链接器配置要覆盖所有6个域名)
方案3:GA4用户属性(仅适用于GA4)
利用GA4的用户属性持久化存储初始站点:
- 同方案1的自定义JS变量(用LocalStorage存储初始值)
- 创建GA4「用户属性设置」标签,将变量值作为用户属性(比如
origin_site),触发器设置为「首次访问」,确保只给用户设置一次 - 配置GA4跨域测量,确保跨域名时用户身份被正确识别
关键注意事项
- 所有域名必须使用同一个GTM容器ID,跨域配置要完全一致
- 测试时用无痕模式,避免浏览器缓存或已有存储干扰结果
- 若用户清除浏览器存储,初始站点值会丢失,这属于正常用户行为
- 跨域名跳转的链接必须是GA自动添加链接器参数的链接,或者手动携带
_gl参数,否则会话无法延续
内容的提问来源于stack exchange,提问作者Kevin Wood
相关产品推荐
相关产品推荐

