💡 빅쿼리에서 전환 이벤트를 조회할 때, 유입 시점 검색어는 조회되지 않는 경우가 있습니다. 이 때는 유저 수도 아이디 (user-pseudo-id)를 기준으로 유입 이벤트와 전환 이벤트를 조인해야 합니다.
contents
1. 빅쿼리 전환 이벤트 조회하기
1) 전환 이벤트 조회 쿼리 실행
지난 포스팅에서 사용한 쿼리를 다시 실행해 보겠습니다.
SELECT
FORMAT_TIMESTAMP('%Y-%m-%d %H:%M:%S', TIMESTAMP_MICROS(event_timestamp) + INTERVAL 9 HOUR) AS korean_event_timestamp,
event_name,
traffic_source.source,
traffic_source.medium,
traffic_source.name,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'content') AS content,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'term') AS term,
user_pseudo_id
FROM
`project.dataset.table`
WHERE
event_name = '전환체크'
ORDER BY
korean_event_timestamp DESC
LIMIT 1000;
테이블 영역은 실제 테이블 명을 써야 합니다. 자세한 설명은 지난 포스팅을 참고해 주세요.

콘텐츠와 검색어가 null로 나오고 있습니다. 유저 수도 ID는 남아 있으니, 이 ID가 유입되었을 시점의 콘텐츠와 키워드를 불러오도록 하겠습니다.
유저 수도 ID가 궁금하시다면 아래 외부 링크를 확인해 주세요.
2) 빅쿼리 이벤트 조인 쿼리 만들기
다음 쿼리를 실행해 주세요.
WITH key_events AS (
SELECT
user_pseudo_id,
FORMAT_TIMESTAMP('%Y-%m-%d %H:%M:%S', TIMESTAMP_MICROS(event_timestamp) + INTERVAL 9 HOUR) AS korean_event_timestamp,
traffic_source.source,
traffic_source.medium,
traffic_source.name,
event_timestamp AS event_timestamp
FROM
`project.dataset.table.events_*`
WHERE
event_name = '전환체크'
),
session_events AS (
SELECT
user_pseudo_id,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'content') AS content,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'term') AS term,
event_timestamp AS session_event_timestamp
FROM
`project.dataset.table.events_*`
WHERE
event_name = 'session_start'
),
ranked_sessions AS (
SELECT
se.user_pseudo_id,
se.content,
se.term,
se.session_event_timestamp,
ke.event_timestamp AS key_event_timestamp,
ROW_NUMBER() OVER (PARTITION BY ke.user_pseudo_id, ke.event_timestamp ORDER BY se.session_event_timestamp ASC) AS row_num
FROM
key_events ke
LEFT JOIN
session_events se
ON
ke.user_pseudo_id = se.user_pseudo_id
AND
se.session_event_timestamp <= ke.event_timestamp
)
SELECT
ke.korean_event_timestamp,
ke.source,
ke.medium,
ke.name,
rs.content,
rs.term,
ke.user_pseudo_id,
'key events' AS event_name
FROM
key_events ke
LEFT JOIN
ranked_sessions rs
ON
ke.user_pseudo_id = rs.user_pseudo_id
AND
ke.event_timestamp = rs.key_event_timestamp
AND
rs.row_num = 1
ORDER BY
ke.korean_event_timestamp DESC
LIMIT 1000;
*테이블 영역은 실제 빅쿼리 테이블 명을 써야 합니다.
**전환체크에는 여러분이 추적하고 싶은 전환 이벤트 명을 써야 합니다.

이번에는 빅쿼리 전환체크 이벤트와 연결되는 콘텐츠와 키워드가 조회되고 있습니다.
그러면 각 쿼리 영역을 분석해 보겠습니다.
2. 이벤트 조인 쿼리 분석하기
1) Common Table Expressions (CTEs)
WITH key_events AS (
SELECT
user_pseudo_id,
FORMAT_TIMESTAMP('%Y-%m-%d %H:%M:%S', TIMESTAMP_MICROS(event_timestamp) + INTERVAL 9 HOUR) AS korean_event_timestamp,
traffic_source.source,
traffic_source.medium,
traffic_source.name,
event_timestamp AS event_timestamp
FROM
`project.dataset.table.events_*`
WHERE
event_name = '전환체크'
),
session_events AS (
SELECT
user_pseudo_id,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'content') AS content,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'term') AS term,
event_timestamp AS session_event_timestamp
FROM
`project.dataset.table.events_*`
WHERE
event_name = 'session_start'
),
ranked_sessions AS (
SELECT
se.user_pseudo_id,
se.content,
se.term,
se.session_event_timestamp,
ke.event_timestamp AS key_event_timestamp,
ROW_NUMBER() OVER (PARTITION BY ke.user_pseudo_id, ke.event_timestamp ORDER BY se.session_event_timestamp ASC) AS row_num
FROM
key_events ke
LEFT JOIN
session_events se
ON
ke.user_pseudo_id = se.user_pseudo_id
AND
se.session_event_timestamp <= ke.event_timestamp
)
key_events:
- events_*라는 패턴을 가진 여러 테이블에서 데이터를 쿼리합니다.
- 이벤트 이름이 ‘전환체크’인 데이터만 추출합니다.
- user_pseudo_id: user_pseudo_id를 선택합니다.
- FORMAT_TIMESTAMP: 타임스탬프를 한국 시간대로 변환합니다.
- traffic_source: 소스, 매체, 이름(캠페인)을 선택합니다.
- event_timestamp: 이벤트 타임스탬프를 선택합니다.
session_events:
- events_*라는 패턴을 가진 여러 테이블에서 데이터를 쿼리합니다.
- 이벤트 이름이 ‘session_start’인 데이터만 추출합니다.
- user_pseudo_id: user_pseudo_id를 선택합니다.
- content: 콘텐츠 값을 선택합니다.
- term: 검색어 값을 선택합니다.
- event_timestamp: 세션 이벤트 타임스탬프를 선택합니다.
ranked_sessions:
- key_events와 session_events CTEs를 조인하여 세션 이벤트가 전환 이벤트보다 이전인 순서로 랭크를 매깁니다.
- user_pseudo_id: user_pseudo_id를 선택합니다.
- content: 콘텐츠 값을 선택합니다.
- term: 검색어 값을 선택합니다.
- session_event_timestamp: 세션 이벤트 타임스탬프를 선택합니다.
- key_event_timestamp: 전환 이벤트 타임스탬프를 선택합니다.
- ROW_NUMBER(): 각 사용자와 전환 이벤트 타임스탬프를 기준으로 세션 이벤트 순위를 매깁니다.
2) Main Query
SELECT
ke.korean_event_timestamp,
ke.source,
ke.medium,
ke.name,
rs.content,
rs.term,
ke.user_pseudo_id,
'key events' AS event_name
FROM
key_events ke
LEFT JOIN
ranked_sessions rs
ON
ke.user_pseudo_id = rs.user_pseudo_id
AND
ke.event_timestamp = rs.key_event_timestamp
AND
rs.row_num = 1
ORDER BY
ke.korean_event_timestamp DESC
LIMIT 1000;
SELECT 절:
- ke.korean_event_timestamp: 한국 시간대로 변환된 전환 이벤트 타임스탬프를 선택합니다.
- ke.source, ke.medium, ke.name: 소스, 매체, 이름(캠페인)을 선택합니다.
- rs.content, rs.term: 세션 이벤트의 콘텐츠와 검색어 값을 선택합니다.
- ke.user_pseudo_id: user_pseudo_id를 선택합니다.
- ‘key events’ AS event_name: 이벤트 이름을 ‘key events’로 지정합니다.
FROM 절:
- key_events CTE와 ranked_sessions CTE를 조인합니다.
- ON 절에서 user_pseudo_id와 전환 이벤트 타임스탬프를 기준으로 조인합니다.
- rs.row_num = 1: 가장 빠른 세션 이벤트만 선택합니다. (세션 이벤트가 여러개인 경우를 제외하기 위해서)
ORDER BY 절:
- ke.korean_event_timestamp DESC: 한국 시간대로 변환된 전환 이벤트 타임스탬프를 내림차순으로 정렬합니다.
LIMIT 절:
- 최대 1000개의 결과만 반환합니다.
마무리
이번 포스팅에서는 빅쿼리(Big Query)에서 유저 수도 ID (user pseudo id)를 기준으로 전환 이벤트와 세션 이벤트를 조인해서 유입 당시 콘텐츠와 키워드를 추적하는 방식을 알아보았습니다.
감사합니다.
안녕하세요, 궁금한 점이 있어서 질문 남깁니다.
특정 콘텐츠의 유입 키워드가 무엇인지 알고 싶어서 Google Search Console을 활용하고 있는데요. 정확한 데이터값이 나오지 않는 것 같아, Google Analytics4를 함께 활용하려고 하고 있습니다.
하지만 아무리 찾아봐도 GA4로는 특정 콘텐츠의 유입 키워드를 알 수 없다고 하는데요.
위에서 말씀하신 방법대로 Big Query를 활용하면 ①콘텐츠별로 유입 키워드를 확인할 수 있는지, ②전환 이벤트가 일어난 콘텐츠의 유입 키워드를 알 수 있는지 궁금합니다.
위 방법은 GA4의 데이터를 빅쿼리에서 분석하는 방법이기에, GA4에서 잡히지 않는 키워드는 확인할 수 없습니다.
GA4에서 특정 키워드가 추적되지 않는 이유 중 대표적인 것은
1) not provided: 개인 정보 보호를 위해 쿼리를 제공하지 않는 경우 (구글 등 해외 검색 플랫폼 대다수)
2) not set: 검색어가 없는 경우 (배너, 리퍼러 유입인 경우 등)
등이 있습니다.