지금까지 결과
가설 1
Device 문제 → 기각
가설 2
신규 유저 첫 구매 장벽 → 채택
가설
유입 채널 품질 차이 문제
- 유입 채널 품질 차이로 인해 Checkout 이후 Purchase 전환율 차이가 발생할 것이다
- 어떤 유입 채널이 구매 의도가 높은 유저를 데려오고, 어떤 채널이 낮은 품질의 유저를 데려오는가?
1. 사용 가능한 트래픽 소스 컬럼 확인
- source 값이 정상적으로 존재하는가?
- medium 값이 존재하는가?
- (not set) 비율이 과도하지 않은가?
- 세션 단위 분석이 가능한가?
-- STEP 1: 트래픽 소스 관련 컬럼 구조 확인
-- 목적:
-- source / medium / channel group 분석이 가능한지 확인한다.
SELECT
event_date,
-- 유입 소스
traffic_source.source AS source,
-- 유입 매체
traffic_source.medium AS medium,
-- 이벤트명
event_name,
-- 세션 ID
(
SELECT value.int_value
FROM UNNEST(event_params)
WHERE key = 'ga_session_id'
) AS ga_session_id
FROM
`bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`
WHERE
_TABLE_SUFFIX BETWEEN '20210101' AND '20210131'
LIMIT 100;
| 행 | event_date | source | medium | event_name | ga_session_id |
| 1 | 20210124 | organic | scroll | 521445891 | |
| 2 | 20210124 | organic | page_view | 521445891 | |
| 3 | 20210124 | organic | page_view | 521445891 | |
| 4 | 20210124 | organic | scroll | 521445891 | |
| 5 | 20210124 | organic | scroll | 521445891 | |
| 6 | 20210124 | organic | page_view | 521445891 | |
| 7 | 20210124 | organic | user_engagement | 521445891 | |
| 8 | 20210124 | organic | session_start | 521445891 | |
| 9 | 20210124 | organic | user_engagement | 521445891 | |
| 10 | 20210124 | organic | user_engagement | 521445891 |
2. Checkout / Purchase 이벤트 + source 추출
- source / medium이 begin_checkout / purchase 이벤트에 정상 연결되는가?
- not set 또는 null 데이터가 많은가?
- 분석 가능한 주요 채널이 존재하는가?
-- STEP 2: 분석 대상 이벤트와 source 추출
-- 목적:
-- begin_checkout / purchase 기준으로
-- 유입 채널별 구매 전환 분석 준비
SELECT
user_pseudo_id,
(
SELECT value.int_value
FROM UNNEST(event_params)
WHERE key = 'ga_session_id'
) AS ga_session_id,
traffic_source.source AS source,
traffic_source.medium AS medium,
event_name
FROM
`bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`
WHERE
_TABLE_SUFFIX BETWEEN '20210101' AND '20210131'
AND event_name IN ('begin_checkout', 'purchase')
LIMIT 100;
| 행 | user_pseudo_id | ga_session_id | source | medium | event_name |
| 1 | 1065673.072 | 8521814404 | <Other> | <Other> | begin_checkout |
| 2 | 1065673.072 | 8521814404 | <Other> | <Other> | begin_checkout |
| 3 | 1065673.072 | 8521814404 | <Other> | <Other> | begin_checkout |
| 4 | 4639994.023 | 6204967226 | (direct) | (none) | begin_checkout |
| 5 | 4639994.023 | 6204967226 | (direct) | (none) | begin_checkout |
| 6 | 4639994.023 | 6204967226 | (direct) | (none) | begin_checkout |
| 7 | 6097102.652 | 5991255 | cpc | purchase | |
| 8 | 6097102.652 | 5991255 | cpc | begin_checkout | |
| 9 | 6097102.652 | 5991255 | cpc | begin_checkout | |
| 10 | 6097102.652 | 5991255 | cpc | begin_checkout |
3. 세션 단위 source별 Checkout / Purchase 여부 생성
- source별 세션 구조가 정상 생성되었는가?
- 주요 source가 어떤 형태로 들어오는가?
- 세션 단위 purchase 여부가 정상 집계되는가?
-- STEP 3: 세션 단위 source별 결제 여부 정리
-- 목적:
-- source 기준으로 checkout / purchase 여부를 세션 단위로 정리한다.
WITH base AS (
SELECT
CONCAT(
user_pseudo_id,
'-',
CAST((
SELECT value.int_value
FROM UNNEST(event_params)
WHERE key = 'ga_session_id'
) AS STRING)
) AS session_id,
-- source / medium
traffic_source.source AS source,
traffic_source.medium AS medium,
event_name
FROM
`bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`
WHERE
_TABLE_SUFFIX BETWEEN '20210101' AND '20210131'
AND event_name IN ('begin_checkout', 'purchase')
AND (
SELECT value.int_value
FROM UNNEST(event_params)
WHERE key = 'ga_session_id'
) IS NOT NULL
)
SELECT
session_id,
source,
medium,
MAX(CASE WHEN event_name = 'begin_checkout' THEN 1 ELSE 0 END) AS began_checkout,
MAX(CASE WHEN event_name = 'purchase' THEN 1 ELSE 0 END) AS purchased
FROM base
GROUP BY
session_id,
source,
medium
LIMIT 100;
| 행 | session_id | source | medium | began_checkout | purchased |
| 1 | 3048586.2373315420-3849167474 | <Other> | <Other> | 1 | 1 |
| 2 | 3068634.6383481729-383324430 | organic | 1 | 0 | |
| 3 | 7828968.5532093675-8894922854 | organic | 1 | 1 | |
| 4 | 19522194.3549446028-3286981042 | organic | 1 | 0 | |
| 5 | 51278290.7724873670-3873178027 | organic | 1 | 0 | |
| 6 | 49426200.6314888908-1844601366 | organic | 1 | 0 | |
| 7 | 81559713.4631632468-6525676777 | <Other> | <Other> | 1 | 0 |
| 8 | 4113610.6380818670-4441643109 | organic | 1 | 0 | |
| 9 | 7796608.5828633110-8626225507 | <Other> | <Other> | 1 | 0 |
| 10 | 43382307.1290802082-7744018777 | organic | 1 | 1 |
4. source별 Checkout / Purchase 세션 집계
- 어떤 source가 checkout 규모가 큰가?
- 구매 세션 규모는 어떤가?
- checkout 규모 대비 purchase 규모가 낮은 source가 있는가?
-- STEP 4: source별 Checkout / Purchase 세션 집계
-- 목적:
-- 각 유입 채널별 checkout 세션과 purchase 세션 규모를 확인한다.
WITH base AS (
SELECT
CONCAT(
user_pseudo_id,
'-',
CAST((
SELECT value.int_value
FROM UNNEST(event_params)
WHERE key = 'ga_session_id'
) AS STRING)
) AS session_id,
traffic_source.source AS source,
event_name
FROM
`bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`
WHERE
_TABLE_SUFFIX BETWEEN '20210101' AND '20210131'
AND event_name IN ('begin_checkout', 'purchase')
AND (
SELECT value.int_value
FROM UNNEST(event_params)
WHERE key = 'ga_session_id'
) IS NOT NULL
),
session_event AS (
SELECT
session_id,
source,
MAX(CASE WHEN event_name = 'begin_checkout' THEN 1 ELSE 0 END) AS began_checkout,
MAX(CASE WHEN event_name = 'purchase' THEN 1 ELSE 0 END) AS purchased
FROM base
GROUP BY
session_id,
source
)
SELECT
source,
SUM(began_checkout) AS checkout_sessions,
SUM(purchased) AS purchase_sessions
FROM session_event
WHERE
began_checkout = 1
GROUP BY
source
ORDER BY
checkout_sessions DESC;
| 행 | source | checkout_sessions | purchase_sessions |
| 1 | 667 | 329 | |
| 2 | <Other> | 509 | 253 |
| 3 | (direct) | 490 | 256 |
| 4 | (data deleted) | 260 | 148 |
| 5 | shop.googlemerchandisestore.com | 233 | 129 |
5. source별 Checkout → Purchase 전환율 계산
- 특정 source의 구매 완료율이 유독 낮은가?
- 유입량은 많지만 품질이 낮은 source가 존재하는가?
- Direct / Organic / Paid 계열 차이가 존재하는가?
- 신규 유저 문제와 특정 채널 문제가 연결될 가능성이 있는가?
-- STEP 5: source별 Checkout → Purchase 전환율
-- 목적:
-- 유입 채널 품질 차이를 검증한다.
WITH base AS (
SELECT
CONCAT(
user_pseudo_id,
'-',
CAST((
SELECT value.int_value
FROM UNNEST(event_params)
WHERE key = 'ga_session_id'
) AS STRING)
) AS session_id,
traffic_source.source AS source,
event_name
FROM
`bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`
WHERE
_TABLE_SUFFIX BETWEEN '20210101' AND '20210131'
AND event_name IN ('begin_checkout', 'purchase')
AND (
SELECT value.int_value
FROM UNNEST(event_params)
WHERE key = 'ga_session_id'
) IS NOT NULL
),
session_event AS (
SELECT
session_id,
source,
MAX(CASE WHEN event_name = 'begin_checkout' THEN 1 ELSE 0 END) AS began_checkout,
MAX(CASE WHEN event_name = 'purchase' THEN 1 ELSE 0 END) AS purchased
FROM base
GROUP BY
session_id,
source
)
SELECT
source,
SUM(began_checkout) AS checkout_sessions,
SUM(purchased) AS purchase_sessions,
ROUND(
SAFE_DIVIDE(SUM(purchased), SUM(began_checkout)) * 100,
2
) AS checkout_to_purchase_rate,
ROUND(
(1 - SAFE_DIVIDE(SUM(purchased), SUM(began_checkout))) * 100,
2
) AS checkout_dropoff_rate
FROM session_event
WHERE
began_checkout = 1
GROUP BY
source
HAVING
checkout_sessions >= 30
ORDER BY
checkout_to_purchase_rate ASC;
| 행 | source | checkout_sessions | purchase_sessions | checkout_to_purchase_rate | checkout_dropoff_rate |
| 1 | 667 | 329 | 49.33 | 50.67 | |
| 2 | <Other> | 509 | 253 | 49.71 | 50.29 |
| 3 | (direct) | 490 | 256 | 52.24 | 47.76 |
| 4 | shop.googlemerchandisestore.com | 233 | 129 | 55.36 | 44.64 |
| 5 | (data deleted) | 260 | 148 | 56.92 | 43.08 |
전체 코드
-- 4일차 가설 3 최종 코드
-- 가설:
-- 유입 채널별 트래픽 품질 차이로 인해
-- Checkout → Purchase 전환율 차이가 발생할 수 있다.
--
-- 검증 방법:
-- source별 checkout 이후 purchase 전환율 비교
--
-- 해석 기준:
-- checkout 많지만 purchase 낮음 = 저품질 유입 가능성
-- checkout 적어도 purchase 높음 = 고의도 유입 가능성
WITH base AS (
SELECT
CONCAT(
user_pseudo_id,
'-',
CAST((
SELECT value.int_value
FROM UNNEST(event_params)
WHERE key = 'ga_session_id'
) AS STRING)
) AS session_id,
traffic_source.source AS source,
event_name
FROM
`bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`
WHERE
_TABLE_SUFFIX BETWEEN '20210101' AND '20210131'
AND event_name IN ('begin_checkout', 'purchase')
AND (
SELECT value.int_value
FROM UNNEST(event_params)
WHERE key = 'ga_session_id'
) IS NOT NULL
),
session_event AS (
SELECT
session_id,
source,
MAX(CASE WHEN event_name = 'begin_checkout' THEN 1 ELSE 0 END) AS began_checkout,
MAX(CASE WHEN event_name = 'purchase' THEN 1 ELSE 0 END) AS purchased
FROM base
GROUP BY
session_id,
source
)
SELECT
source,
SUM(began_checkout) AS checkout_sessions,
SUM(purchased) AS purchase_sessions,
ROUND(
SAFE_DIVIDE(SUM(purchased), SUM(began_checkout)) * 100,
2
) AS checkout_to_purchase_rate,
ROUND(
(1 - SAFE_DIVIDE(SUM(purchased), SUM(began_checkout))) * 100,
2
) AS checkout_dropoff_rate
FROM session_event
WHERE
began_checkout = 1
GROUP BY
source
HAVING
checkout_sessions >= 30
ORDER BY
checkout_to_purchase_rate ASC;
핵심 해석
유입량이 가장 큰 google 채널의 Checkout → Purchase 전환율이 가장 낮은 그룹 중 하나를 비교
- google: 49.33%
- direct: 52.24%
- shop.googlemerchandisestore.com: 55.36%
가설 채택
유입 채널별 품질 차이가 실제 존재하며 특히 google 유입은 대규모 트래픽 대비 구매 의도는 상대적으로 낮을 가능성이 있음
핵심 구조
- Checkout 규모 가장 큼
- 하지만 Purchase 전환율 낮음
Direct
- 상대적으로 구매 의도 높음
shop.googlemerchandisestore.com
- 브랜드/내부 탐색 성격 가능성
- 높은 전환율
해석
Google 유입 특성 가능성
- 검색 기반 탐색
- 가격 비교
- 정보 탐색
- 신규 유저 비중 높음
- 구매 확정 전 단계 유입
유입은 잘 되지만 구매 확신은 낮은 트래픽 가능성 존재
신규 유저 가설과 연결
이전 가설 2 : 신규 유저 전환율 낮음
현재 : google 전환율 낮음
연결 가능성
Google 유입 → 신규 유저 비중 높음 → 첫 구매 장벽 → Purchase 이탈
현재 가장 강력한 구조는 Google 유입 확대
→ 신규 유저 유입 증가
→ Checkout 진입
→ 신뢰/가격/첫 구매 장벽
→ Purchase 이탈
비즈니스 관점
문제는 단순히 Google 유입 확대만 하면 트래픽은 늘지만 구매 효율은 제한될 수 있음
따라서 핵심은 유입 확대 보다 Google 신규 유저 첫 구매 전환을 최적화 해야함
액션 아이디어
Google 유입 전용 랜딩 전략
- 첫 구매 쿠폰
- 무료배송 배너
- 신뢰 요소(리뷰/보안/반품 정책)
- 가격 경쟁력 강조
- 베스트셀러/인기 상품 우선 노출
SEO / Paid Search 전략
현재: 유입 중심
개선: 전환 중심 키워드 최적화
- 구매 의도 키워드
- 브랜드 키워드
- 상품명 + 구매형 키워드
CRM
- Google checkout abandonment 리마케팅
- 신규 방문 리타겟팅
전략적 제안
1순위: Google 신규 유저 전환율 개선
2순위: Checkout 단계 신뢰 강화
3순위: 고의도 Direct/Brand 채널 강화
유입 채널별 Checkout → Purchase 전환율 분석 결과 Google은 가장 큰 Checkout 유입 규모를 보였으나 구매 완료율은 상대적으로 낮게 나타났음
이는 Google 기반 유입이 탐색 및 신규 유저 중심의 저의도 트래픽일 가능성을 보여주며 단순 유입 확대보다 Google 신규 유저의 첫 구매 전환 최적화가 핵심 성장 과제임을 보여줌
Google은 가장 큰 유입 채널이지만 전환 효율은 낮아서 많이 데려오는 것보다 잘 구매하게 만드는 것이 중요함
'프로젝트 > GA4 분석' 카테고리의 다른 글
| [GA4 퍼널 분석] Day5-1 장바구니 전환율 가설 검증 (Day3 결과 통합) (0) | 2026.05.11 |
|---|---|
| [GA4 퍼널 분석] Day4-4 (begin_checkout → purchase | Price Barrier 분석) (0) | 2026.05.09 |
| [GA4 퍼널 분석] Day4-2 (begin_checkout → purchase | New vs Returning 분석) (0) | 2026.05.09 |
| [GA4 퍼널 분석] Day4-1 (begin_checkout → purchase | Mobile UX 분석) (0) | 2026.05.09 |
| [GA4 퍼널 분석] Day3-5 (view_item → add_to_cart | Item Category 분석) (0) | 2026.05.08 |