월요일 대시보드에서 가입 완료가 18% 급등합니다. 마케팅팀은 캠페인 효과라 하고 개발팀은 새 온보딩 효과라 합니다. 로그를 열어 보니 웹은 계정 생성 때 `가입_완료`를, 앱은 이메일 인증 때 `가입_성공`을 보냈고 한 플랫폼은 재시도마다 다시 전송했습니다. 고객 행동은 하나인데 구현자의 단어와 발생 시점이 세 개의 현실을 만든 것입니다.
핵심 분석 이벤트는 개발 편의를 위한 로그가 아니라 여러 클라이언트와 서버가 같은 행동을 재현하는 데이터 계약이므로 이름부터 발생 조건과 변경 절차까지 공동 소유해야 합니다.
먼저 보면 좋은 점
- 한 고객 행동에 하나의 의미와 발생 조건을 부여합니다.
- GA4 권장 이름과 일관된 dataLayer 규칙을 적용합니다.
- 중복·버전 변경은 계약 검토와 원천 대조를 거칩니다.
이름 충돌은 숫자보다 의미를 먼저 깨뜨린다
쇼핑 앱의 결제 버튼을 누를 때 구매 사건을 보내는 iOS와 서버 승인이 끝날 때 보내는 웹이 함께 집계되면 한 지표 안에 시도와 성공이 섞입니다. 이름이 같다고 같은 사건이 아니며, 이름이 다르다고 반드시 다른 행동도 아닙니다. 개발 티켓 단위로 이벤트를 추가하면 이 차이가 배포 후에야 드러납니다.
먼저 행동 사전을 만들고 “누가 무엇을 완료했을 때 한 번 발생하는가”를 평문으로 씁니다. UI 컴포넌트 이름보다 고객 결과를 기준으로 하고 GA4 권장 사건 이름이 의미에 맞으면 사용합니다. 맞지 않는 이름을 억지로 재사용해 의미를 숨기기보다 고유 이름의 책임과 조건을 분명히 합니다.
이벤트 계약서에 여덟 칸을 고정한다
실무 산출물에는 사건 이름, 사업 의미, 발생 주체, 정확한 발생 조건, 필수·선택 매개변수, 중복 키, 원천, 소유자와 버전을 둡니다. 예시는 전송값과 함께 적되 실제 개인정보나 자유 입력값을 넣지 않습니다. 앱과 웹 개발자는 같은 표를 보고 구현하고 분석가는 계산식에서 어떤 버전을 쓰는지 남깁니다.
예를 들어 가입 완료 사건은 계정 생성 응답이 성공한 뒤 사용자당 한 번, 가입 방식은 허용된 값만 보낸다고 계약합니다. 화면 노출 때 한 번 더 보내거나 재시도마다 중복되면 계약 위반입니다. 100건의 서버 생성 중 103건이 들어오면 “오차가 작다”고 넘기지 말고 중복 키와 재시도 경로를 조사합니다.
매개변수는 질문과 값 사전을 함께 가진다
매개변수 이름이 요금제, 요금제 이름, 구독 유형으로 갈라지면 같은 요금제를 묶기 어렵습니다. 소문자 밑줄 표기 같은 표기 규칙만으로는 부족하고 값의 허용 목록, 빈 값 처리, 자료형과 변경 책임자를 정해야 합니다. 화면에 보이는 번역 문구를 값으로 보내면 언어 변경만으로 새 범주가 생깁니다.
매개변수 하나마다 어떤 질문에 쓰는지 계약서에 적습니다. 쓰임이 없는 속성, 높은 변동성을 가진 자유문, 클라이언트가 신뢰할 수 없는 가격은 제외합니다. 결제 금액과 상태는 서버 원장을 기준으로 검증하며 구매 사건과 환불 사건을 한 상태 값으로 덮어써 과거 사건의 의미를 바꾸지 않습니다.
GTM dataLayer는 덮어쓰지 않는 공용 통로다
웹에서 GTM dataLayer 이름은 모든 페이지와 팀에서 일관되게 유지하고 기존 배열을 새 값으로 덮어쓰지 않습니다. 초기화와 전송 순서를 문서화하며 사건 객체의 키도 계약과 맞춥니다. 페이지 템플릿 하나가 dataLayer를 재할당하면 앞서 쌓인 동의 상태나 사건이 사라져 재현하기 어려운 누락이 생깁니다.
예를 들어 배포 전 테스트에서 상품 보기 뒤 장바구니 사건이 사라진다면 태그 조건만 고치지 말고 dataLayer 생성 시점과 덮어쓰기 여부를 확인합니다. 여러 팀이 별도 이름을 만들자는 요구가 나오면 공용 계약으로 표현할 수 없는 실제 이유가 있는지 검토하고, 단순 충돌 회피라면 병합될 때까지 출시를 보류합니다.
버전 변경은 새 의미를 조용히 섞지 않는다
발생 조건이나 값 사전이 달라지면 문서의 날짜만 바꾸지 않습니다. 이전 지표와 비교 가능한지, 병행 전송이 필요한지, 언제 소비자가 새 버전으로 이동할지 변경 기록을 남깁니다. 이벤트 이름을 새로 만드는 결정도 비용이 있으므로 의미가 실제로 달라졌는지 먼저 판정합니다.
앱 구버전이 오래 남는 환경에서는 서버와 최신 앱만 보고 일괄 전환할 수 없습니다. 버전별 발생량을 확인하고 대시보드 계산에 혼합 기간을 표시합니다. 두 정의의 차이가 핵심 KPI 판정을 뒤집을 정도인데 분리할 방법이 없다면 추세 비교를 멈추고 새 기준선을 시작합니다.
핵심 사건 하나를 계약으로 바꾼다
팀에서 가장 자주 말하는 “가입”, “활성”, “구매” 중 하나를 골라 현재 앱, 웹, 서버 구현을 표에 나란히 놓습니다. 발생 조건과 매개변수가 다르면 올바른 하나를 추측하지 말고 사업 의미와 최종 원천을 합의합니다. 담당자 한 명과 이 사건을 쓰는 대시보드 목록을 붙여 변경 알림 경로도 만듭니다.
수정 배포 뒤 테스트 가입 10건을 계정 원장과 대조해 누락과 중복을 분류합니다. 기존 추세를 이어 붙일 수 없으면 새 정의의 적용일을 경계로 표시하고 과거와 직접 비교하지 않습니다. 계약에 없는 값이 계속 들어오는 동안은 관련 전환율 보고를 중단합니다. 숫자를 빨리 복구하는 것보다 어느 시점부터 믿을 수 있는지 분명히 하는 결정이 먼저입니다.
메모
- 사건 이름과 발생 조건이 앱·웹·서버에서 같은가?
- dataLayer 이름과 키가 일관되고 배열을 덮어쓰지 않는가?
- DebugView와 서버 원장으로 중복·누락·버전을 검증했는가?