如何从BigQuery提取GA4会话级流量而非用户获取流量
GA4 BigQuery 会话级流量来源提取方案
GA4默认BigQuery导出的traffic_source字段组为用户首次获客维度属性,仅解析page_location全链路UTM参数无法和官方报表对齐,核心原因是GA4会话流量判定有固定逻辑,并非全链路取UTM值。以下是可直接落地的实现方案,完全匹配会话级、用户首次来源分维度统计需求:
方案1:优先使用原生会话流量字段(匹配度99%+,推荐)
2022年底后创建的GA4 BQ导出,所有事件级表都自带collected_traffic_source字段组,该字段存储事件触发时的实时流量来源,不属于用户固定属性,是提取会话级流量的最优选择。
- 会话唯一标识用
user_pseudo_id + ga_session_id(ga_session_id从event_params中取) - 按会话维度聚合,取会话内时间最早的事件对应的
collected_traffic_source下的manual_source/manual_medium/manual_campaign值,即为本次会话的流量来源 - 字段会自动解析Google Ads/AdWords的gclid、其他平台自动标记参数,不需要额外做映射
- 用户首次获客来源直接取用户维度最早事件的
traffic_source.source/traffic_source.medium即可,和会话字段互不干扰
参考SQL实现:
WITH event_with_session_id AS ( SELECT user_pseudo_id, event_timestamp, (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS session_id, collected_traffic_source, -- 取用户全生命周期最早的流量来源作为首次获客来源 FIRST_VALUE(traffic_source.source) OVER (PARTITION BY user_pseudo_id ORDER BY event_timestamp ASC) AS first_acquisition_source, FIRST_VALUE(traffic_source.medium) OVER (PARTITION BY user_pseudo_id ORDER BY event_timestamp ASC) AS first_acquisition_medium FROM `你的GCP项目ID.GA4数据集名.events_*` WHERE _TABLE_SUFFIX BETWEEN '20230101' AND FORMAT_DATE('%Y%m%d', CURRENT_DATE()) ), session_with_traffic AS ( SELECT user_pseudo_id, session_id, first_acquisition_source, first_acquisition_medium, -- 取单会话最早事件的流量来源作为会话来源 FIRST_VALUE(collected_traffic_source.manual_source IGNORE NULLS) OVER (PARTITION BY user_pseudo_id, session_id ORDER BY event_timestamp ASC) AS session_source, FIRST_VALUE(collected_traffic_source.manual_medium IGNORE NULLS) OVER (PARTITION BY user_pseudo_id, session_id ORDER BY event_timestamp ASC) AS session_medium, FIRST_VALUE(collected_traffic_source.manual_campaign IGNORE NULLS) OVER (PARTITION BY user_pseudo_id, session_id ORDER BY event_timestamp ASC) AS session_campaign FROM event_with_session_id WHERE session_id IS NOT NULL ) SELECT DISTINCT * FROM session_with_traffic
运行后即可匹配业务场景需求:用户首次从email到访,后续从google到访的会话,first_acquisition_source为email,session_source为google。
方案2:历史旧导出兼容方案
如果是2023年之前的历史导出表没有collected_traffic_source字段,按以下逻辑处理即可对齐官方报表:
- 不要解析会话内所有
page_location的UTM参数,仅提取每个会话第一个事件(即session_start事件)对应的page_location中的UTM参数 - 额外识别自动标记参数:存在gclid则映射source=google、medium=cpc;存在fbclid则映射source=facebook、medium=cpc,无UTM无自动标记的流量归为direct
- 该方案和官方报表匹配度约95%,仅在跨域跳转、UTM参数丢失场景下存在少量误差
方案3:官方归因结果直接导出
如果需要对齐GA4后台的非最后点击、数据驱动等自定义归因模型的统计结果,不需要自行计算归因逻辑:
- 进入GA4后台BigQuery导出设置页,开启「会话归因数据导出」开关
- 导出完成后会生成独立的会话归因表,表内已经预置了GA4官方计算的各归因模型下的来源、媒介、活动字段,直接查询即可
常见避坑提示
- 不要直接用根级
traffic_source字段做会话统计,该字段属于用户属性,只要用户不清除浏览器缓存、不更换设备,后续所有访问该字段值都不会更新,仅适合做首次获客维度统计 - 会话流量判定仅参考会话第一个命中的落地页参数,会话内页面跳转带的UTM参数不会覆盖当前会话的来源属性,这也是之前全链路解析
page_location结果不对齐的核心原因
内容的提问来源于stack exchange,提问作者Tom Wu
相关产品推荐
相关产品推荐

