프로젝트/GA4 분석

[GA4 퍼널 분석] Day4-3 (begin_checkout → purchase | Source Quality 분석)

조성호 2026. 5. 9. 20:45

지금까지 결과

가설 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 google organic scroll 521445891
2 20210124 google organic page_view 521445891
3 20210124 google organic page_view 521445891
4 20210124 google organic scroll 521445891
5 20210124 google organic scroll 521445891
6 20210124 google organic page_view 521445891
7 20210124 google organic user_engagement 521445891
8 20210124 google organic session_start 521445891
9 20210124 google organic user_engagement 521445891
10 20210124 google 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 google cpc purchase
8 6097102.652 5991255 google cpc begin_checkout
9 6097102.652 5991255 google cpc begin_checkout
10 6097102.652 5991255 google 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 google organic 1 0
3 7828968.5532093675-8894922854 google organic 1 1
4 19522194.3549446028-3286981042 google organic 1 0
5 51278290.7724873670-3873178027 google organic 1 0
6 49426200.6314888908-1844601366 google organic 1 0
7 81559713.4631632468-6525676777 <Other> <Other> 1 0
8 4113610.6380818670-4441643109 google organic 1 0
9 7796608.5828633110-8626225507 <Other> <Other> 1 0
10 43382307.1290802082-7744018777 google 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 google 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 google 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 유입은 대규모 트래픽 대비 구매 의도는 상대적으로 낮을 가능성이 있음

 

핵심 구조

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은 가장 큰 유입 채널이지만 전환 효율은 낮아서 많이 데려오는 것보다 잘 구매하게 만드는 것이 중요함