GA4通过Measurement Protocol追踪购买时来源/媒介显示“未设置”
问题背景
我正尝试用Measurement Protocol API给GA4发送购买数据,转化数据能正常显示,但几乎所有交易额都被标记为来源/媒介“未设置”,导致谷歌广告里完全看不到转化数据。已经通过/debug/mp/collect调试请求,没发现任何验证错误,不知道该从哪继续排查。
请求详情
请求URL:
https://www.google-analytics.com/mp/collect?measurement_id=G-xxxxxxxxxx&api_secret=xxxxxxxxxxxxxxxxxxxxxx
请求体(PHP数组格式):
array(4) { ["client_id"]=> string(20) "123456789.1691234567" ["non_personalized_ads"]=> bool(true) ["events"]=> array(1) { [0]=> array(2) { ["name"]=> string(8) "purchase" ["params"]=> array(12) { ["currency"]=> string(3) "EUR" ["transaction_id"]=> string(16) "123456" ["shipping"]=> float(6.9) ["tax"]=> float(4.81) ["value"]=> float(30.14) ["items"]=> array(1) { [0]=> array(6) { ["item_id"]=> string(11) "654321" ["item_name"]=> string(36) "Test-Item" ["item_brand"]=> string(9) "Test-Brand" ["price"]=> float(23.24) ["quantity"]=> float(1) } } ["engagement_time_msec"]=> int(1) ["session_id"]=> string(10) "1697002512" } } } ["timestamp_micros"]=> int(1697002689740112) }
Cookie提取逻辑
- client_id从
_gaCookie提取:_ga=GA1.1.123456789.1691234567→ client_id =123456789.1691234567 - session_id从
_ga_[MeasurementId]Cookie提取:_ga_xxxxxxxxxx=GS1.1.1697002512.2.1.1697001234.45.0.0→ session_id =1697002512
用户此前已通过gtag.js与页面交互,所有Cookie均由gtag.js自动设置。
排查方向
1. 缺少会话来源核心参数
GA4的来源/媒介信息并非仅靠session_id关联,需要在请求中主动传递以下参数:
source:流量来源(如google)medium:流量媒介(如cpc)campaign:广告系列名称(可选)term:关键词(可选)content:广告内容(可选)
这些参数可以从_ga_[MeasurementId] Cookie的后续字段解析,或者直接从页面的gtag数据层中获取(比如页面触发购买事件时,dataLayer里已携带的来源信息)。
2. 会话时间范围不匹配
确认timestamp_micros的时间在用户会话有效期内。GA4默认会话超时规则是:30分钟无交互自动结束,或24小时内有交互则延续。如果购买事件的时间超出了原始会话的有效期,GA4会创建新会话,导致来源信息丢失。
3. 未传递谷歌广告点击ID(gclid)
如果用户来自谷歌广告,必须在请求中添加gclid参数。该参数可从_gcl_au Cookie提取,或直接从用户访问页面的URL的gclid参数获取。没有gclid,GA4无法将转化归因到谷歌广告。
4. 验证原始会话的来源数据
用GA4的用户探索功能,查询该client_id的会话记录,确认用户原始会话本身是否有来源/媒介信息。如果原始会话就没有来源数据,MP请求也无法补充。
5. 检查会话关联的完整性
确保client_id和session_id的提取完全正确,比如_ga Cookie的格式是否为GA1.N.xxxxxx.xxxxxx,提取时不要遗漏任何部分;_ga_[MeasurementId] Cookie中的session_id字段位置是否正确(GS1.1.后的第一个数字段)。
内容的提问来源于stack exchange,提问作者Werner

