GA4 BigQuery 캠페인별 세션 분석하는 법
- 세션 시작 이벤트에서 사용자 ID와
ga_session_id를 조합해 고유 세션을 셉니다. traffic_source,collected_traffic_source,session_traffic_source_last_click은 서로 다른 범위의 유입 정보를 담습니다.- 일일 테이블의 갱신 기간과 속성 시간대를 확인한 뒤 결과를 해석합니다.
GA4 BigQuery 내보내기 데이터에서 캠페인별 세션을 분석하려면 세션을 식별할 키와 분석에 쓸 유입 기준을 먼저 정해야 합니다. 아래 예시는 session_start 행의 세션 마지막 클릭 수동 캠페인 정보를 사용해 캠페인·소스·매체별 세션 수를 집계합니다. 프로젝트, 데이터세트, 날짜 범위를 실제 값으로 바꿔 실행하세요.
먼저 구분할 세 가지 유입 필드

GA4 BigQuery 내보내기 데이터는 이벤트별 행과 중첩된 레코드로 구성됩니다. 이름이 비슷한 유입 필드라도 집계 범위가 다르므로, 분석 목적에 맞는 기준을 골라야 합니다.
traffic_source: 사용자를 처음 획득한 소스·매체·캠페인 정보입니다. 이후 방문의 캠페인 성과를 나타내는 세션 필드가 아닙니다.collected_traffic_source: 각 이벤트에서 수집된 유입 정보입니다. UTM 값과 추천 매개변수에서 파싱된 값 등이 포함될 수 있습니다.session_traffic_source_last_click: 사용 가능한 경우 Google Ads와 수동 캠페인 맥락의 세션 마지막 클릭 기여 정보를 담습니다.
이 글의 쿼리는 세션 기여 캠페인을 살펴보기 위해 session_traffic_source_last_click.manual_campaign의 캠페인·소스·매체를 사용합니다. 수집 이벤트에 함께 전달된 UTM 값을 살펴보려는 목적이라면 collected_traffic_source를 검토하세요. GA4의 필드 정의는 BigQuery Export 스키마 공식 문서에서 확인할 수 있습니다.
캠페인별 세션 수를 구하는 SQL

다음 쿼리는 지정한 날짜에 시작한 세션을 세션 마지막 클릭 수동 캠페인의 이름·소스·매체별로 집계합니다. ga_session_id는 반복 레코드인 event_params에서 가져오며, 사용자 ID와 함께 고유 세션 키로 사용합니다. 캠페인 값이 없는 세션도 결과에 남도록 (not set)으로 표시합니다.
SELECT
COALESCE(session_traffic_source_last_click.manual_campaign.campaign_name, '(not set)') AS campaign,
COALESCE(session_traffic_source_last_click.manual_campaign.source, '(not set)') AS source,
COALESCE(session_traffic_source_last_click.manual_campaign.medium, '(not set)') AS medium,
COUNT(DISTINCT STRUCT(
user_pseudo_id,
(SELECT value.int_value
FROM UNNEST(event_params)
WHERE key = 'ga_session_id'
LIMIT 1)
)) AS sessions
FROM `프로젝트ID.analytics_속성ID.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20261001' AND '20261017'
AND event_name = 'session_start'
AND user_pseudo_id IS NOT NULL
AND (SELECT value.int_value
FROM UNNEST(event_params)
WHERE key = 'ga_session_id'
LIMIT 1) IS NOT NULL
GROUP BY campaign, source, medium
ORDER BY sessions DESC;
20261001과 20261017은 조회 기간 예시입니다. 원하는 날짜로 바꾸세요. _TABLE_SUFFIX 조건은 읽을 테이블 날짜 범위를 지정합니다. GA4의 이벤트 날짜는 속성에 설정된 시간대를 기준으로 하므로, 한국 시간 기준 보고 기간과 속성 시간대가 같은지도 확인하세요.
| 필드 또는 조건 | 역할 | 확인할 점 |
|---|---|---|
event_name |
세션 시작 이벤트 선택 | 일반 이벤트 행 수와 세션 수를 구분합니다. |
ga_session_id와 user_pseudo_id |
세션 식별 | 두 값을 조합해 세션을 구분합니다. |
session_traffic_source_last_click.manual_campaign |
세션 마지막 클릭 수동 캠페인 정보 | 내보내기 스키마와 분석 목적에 맞는 하위 필드를 선택합니다. |
_TABLE_SUFFIX |
조회 날짜 범위 | 속성 시간대에 맞는 날짜인지 확인합니다. |
핵심 기준: 세션 수는 이벤트 행 수와 다릅니다. GA4 세션은 사용자 ID와 세션 ID의 조합을 기준으로 식별할 수 있습니다.
실행 전 데이터 준비와 분석 절차

BigQuery 연동이 설정되어 있지 않다면 GA4 속성의 BigQuery 연결과 내보내기 설정부터 확인합니다. 일일 내보내기를 사용하면 events_YYYYMMDD 테이블이 생성됩니다. 스트리밍 내보내기를 사용하면 당일 데이터가 채워지는 events_intraday_YYYYMMDD 테이블도 생성됩니다. 내보내기 옵션과 데이터 갱신에 관한 자세한 내용은 BigQuery Export 공식 안내를 참고하세요.
1단계: 데이터세트와 날짜 테이블 확인
BigQuery 탐색기에서 연결된 프로젝트의 analytics_속성ID 데이터세트와 조회 기간에 해당하는 이벤트 테이블을 확인합니다. 마감 분석에는 일일 테이블을 기준으로 삼고, 당일 흐름을 빠르게 살펴볼 때는 스트리밍 테이블을 활용할 수 있습니다. 스트리밍 데이터는 수집 중인 데이터이므로 최종 수치로 확정하기 전에 일일 테이블을 다시 확인하세요.
2단계: 세션 시작 이벤트와 ID 확인
event_name = 'session_start'로 세션 시작 행을 고르고, event_params에서 ga_session_id를 추출합니다. 이벤트 매개변수는 반복 레코드이므로 UNNEST를 사용합니다. 사용자 ID 또는 세션 ID가 없는 행은 이 쿼리에서 식별 가능한 세션으로 계산하지 않습니다.
3단계: 세션 유입 기준을 선택
GA4 내보내기 스키마가 제공하는 경우 session_traffic_source_last_click에서 수동 캠페인 필드를 사용하면 세션 마지막 클릭의 캠페인·소스·매체별로 결과를 묶을 수 있습니다. 수집된 이벤트의 원본 유입 값을 분석하는 목적이라면 collected_traffic_source를 사용할 수 있지만, 이는 세션 마지막 클릭 기여 정보와 같은 기준이라고 단정할 수 없습니다. Google Ads 등 플랫폼별 성과를 구분하려면 해당 레코드의 플랫폼별 필드를 확인해 집계 기준을 정하세요.
4단계: 기간과 비교 기준을 고정
GA4 보고서와 비교할 때는 날짜, 시간대, 필터, 세션 기여 기준을 가능한 한 맞춥니다. BigQuery 내보내기 원시 이벤트와 GA4 보고서는 처리 및 보고 기준이 다를 수 있으므로 수치가 일치한다고 전제하지 마세요. 주간·월간 비교에서는 같은 날짜 기준과 캠페인 명명 규칙을 유지합니다.
누락값과 결과 차이를 해석하는 법

(not set)은 이 쿼리에서 선택한 세션 캠페인 필드에 값이 없다는 뜻입니다. 태깅 정보가 전달되지 않았거나, 세션 시작 이벤트가 누락되는 등 여러 상황에서 값이 비어 있을 수 있습니다. 원인을 확인하기 전에 이를 직접 유입이나 특정 매체로 재분류하지 말고 별도 값으로 두세요.
- 캠페인 이름의 대소문자와 공백이 다르면 같은 캠페인이 여러 행으로 나뉠 수 있습니다. 링크 제작 규칙을 일관되게 관리하세요.
- 세션 시작일을 기준으로 조회하므로 선택한 기간 밖에서 시작한 세션은 포함되지 않습니다. 이 결과는 세션 수 집계이며 전환 기여 분석과는 다릅니다.
- Google 안내에 따르면 일일 테이블은 늦게 도착한 이벤트를 반영해 이벤트 날짜 이후 최대 3일까지 업데이트될 수 있습니다. 마감 보고는 안정화된 뒤 다시 조회하세요.
- 스트리밍 테이블은 당일 이벤트가 계속 추가되는 데이터입니다. 일일 테이블과 같은 완전성으로 간주하지 말고, 확정 보고에는 일일 내보내기 상태를 확인하세요.
이 결과를 사용자 수나 구매 전환 수로 해석해서는 안 됩니다. 사용자 수를 구하려면 목적에 맞는 사용자 식별자를 별도로 집계하고, 전환을 캠페인에 귀속하려면 전환 이벤트와 기여 규칙을 따로 정해야 합니다. 세션 키와 세션 수 계산을 더 살펴보려면 BigQuery에서 GA4 세션 수 계산하는 SQL 방법을 참고할 수 있습니다.
주의:
traffic_source는 사용자를 처음 획득한 유입 정보입니다. 이를 현재 세션 캠페인으로 집계하면 분석 범위가 달라집니다.
자주 묻는 질문
Q. session_start 이벤트가 없으면 어떻게 하나요?
먼저 해당 날짜의 이벤트 이름과 ga_session_id, 사용자 ID가 있는지 확인합니다. GA4에서는 세션 시작 시 session_start 이벤트와 세션 ID가 생성되지만, 일부 상황에서는 이 이벤트에 세션 ID가 연결되지 않을 수 있습니다. 이런 행을 쿼리에서 어떻게 다룰지 정한 뒤 GA4 보고서와 비교할 때도 같은 범위인지 확인하세요.
Q. 캠페인 값이 (not set)으로 나오는 이유는 무엇인가요?
선택한 세션 캠페인 필드에 값이 없다는 의미입니다. 세션 시작 이벤트, 태깅과 수집 설정, 내보내기 스키마의 값을 확인하세요. 원인을 확인하기 전에는 빈 값을 다른 캠페인으로 바꾸지 않는 편이 안전합니다.
Q. traffic_source와 collected_traffic_source 중 무엇을 써야 하나요?
최초 사용자 획득 정보를 분석한다면 traffic_source, 이벤트에서 수집된 유입 데이터를 살펴보려면 collected_traffic_source를 검토합니다. 세션 마지막 클릭 캠페인 기준이 필요하면 스키마에서 제공하는 session_traffic_source_last_click을 확인하세요.
Q. intraday 테이블로 캠페인 성과를 확정해도 되나요?
당일 흐름을 모니터링하는 용도로는 사용할 수 있지만, 수집 중인 테이블을 최종 수치로 확정하지 마세요. 확정 보고에는 일일 테이블의 생성과 갱신 상태를 확인하고 필요한 경우 다시 조회하세요.
