dominkim.com
data · · 1분 읽기

GA4 커스텀 이벤트, 블로그에 무엇부터 심을까

블로그에 GA4 커스텀 이벤트를 설계할 때 페이지 공통 파라미터, 완독 판정, 예약어 충돌을 어떻게 다루는지 실제 택소노미와 함께 정리한다.

GA4 DebugView에 커스텀 이벤트가 표시된 화면을 단순화한 도식
목차

블로그에 GA4를 붙이는 글은 많다. 그런데 대부분 측정 ID를 넣는 데서 끝난다. 페이지뷰만으로는 “이 글이 읽혔는가”에 답할 수 없다. 스크롤을 얼마나 내렸는지, 얼마나 머물렀는지, 코드 블록을 복사했는지가 있어야 한다.

이 글은 그 이벤트들을 설계하면서 먼저 정해야 했던 세 가지를 다룬다. 페이지 공통 파라미터, 완독 판정 조건, 그리고 예약어와의 충돌이다.

페이지 공통 파라미터를 먼저 정한다

모든 이벤트에 post_idtarget_keyword가 자동으로 붙어야 어떤 이벤트든 키워드별로 쪼갤 수 있다. 이걸 이벤트마다 따로 넣으면 하나는 반드시 빠진다.

방법은 단순하다. 포스트 페이지가 렌더될 때 전역 객체에 공통 파라미터를 심고, 이벤트를 보내는 함수 하나가 그 객체를 항상 병합한다.

src/lib/analytics.ts
export function track(name, params) {
window.gtag?.('event', name, {
...window.__pageParams,
...params,
});
}

이렇게 하면 scroll_depth 이벤트를 보낼 때 post_id를 신경 쓸 필요가 없다. 리포트에서는 target_keyword로 바로 분해된다.

완독은 스크롤만으로 판정하지 않는다

스크롤 100%는 3초면 도달한다. 그래서 활성 시간을 함께 본다. 예상 읽기 시간의 절반 이상 머물렀고 본문 끝까지 내렸을 때만 완독으로 센다.

지표는 느슨하면 의미가 없고, 엄격하면 표본이 없다. 초기값을 정하고 이탈 이벤트의 실제 분포로 보정한다.

활성 시간은 탭이 보이는 상태이고 최근 60초 안에 입력이 있었을 때만 1초씩 누적한다. 다른 탭에 열어두고 잊은 시간은 세지 않는다.

스크롤 깊이와 활성 시간 두 축으로 완독을 판정하는 도식
완독 = 스크롤 100% AND 활성 시간 ≥ 예상 읽기 시간 × 0.5

예약어와 충돌하지 않게

GA4의 향상된 측정은 scroll, click, file_download 같은 이름을 자동으로 쓴다. 직접 만든 스크롤 이벤트에 scroll이라는 이름을 붙이면 내장 이벤트와 섞여서 분모가 흔들린다.

세 가지만 지키면 된다.

  1. 자동 수집 이벤트와 같은 이름을 쓰지 않는다.
  2. 같은 의미를 커스텀으로 만들었다면 향상된 측정에서 해당 항목을 끈다.
  3. share, search처럼 권장 이벤트가 있으면 그 이름과 파라미터 규격을 그대로 따른다.

정리

이벤트 표를 채우기 전에 위 세 가지를 정해두면, 나중에 이벤트를 추가할 때 표에 한 줄 더하고 마크업에 속성 하나 붙이는 일로 끝난다. 다음 글에서는 완독률을 실제로 어떻게 정의하고 보정했는지 다룬다.

이 글이 도움이 됐다면
X에 공유 LinkedIn
관련 글데이터 분석가를 위한 추천 도서 7권2026.08.26
댓글 (giscus, GitHub 로그인) — M3에서 활성화