목차
7월에 thanks page 주소 하나가 바뀌면서 전환이 8일 동안 빠졌던 일은 앞 글에 적었습니다. 그 뒤 넉 달 동안 추적을 이벤트로 옮겼는데, 옮기는 과정에서도 숫자는 계속 깨졌어요.
추적을 URL 대신 이벤트에 걸었습니다
7월 31일에 결제 감지를 화면 요소 기반에서 개발팀이 심은 dataLayer push로 옮겼어요. 9월 2~3일에는 가입·로그인·결제 표준 이벤트로 GTM을 다시 짰습니다.
개발팀이 심는 코드는 아래처럼 생겼습니다. 원리를 보여 주려고 다시 쓴 예시라 값은 실제와 달라요.
// 결제 승인 응답 직후 개발팀이 심는 코드 (값은 예시)
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({ ecommerce: null }); // 이전 ecommerce 값 초기화
window.dataLayer.push({
event: "purchase",
ecommerce: {
transaction_id: "T_000123",
value: 10000,
currency: "KRW", // 'Currency'로 보내면 매출이 0으로 집계됩니다
items: [{ item_id: "plan_a", item_name: "요금제 A" }],
},
});
옮기는 중에도 구멍은 계속 나왔습니다
- 이벤트 종류가 늘자 결제 이벤트가 표준 보고서에서 (other)로 접혔습니다. 주범은 하루 고유값이 1만 개를 넘는 페이지 경로 파라미터였어요.
- 7월 31일 이관 때는 통화 키 표기가 어긋나서 결제 매출이 10월 22일까지 0으로 찍혔습니다. 위 코드의 주석이 바로 이 사고예요.
- GA4 가입은 9월 3일부터 약 1.5배로 뛰었습니다.
- 모바일 회원의 31%가 가입 완료 페이지에 다시 들어와 완료 이벤트가 또 찍혔습니다. 메타 전환은 이 재발화까지 세서 메타 유입 가입이 사람당 1.28~1.35건으로 잡혔어요.
- 10월 16일 오후에는 보안 설정이 바뀌면서 일부 SEO 페이지의 착지 리퍼러가 깨졌습니다.
- 11월 11일에는 GA로 보내는 값 하나에서 오류를 찾았습니다. 그동안 결제 관련 이벤트의 97.8%가 분석에서 빠져 있었어요.
진짜 문제는 알아채는 데 걸린 시간이었습니다
매번 깨진 날과 알아챈 날 사이가 길었습니다. 그동안 판정은 깨진 숫자 위에서 돌았어요.
해결은 두 겹으로 했습니다. 먼저 사건마다 어떤 숫자를 믿을지 정했어요. 보안 설정 변경 이후의 SEO 착지는 검색엔진 도구로 봅니다. 가입은 사용자 수로 세고, 메타 전환은 같은 정의끼리만 비교해요.
판정 기준을 결과 보기 전에 잠급니다
다음으로 측정 계약이라는 장치를 만들었습니다. 판정일과 결과별 할 일, 데이터가 모자랄 때 할 일을 결과를 보기 전에 잠가 두는 방식이에요. 판정일이 오면 코드가 결과를 내고, 결과가 없으면 기본값을 냅니다.
계약 한 건은 이렇게 생겼습니다. 수치와 판정선은 예시예요.
질문: 랜딩 개편 뒤 가입 흐름 첫 단계로 넘어가는 사용자가 늘었나
지표: 첫 단계 클릭 사용자 수 / 랜딩 방문 사용자 수 # 이벤트 수 대신 사용자 수
잠근 날: 2026-11-09
판정일: 2026-11-23
결과별 할 일:
+10% 이상: 개편안 유지, 다음 단계 실험 시작
±10% 안: 개편안 유지, 다음 미시 전환으로 측정 이동
-10% 이하: 이전 안으로 되돌림
데이터가 모자라면: 판정을 2주 미루고, 연기는 1회만
결과가 없으면: 현행 유지
11월 9일에 기존 판정 8건을 이 계약으로 옮겼고, 11월 23일까지 시범 운영하고 있어요.
판정 지표도 바꿨습니다
랜딩 개편 때 가입 전환율 하나에 유의성 검정을 걸면 4주 MDE가 18%였어요. 이러면 개선 효과를 사실상 볼 수 없습니다.
MDE는 기준 전환율과 표본 크기만 있으면 미리 계산할 수 있습니다. 아래 함수에 넣은 값은 예시예요.
from math import sqrt
from scipy.stats import norm
def relative_mde(p, n_per_arm, alpha=0.05, power=0.8):
"""기준 전환율 p, 그룹당 n명일 때 잡아낼 수 있는 최소 상대 변화"""
z = norm.ppf(1 - alpha / 2) + norm.ppf(power)
return z * sqrt(2 * p * (1 - p) / n_per_arm) / p
print(relative_mde(p=0.03, n_per_arm=6000)) # 약 0.29 (예시 값)
그래서 기준을 낮추는 대신 변화가 생기는 단계의 미시 전환을 1순위 지표로 올렸습니다. 전환율이 높은 앞 단계일수록 같은 표본으로 더 작은 변화를 잡을 수 있기 때문이에요.