Q. GTM과 GA4는 뭐가 다른가요?
GTM(구글 태그 매니저)은 태그, 트리거, 변수를 웹 화면에서 관리하는 도구이고, GA4는 그렇게 모인 데이터를 쌓고 분석하는 목적지 시스템이다. GTM으로 GA4용 태그를 설치하고 코드 수정 없이 바꿀 수 있지만, GTM 자체가 리포트를 보여주지는 않는다.
오늘 바로 쓸 핵심 3줄
- 컨테이너 스니펫 2개(head·body)가 지금 사이트에 심어져 있는지부터 확인하라.
- 태그를 바꿀 때마다 개발자를 부르고 있다면, 그 절차부터 GTM 이전 후보로 올려라.
- 게시 전엔 반드시 미리보기(Preview)를 켜라, 사고가 절반 넘게 줄어든다는 걸 알게 될 것.
결제 버튼 하나 추적하려는데 코드를 세 군데 고쳐야 한다면
새 캠페인을 준비하며 '구매 완료 버튼 클릭'을 전환으로 잡고 싶다고 하자. 사이트에 태그를 직접 심는 방식이라면, 이 요청은 마케팅팀 손을 떠나 개발팀 일정표에 줄을 서야 하는 신세.
코드를 열어 태그 스크립트를 추가하고, 테스트 서버에 올리고, 리뷰를 거쳐 배포하는 절차. 값 하나가 잘못됐다는 게 뒤늦게 드러나면 이 사이클을 처음부터 다시 밟아야 하니, 손해가 이만저만 아니지 않나.
이미지: 태그 하나를 바꾸는 일이 배포 일정표를 따라가면, 캠페인보다 코드가 늦게 끝나기 마련.
이런 식이면 태그 하나 늘리는 일이 마케팅 캘린더가 아니라 개발 스프린트 캘린더를 따라가게 된다. 정작 데이터가 쌓이기 시작할 즈음엔 캠페인이 이미 끝나 있을 수도 있는 노릇이니까.
구글 태그 매니저(GTM)는 이 절차 자체를 다르게 짜는데, 코드를 만지는 일은 처음 한 번으로 끝내고 그다음부터 태그는 웹 화면에서 다룬다.
심는 건 한 번, 바꾸는 건 웹에서
구글은 GTM을 이렇게 정의한다. "태그 매니저는 웹사이트 코드를 바꾸지 않고도 태그를 설정하고 관리할 수 있게 해주는 태그 관리 시스템이다."
방법은 단순한 편. 사이트의 모든 페이지에 컨테이너 스니펫 2개를 심는데, 하나는 <head> 안에, 하나는 <body> 시작 직후에 넣는다. 이 두 조각만 심고 나면, 이후 태그를 추가하거나 고치거나 지우는 작업은 코드가 아니라 Tag Manager 웹사이트에서 하면 그만이다.
이 구조를 gtag.js를 코드에 직접 심는 방식과 나란히 놓으면 차이가 또렷해지는데, 구글의 공식 비교 문서는 gtag.js 직접 설치를 "태그를 배포하고 웹 수집을 커스터마이즈하려면 코드를 작성해야 한다"고 설명하고, GTM은 "코드 편집 없이 구글과 서드파티 태그를 그때그때 배포하고 수정할 수 있다"고 대비시킨다.
왼쪽은 태그마다 코드에 선을 새로 까는 구조, 오른쪽은 컨테이너 하나만 심어두고 그 안에서 태그를 갈아 끼우는 구조.
집에 비유하면 감이 더 잘 잡히지 않을까. 벽 속에 전선을 새로 까는 대신 배전반 하나를 미리 설치해두고, 이후엔 배전반 앞에서 스위치만 조작하는 셈. 콘센트(태그)를 늘리거나 빼는 일이 전기 공사가 아니라 스위치 조작 하나로 끝난다.
트리거가 언제를, 변수가 값을, 태그가 전송을 맡는다
GTM 안에서 움직이는 개념은 네 가지. 컨테이너, 태그, 트리거, 변수인데, 이름이 낯설어도 관계만 잡으면 어렵지 않다.
태그(Tag)는 구글 공식 설명으로 "구글 애널리틱스 같은 시스템으로 데이터를 보내는 코드"다. 실제로 데이터를 목적지에 쏘는 실행기 역할이라고 보면 된다.
트리거(Trigger)는 "웹페이지나 앱을 지켜보다가 폼 제출, 버튼 클릭, 페이지뷰 같은 특정 이벤트가 감지되면 태그에 발동하라고 알려주는" 조각. 모든 태그는 최소 한 개의 트리거가 있어야 발동한다.
변수(Variable)는 "웹사이트나 앱에서 코드가 실행될 때 값이 채워지는, 이름 붙은 자리 표시자"다. 트리거에서는 발동 조건을 좁히는 필터로 쓰이고, 태그에서는 거래액이나 상품ID 같은 실제 값을 담아 전달하는 그릇으로 쓰인다는 게 차이.
컨테이너(Container)는 이 셋을 담는 단위. 한 줄짜리 공식 정의 문장은 따로 찾지 못했지만, 구글의 구성요소 설명 페이지는 "태그, 트리거, 변수, 관련 설정을 모아 특정 웹사이트나 앱에 설치한 것을 컨테이너라 부른다"고 적어둔다. 이 서술이 실질적으로 가장 근접한 공식 정의라고 보면 된다.
트리거가 언제를, 변수가 값을, 태그가 전송을 맡고, 이 셋이 컨테이너 하나에 담긴다.
넷의 관계는 무대 조명 콘솔에 비유하면 자리를 잡는다. 조명(태그)을 무대 뒤에서 일일이 배선을 바꿔 켜는 대신, 조명 콘솔(컨테이너) 앞에 앉아 큐시트(트리거)를 보고 버튼을 누르는 식. 트리거는 "몇 번째 마디에서" 조명을 켤지 알려주는 큐고, 변수는 그 조명의 색과 밝기 값. 태그는 그 값대로 실제 빛을 쏘는 조명 장치 자체.
이미지: 무대 뒤에서 배선을 바꾸는 대신, 콘솔 앞에서 큐시트를 보고 버튼을 누른다.
초보자가 자주 헷갈리는 함정이 여기 있는데, 트리거는 "언제"만 결정할 뿐 "무엇을 보낼지"는 정하지 않는다는 것. 트리거를 아무리 정교하게 짜도, 태그 안에 실제로 보낼 값(변수)을 연결하지 않으면 태그는 빈 채로 나가고 만다.
dataLayer, 페이지와 GTM 사이에 놓인 전달 선반
GTM이 페이지 안의 값, 예를 들어 구매 금액이나 상품ID, 로그인 여부 같은 것을 읽어오려면 통로가 필요하다. 그 통로가 dataLayer다.
구글 개발자 문서는 이렇게 정의한다. "데이터 레이어는 구글 태그 매니저와 gtag.js가 태그에 정보를 전달하기 위해 쓰는 객체다." 전달 선반에 비유하면 이해가 쉽다. 페이지가 값을 선반에 올려두면, GTM이 그 선반에서 값을 꺼내 태그에 넘긴다.
dataLayer.push({'variable_name': 'variable_value'});
코드처럼 보여도 겁먹을 것 없다. 그냥 "이 값을 선반에 하나 올려놓는다"는 뜻이다. 실무에서 자주 걸리는 함정은 두 가지다.
첫째, dataLayer는 대소문자를 구분한다. datalayer나 DataLayer로 한 글자라도 틀리면 그냥 작동을 안 한다. 둘째는 배치 순서다. dataLayer 선언(window.dataLayer = window.dataLayer || [])은 컨테이너 스니펫보다 코드상 위에 있어야 하고, 페이지 로드 시점 값을 GTM이 쓰게 하려면 관련 push() 호출도 컨테이너 코드보다 위에 있어야 한다.
이미지: 페이지가 값을 선반에 올려두면, GTM이 그 선반에서 값을 꺼내 태그에 넘긴다.
사고를 막는 안전장치 3종
GTM은 게시(Publish) 버튼을 누르는 순간 즉시 라이브 사이트에 반영된다. 되돌릴 수 없는 실수를 만들기 딱 좋은 구조라, 구글은 세 겹의 안전장치를 붙여뒀다.
첫째는 미리보기다. 공식 설명은 "컨테이너가 게시되기 전에 구성을 테스트할 수 있도록, 마치 현재 초안이 배포된 것처럼 사이트를 둘러볼 수 있게 해준다"고 적는다. Tag Assistant와 연결돼 어떤 태그가 어떤 순서로 발동했는지 그 자리에서 확인할 수 있고, 공유 링크를 만들어 동료에게 검토를 맡길 수도 있다. 다만 태그나 트리거를 바꾼 뒤 이미 열어둔 미리보기는 자동으로 갱신되지 않으니, GTM 쪽에서 Preview를 다시 눌러야 최신 초안이 반영된다.
둘째는 버전 관리다. "컨테이너가 게시될 때마다 그 시점의 구성이 버전으로 기록된다"는 게 공식 설명이다. 게시 이력이 자동으로 쌓이니 언제 무엇이 바뀌었는지 되짚어볼 수 있다.
셋째는 게시와 롤백이다. 준비가 덜 된 채로 게시했다면, Versions 목록에서 원하는 버전의 메뉴를 열어 "Set as Latest Version"을 고른다. 이 동작은 현재 작업본을 그 버전 내용으로 되돌리는 것이라, 이후 다시 수정해서 재게시할 수 있다. 구글 문서도 정확히 이 상황을 예로 든다. "누군가 준비되지 않은 컨테이너 버전을 실수로 게시했다면, 이전 버전으로 워크스페이스를 되돌려 다시 게시할 수 있다."
게시할 때마다 버전이 자동 저장되니, 문제가 생기면 이전 버전으로 되돌려 다시 게시하면 된다.
결국 이 세 장치가 지키는 건 하나다. 실수가 나더라도, 그 실수가 라이브에 영원히 박히지는 않는다는 것.
이미지: 게시 전 미리보기 하나가, 사고 대부분을 사전에 걸러낸다.
GA4와 연결하기
GTM으로 GA4를 설정하는 표준 방법은 태그 유형에서 "Google 태그"를 고르는 것이다. Tag ID(=GA4 측정 ID)를 넣고, 트리거는 보통 "Initialization - All Initialization Events"로 잡는다.
명칭이 한 차례 바뀐 적이 있다. 예전엔 "Google Analytics: GA4 Configuration" 태그로 불렸는데, 구글은 이를 "Google 태그"로 대체했고, 기존에 그 태그를 쓰던 계정은 자동으로 업그레이드된다고 공지했다. 다만 정확히 어느 시점에 이 전환이 이뤄졌는지는 이번 조사로 확인하지 못했다. 대체됐다는 사실과 자동 업그레이드된다는 점 자체는 공식 문서로 확인되니, 날짜는 확정하지 않고 사실만 짚어둔다.
gtag.js를 코드에 직접 심는 방식과의 차이는 앞서 본 것과 같다. gtag.js 직접 설치는 코드 레벨에서 커스터마이즈하려면 개발 리소스가 필요하고, GTM은 GTM 화면에서 관리한다.
처음 저지르는 실수 네 가지
GTM을 처음 만지는 사람들이 반복해서 걸리는 지점은 대체로 넷으로 좁혀진다. 아래 넷 중 셋은 구글 공식 문서가 아니라 실무자들이 공유하는 비공식 가이드(Analytics Mania 등) 근거라는 점을 먼저 밝힌다. 구글이 직접 "이것이 흔한 실수"라고 못박은 목록은 아니다.
미리보기 없이 게시
미리보기의 목적은 공식 문서에 뚜렷이 나온다. "게시되기 전에 구성을 테스트하는" 게 그 존재 이유다. 그런데도 실무 가이드에서는 게시 전 Preview를 건너뛰는 게 가장 흔한 실수로 꼽힌다. 추적이 깨지거나, 데이터가 부정확해지거나, 전환이 통째로 누락되는 사고가 대부분 여기서 시작된다.
지나치게 넓은 트리거
"All Pages"나 "All Clicks" 같은 기본 트리거를 좁히지 않고 그대로 쓰면 과도한 추적이나 중복 데이터가 쌓인다. 실제로 자주 보고되는 사례는, 결제 성공·실패·에러 페이지의 URL이 똑같아서 전환 태그를 "모든 페이지"에 걸어버리는 바람에 실패한 결제까지 전환으로 잡히는 경우다.
gtag.js와 GTM 이중 설치
GTM으로 GA4를 새로 설치하면서, 사이트 코드에 이미 심어져 있던 gtag.js 하드코딩을 지우지 않으면 같은 이벤트가 두 경로로 중복 전송된다. 페이지뷰가 두 배로 잡히는 식이다. 브라우저 개발자도구의 Network 탭이나 소스 코드에서 "gtag"를 검색하면 탐지할 수 있고, 해법은 간단하다. GTM을 쓰기로 했다면 하드코딩된 구현은 지운다.
컨테이너 스니펫 위치 오류
공식 설치 가이드는 스크립트 스니펫을 "가능한 한 <head> 태그 상단 가까이"(단 dataLayer 선언보다는 아래) 두고, noscript 스니펫은 "<body> 여는 태그 바로 다음"에 두라고 명시한다. 이 위치를 벗어나면 일부 태그의 발동 타이밍이 늦어지거나 noscript 폴백이 깨질 수 있다. 다만 정확히 어떤 태그가 어떻게 실패하는지에 대한 구체적 증상은 공식 문서보다 커뮤니티 스레드 수준에서 확인된다.
이미지: gtag.js와 GTM을 같이 심어두면, 같은 이벤트가 두 번 잡힌다.
오늘 할 일
여기까지 개념을 훑었으니, 이제 내 사이트에 그대로 대볼 차례다.
- 컨테이너 설치 확인: 사이트
<head>·<body>에 GTM 스니펫 2개가 심어져 있나? 없으면 지금 설치부터 하라. - 미리보기 습관: 태그를 하나라도 고치면 게시 전에 Preview부터 켜라. 매번, 예외 없이.
- 기존 태그 목록 정리: 코드에 gtag.js가 직접 심어진 채 GTM과 같이 돌고 있지 않은지 확인하라. 중복이 있다면 하드코딩 쪽을 지워라.
그래도 하나만 챙긴다면, 이것이다.
태그를 바꾸는 일이 개발팀 캘린더가 아니라 마케팅팀 손끝에서 끝나야 한다.
이 글은 디지털 마케팅 분석 입문 시리즈 6편이다. 태그·트리거·변수를 다뤄봤다면, 다음은 그 태그가 실제로 무엇을 추적하는지로 이어진다.
- 이전 편: 전환 추적의 원리, GA4 시작하기
- 첫 편: 쿠키·세션·이벤트 기초
근거·출처
- GTM 정의: Introduction to Tag Manager, Google 고객센터
- gtag.js와의 비교: Google Tag Manager vs. gtag.js, Google 고객센터
- 컨테이너 정의(서술형): Components of Google Tag Manager, Google 고객센터
- 트리거 정의: About triggers, Google 고객센터
- 변수 정의: About variables, Google 고객센터
- 컨테이너 생성 절차: 1. Create an account and container, Google 고객센터
- dataLayer 정의: The data layer, Google Developers
- 미리보기: Preview and debug containers, Google 고객센터
- 버전·게시·롤백: Publishing, versions, and approvals, Google 고객센터
- GA4 연결: Set up Google Analytics in Tag Manager, Google 고객센터
- Google 태그 명칭 변경: Announcement: Google tag and Tag Manager, Google 고객센터
- 스니펫 설치 위치: 2. Install a web container, Google 고객센터
- 흔한 실수(비공식): 21 Most common Google Tag Manager mistakes, Analytics Mania
- 중복 이벤트(비공식): Duplicate Events in GA4 and How to Fix them, Analytics Mania
- 스니펫 위치 참고(커뮤니티, 비공식): GTM is installed on the head and body, but it doesn't work, Tag Manager Community
"Google Analytics: GA4 Configuration"에서 "Google 태그"로 명칭이 바뀐 정확한 시점은 이번 조사로 확인하지 못했다, 대체·자동 업그레이드 사실 자체만 공식 문서로 확인된다. 초보자 흔한 실수 네 가지 중 셋은 실무 가이드(비공식) 근거이며, 구글이 직접 "흔한 실수"라 명명한 공식 목록은 아니다. 스니펫 위치를 벗어났을 때의 구체적 증상도 공식 문서 대신 커뮤니티 스레드 수준 정보로 보완했다.
이 글이 도움이 되었다면 공유해주세요
최신 인사이트
카카오톡 공유 썸네일 안 나올 때 해결법 (Kakao JavaScript SDK 2025)
카카오톡 공유하기에서 썸네일 이미지가 안 나오는 원인과 scrapImage로 KAGE URL을 변환해 해결하는 방법을 단계별로 설명합니다. 지금 확인하세요.
Claude Code 서브에이전트로 CRM 사용자 설명서 20분 만에 완성하는 방법
Claude Code 서브에이전트를 활용해 CRM 코드베이스에서 사용자 설명서와 비주얼 가이드북을 20분 만에 자동 생성한 실전 사례를 공유합니다. 지금 확인하세요.
GEO 생성형 엔진 최적화: 2025년 AI 마케팅 전략 완전 가이드
GEO 생성형 엔진 최적화란 무엇이며 기존 SEO와 어떻게 다른지, 2025년 AI 마케팅 전략의 핵심 실행 방법 5가지를 데이터와 함께 알아보세요.
관련 프로젝트
새 글을 이메일로 받아보세요
마케팅, 분석, 개발 인사이트를 정리해서 보내드려요.
