通过GTM部署GA4时,如何获取和设置client_id与session_id?
GTM环境下GA4手动跨域跟踪实现方案
一、获取Client ID和Session ID(源站点GTM配置)
由于全局gtag对象不可用,需通过GTM自定义变量提取GA4的会话标识:
创建自定义JavaScript变量(提取Client ID)
在GTM中新建自定义JS变量,代码如下:function() { // 尝试从GA跟踪器实例获取 if (window.ga && window.ga.getAll) { const trackers = window.ga.getAll(); for (let tracker of trackers) { if (tracker.get('trackingId') === '你的GA4测量ID') { return tracker.get('clientId'); } } } // 从dataLayer提取(适用于GTM隔离模式) const dataLayer = window.dataLayer || []; for (let item of dataLayer) { if (item.ga4?.client_id) return item.ga4.client_id; } return null; }创建自定义JavaScript变量(提取Session ID)
同理,新建自定义JS变量提取Session ID:function() { if (typeof gtag !== 'undefined') { let sessionId = null; gtag('get', '你的GA4测量ID', 'session_id', function(id) { sessionId = id; }); return sessionId; } // 备用:从dataLayer提取 const dataLayer = window.dataLayer || []; for (let item of dataLayer) { if (item.ga4?.session_id) return item.ga4.session_id; } return null; }
二、手动拼接跨域链接参数(源站点GTM配置)
给所有跨域跳转的链接添加client_id和session_id参数:
创建点击触发器
新建触发器,触发条件为:- 触发类型:
点击 - 所有元素 - 触发条件:
点击的链接 URL 不包含 {{主机名}}
- 触发类型:
创建自定义HTML标签
新建自定义HTML标签,绑定上述触发器,代码如下:<script> document.addEventListener('click', function(e) { const link = e.target.closest('a'); if (!link || link.hostname === window.location.hostname) return; const clientId = {{GA4 Client ID变量名}}; const sessionId = {{GA4 Session ID变量名}}; if (!clientId || !sessionId) return; const url = new URL(link.href); url.searchParams.set('client_id', clientId); url.searchParams.set('session_id', sessionId); link.href = url.toString(); }, true); </script>注:如果存在表单提交、
window.open等非链接跳转场景,需额外添加对应触发器和处理逻辑。
三、目标站点接收并设置会话(目标站点GTM配置)
在目标站点的GTM中提取参数并绑定GA4会话:
创建URL查询参数变量
分别新建两个URL查询参数变量:- 变量名:
GA4 Client ID(来自跨域),参数名:client_id - 变量名:
GA4 Session ID(来自跨域),参数名:session_id
- 变量名:
修改GA4配置标签
找到目标站点的GA4配置标签,在字段设置中添加:- 字段名:
client_id,值:{{GA4 Client ID(来自跨域)}} - 字段名:
session_id,值:{{GA4 Session ID(来自跨域)}}
注:需确保仅当URL中存在对应参数时才应用该设置,可通过触发器条件限制(如{{GA4 Client ID(来自跨域)}} 不为空)。
- 字段名:
四、验证与调试
- 使用GA4实时报告查看跨域访问是否被标记为同一用户会话
- 通过GTM预览模式检查变量值是否正确提取、链接参数是否成功拼接
内容的提问来源于stack exchange,提问作者Ben Murden
相关产品推荐
相关产品推荐

