목차
인스타그램에도 올리고, 커뮤니티에도 글을 쓰고, 카카오톡으로도 링크를 돌렸는데, 방문 통계에는 "직접 방문"만 잔뜩 찍혀 있을 때가 있어요. 어디서 사람이 오는지 모르면 다음 주에 어디에 시간을 써야 할지도 알 수 없어요. 이 글은 바깥에 내놓는 링크에 꼬리표를 달아서, 어느 채널이 방문을 데려왔는지 세는 방법을 순서대로 정리해요.
그 꼬리표가 UTM 이에요. 주소 끝에 ?utm_source=... 처럼 붙이는 짧은 글자들인데, 택배 상자에 붙이는 송장 같은 거예요. 상자 안의 물건은 그대로인데, 송장이 있으면 어느 가게에서 보낸 건지 알 수 있죠. 방문자는 평소처럼 페이지를 보고, 통계 도구는 그 송장을 읽어 기록해요.
혹시 이런 고민 있으신가요?
- 여기저기 홍보 링크를 올렸는데, 어느 곳이 효과가 있었는지 하나도 모르겠어요.
- UTM 을 붙여 봤는데 통계에
Instagram,instagram,ig가 따로 쌓여서 합계를 낼 수가 없어요. - 우리 사이트 안의 버튼에도 UTM 을 붙이면 더 자세히 볼 수 있을 것 같은데, 괜찮은 건지 모르겠어요.
이 글을 읽으면
- UTM 다섯 칸 중 무엇을 쓰고 무엇을 비워 둘지 정하고, 이름 규칙을 표 한 장으로 만들 수 있어요.
- 링크를 손으로 쓰지 않고 한 곳에서 만들어서, 오타 때문에 통계가 쪼개지는 일을 막을 수 있어요.
- UTM 을 붙이면 안 되는 자리와 통계를 망가뜨리는 설정을 알고, 링크가 제대로 기록되는지 직접 확인할 수 있어요.
1단계. 다섯 칸 중 쓸 칸과 이름 규칙 정하기
UTM 은 다섯 칸이에요. 방문 통계 도구인 Umami 는 이 다섯 칸만 자동으로 받아서 보여 줘요. 별도 설정은 필요 없고, 다른 이름으로 붙인 값은 읽지 않아요.
| 칸 | 묻는 것 | 예시 |
|---|---|---|
utm_source | 어디에서 왔나요 | instagram, kakao, newsletter |
utm_medium | 어떤 종류의 통로인가요 | social, community, email |
utm_campaign | 어떤 시도였나요 | 글 하나, 이벤트 하나 |
utm_content | 같은 시도 안에서 어느 버전인가요 | carousel, bio |
utm_term | 어떤 검색어였나요 | 유료 검색 광고를 돌릴 때만 |
처음부터 다섯 칸을 다 쓸 필요는 없어요. 저희는 앞의 네 칸만 쓰고, utm_term 은 유료 검색 광고를 돌리는 날까지 비워 두기로 했어요. 쓰지 않는 칸을 규칙에 넣어 두면 나중에 아무도 지키지 않는 규칙이 돼요.
칸마다 의미를 한 줄로 고정하기
가장 흔한 실패는 사람마다 칸의 뜻을 다르게 이해하는 거예요. 한 사람은 medium 에 instagram 을 쓰고, 다른 사람은 source 에 social 을 써요. 통계 화면에서는 이 둘이 전혀 다른 항목으로 갈라져요.
그래서 이렇게 못 박아요.
source는 채널의 이름이에요. 서비스나 사이트 이름이 들어가요.medium은 채널의 종류예요. 한 줄로 셀 수 있을 만큼 종류가 적어야 해요.campaign은 한 번의 시도예요. 서비스 이름이 아니라 "이번에 올린 이 글", "이번 달 이벤트" 같은 것이에요.content는 같은 시도 안에서 링크가 놓인 자리나 모양이에요.
저희가 쓰는 표는 이렇게 생겼어요. 인스타그램은 같은 글이라도 캐러셀(여러 장 넘겨 보는 게시물)에 넣은 링크와 프로필에 걸어 둔 링크를 따로 세고 싶어서 content 를 나눴어요.
| 채널 | source | medium | content |
|---|---|---|---|
| 인스타그램 캐러셀 | instagram | social | carousel |
| 인스타그램 팁 카드 | instagram | social | tip |
| 인스타그램 프로필 링크 | instagram | social | bio |
| 디스콰이엇 | disquiet | community | post |
| GeekNews | geeknews | community | post |
| Product Hunt | producthunt | community | post |
campaign 은 표에 없죠. 그 칸에는 올리는 글의 주소 이름(slug)을 그대로 넣어요. 글이 하나 나갈 때마다 캠페인이 하나 생기는 셈이에요.
TIP
값은 전부 영어 소문자에 띄어쓰기 없이 써요. 도구에 따라 Instagram 과 instagram 을 다른 값으로 세기 때문이에요. 단어를 이어야 하면 하이픈(-)을 쓰고, 한글은 주소에서 깨질 수 있으니 피해요.
내 경우에 맞게 바꿀 점
채널이 두세 개뿐이라면 위 표를 줄여도 돼요. 반대로 뉴스레터를 보낸다면 source 는 newsletter, medium 은 email 로 한 줄을 더하세요. 중요한 건 표의 크기가 아니라, 표 밖의 값을 쓰지 않는다는 약속이에요.
2단계. 링크를 손으로 쓰지 않고 한 곳에서 만들기
표를 만들어도 링크를 사람이 손으로 쓰면 규칙은 금방 깨져요. 급하게 올리다가 utm_sorce 로 오타를 내거나, 복사해 둔 지난주 링크의 캠페인 이름을 바꾸지 않고 재사용하기도 해요. 오타는 에러로 드러나지 않고, 그냥 이상한 항목이 통계에 조용히 하나 더 생겨요.
해결은 간단해요. 링크를 만드는 곳을 한 군데로 정하고, 채널 이름만 넣으면 완성된 주소가 나오게 해요. 스프레드시트의 수식이어도 되고, 짧은 코드여도 돼요. 저희는 코드로 만들어요. 핵심은 이 정도예요.
const channels = { "instagram-carousel": { source: "instagram", medium: "social", content: "carousel" }, "instagram-bio": { source: "instagram", medium: "social", content: "bio" }, geeknews: { source: "geeknews", medium: "community", content: "post" },} as const function utmUrl(channel: keyof typeof channels, slug: string): string { const { source, medium, content } = channels[channel] const url = new URL(`https://example.com/blog/${slug}`) url.searchParams.set("utm_source", source) url.searchParams.set("utm_medium", medium) url.searchParams.set("utm_campaign", slug) url.searchParams.set("utm_content", content) return url.toString()}이렇게 해 두면 좋은 점이 세 가지 있어요.
- 채널 이름을 표에 없는 걸로 부르면 코드가 컴파일 단계에서 막아 줘요. 오타가 통계까지 못 가요.
- 주소를 직접 조립하지 않고
URLSearchParams에 맡기니, 특수 문자가 들어가도 인코딩이 맞게 돼요. - 채널을 하나 늘리고 싶으면 표에 한 줄을 더하면 끝이에요. 링크를 만드는 방법이 딱 하나뿐이라 따로 외울 것이 없어요.
저희는 여기에 테스트도 붙여 두었어요. 채널마다 "이 이름이면 이 주소가 나와야 한다"를 한 줄씩 적어서, 누가 표의 값을 슬쩍 바꾸면 테스트가 실패해요. UTM 값이 몰래 바뀌면 지난달과 이번 달의 숫자를 이어서 볼 수 없게 되기 때문이에요.
도착지가 둘이면 규칙도 한 줄 더
홍보 글에서 걸어 둘 도착지는 보통 두 가지예요. 글 주소로 보낼지, 서비스 첫 화면으로 보낼지요. 저희는 이것도 링크를 만드는 곳에서 고르게 했어요. 커뮤니티 글은 글 주소와 서비스 주소 중에서 고르고, 인스타그램은 항상 글 주소로 보내요. 이유는 3단계에서 나와요.
TIP
링크 만드는 곳이 하나면 "이 링크 누가 만들었어요?"라는 질문이 사라져요. 스프레드시트로 시작한다면 채널 이름을 드롭다운으로 고르게 하고, 주소는 수식이 이어 붙이게 해 두세요. 손으로 칠 곳이 글 주소 하나만 남아요.
3단계. 바깥에서 들어오는 링크에만 붙이기
UTM 은 "이 방문이 어디서 왔는지"를 적는 칸이에요. 그래서 붙일 곳은 사이트 바깥에서 사이트 안으로 들어오는 링크뿐이에요. 사이트 안의 버튼이나 메뉴에 붙이고 싶은 마음이 들 수 있는데, 저희는 이렇게 판단해서 붙이지 않기로 했어요.
- 내부 링크에 UTM 을 붙이면, 다음 페이지뷰가 진짜 출처를 내부 값으로 덮어써요. 검색에서 온 방문이 우리가 만든 가짜 캠페인으로 기록돼요. 알고 싶은 정보를 지워 버리는 설정이에요.
- Umami 의 UTM 보고서는 조회수를 값별로 나눠 보여 줘요. 내부 UTM 은 존재하지 않는 캠페인을 목록에 계속 만들어요.
- 같은 화면이 파라미터마다 다른 주소가 되어, 검색 엔진에는 중복 페이지로 보일 수 있어요.
- 방문자가 주소창을 복사해 친구에게 공유하면, 그 친구의 방문이 우리의 내부 캠페인으로 기록돼요.
"어느 버튼이 눌렸는지"가 궁금하다면 맞는 도구는 UTM 이 아니라 클릭 이벤트예요. Umami 는 버튼에 data-umami-event 속성을 붙이는 것만으로 클릭을 세요. 출처는 UTM 이, 행동은 이벤트가 맡는 거예요.
바깥에서 들어오는 링크에는 붙이고, 사이트 안의 링크에는 붙이지 않아요
붙이는 자리와 붙이지 않는 자리
| 자리 | UTM | 이유 |
|---|---|---|
| 커뮤니티에 올리는 글 속 링크 | 붙여요 | 사이트 바깥에서 들어와요 |
| 뉴스레터와 메일 본문 | 붙여요 | 메일은 출처가 비어 보이기 쉬워요 |
| 카카오톡, 오픈채팅에 돌리는 링크 | 붙여요 | 메신저는 출처가 대부분 사라져요 |
| 인쇄물과 오프라인 QR | 붙여요 | 통계에서 다른 방법으로는 구분이 안 돼요 |
| 사이트 안의 메뉴, 버튼, 배너 | 붙이지 않아요 | 진짜 출처를 덮어써요 |
| 검색 결과로 들어오는 주소 | 붙이지 않아요 | 검색 엔진이 출처를 이미 알려 줘요 |
인스타그램 캡션에는 링크가 없어요
인스타그램 게시물의 캡션 안 주소는 눌러도 이동하지 않아요. 그래서 캡션에 UTM 링크를 넣는 건 의미가 없어요. 저희는 캡션에 주소를 넣지 않고, 프로필에 걸어 둔 링크에만 content=bio 를 붙여요. 그래서 지금 인스타그램 유입을 세는 가장 확실한 값은 bio 예요. 표에 carousel 과 tip 을 남겨 둔 건, 나중에 링크가 눌리는 자리가 생겨도 값을 새로 정하지 않으려는 거예요.
참고
인스타그램 앱 안에서 링크를 열면 앱 내장 브라우저가 쓰여서, 같은 방문이 평소와 다르게 기록될 수 있어요. 숫자가 기대보다 작게 나오면 UTM 이 틀렸다고 결론 내리기 전에 먼저 이 점을 의심해 보세요. 이 부분은 저희가 직접 비교해 확인한 것이 아니라 가능성으로 알고 있는 내용이에요.
4단계. 도착을 확인하고 읽는 법 정하기
링크를 만들고 올리기 전에, 딱 한 번 시험해 보세요. UTM 은 잘못 붙여도 사이트는 멀쩡하게 열려서, 숫자가 비어 있는 걸 한참 뒤에야 알게 돼요.
시험 링크로 도착 확인하기
운영 주소 뒤에 시험용 값을 붙여서 열어 봐요.
https://example.com/?utm_source=test&utm_medium=test&utm_campaign=test열고 나서 몇 분 뒤 Umami 의 UTM 보고서에 test 세 개가 보여야 해요. 보이지 않는다면 대부분 두 가지 중 하나예요.
- 추적 스크립트에
data-exclude-search옵션이 켜져 있어요. 이 옵션은 주소 뒤의 쿼리 문자열을 통째로 버려서 UTM 도 함께 사라져요. UTM 을 쓸 거라면 켜지 않아요. - 링크가 중간에서 값을 잃어요. 어떤 단축 주소나 리다이렉트는 주소 뒤쪽을 잘라 버려요. 단축 주소를 쓴다면 그 주소로 연 뒤에도 같은 시험을 해 보세요.
내부 버튼을 눌러 다른 페이지로 이동해도 보고서에 새 캠페인이 생기지 않는지도 같이 확인해요. 3단계의 규칙이 지켜지고 있다는 증거예요.
검색 엔진에는 UTM 이 없는 주소를 알려 주기
UTM 이 붙은 주소와 붙지 않은 주소는 검색 엔진에 서로 다른 주소처럼 보일 수 있어요. 그래서 페이지의 대표 주소(canonical)를 UTM 이 없는 깨끗한 주소로 지정해 두세요. 저희는 완료 기준에 "UTM 을 붙여 열어도 대표 주소는 파라미터 없는 주소"를 넣고 확인했어요.
숫자를 읽을 때의 약속
UTM 이 알려 주는 건 "어디서 왔는지"까지예요. 그 방문이 만족했는지, 결과를 만들었는지는 모르죠. 그래서 숫자를 읽는 순서를 미리 정해 둬요.
- 채널별 방문 수를 봐요. 어느 채널이 사람을 데려오는지가 첫 번째 질문이에요.
- 그 방문이 핵심 행동까지 갔는지를 봐요. 방문만 많고 아무도 다음 화면으로 가지 않는다면, 그 채널은 사람을 잘못 데려온 것일 수 있어요. 이 단계는 UTM 이 아니라 퍼널(단계별 이동률)로 봐요.
- 방문이 몇 건 안 될 때는 결론을 미뤄요. 한두 명의 방문으로 채널의 우열을 가리면 거의 틀려요.
숫자는 따로 대시보드를 열어야 보이면 결국 안 보게 돼요. 매일 받는 요약 메시지나 메일에 지난 7일의 source 와 campaign 별 방문 수를 한 줄씩 넣어 두는 쪽을 권해요. 저희도 그 방향으로 요약에 넣을 계획이지만, 아직 연결하지 않아서 지금은 Umami 의 UTM 보고서로 직접 확인해요.
TIP
처음 한 달은 채널 비교보다 "UTM 이 하나라도 잡히는가"만 확인하세요. 값이 몇 개 쌓이기 전에 순위를 매기면 숫자에 맞춰 이야기를 만들게 돼요.
자주 묻는 질문
Q1. UTM 은 꼭 campaign 까지 채워야 하나요?
source 와 medium 만 채워도 채널별 합계는 낼 수 있어요. 다만 campaign 이 비면 "이 채널에서 어떤 글이 효과가 있었는지"를 나눠 볼 수 없어요. 채널 비교가 목적이면 둘만으로 시작하고, 글이나 이벤트별 비교가 필요해질 때 campaign 을 더해도 늦지 않아요.
Q2. 이미 만들어서 올려 버린 링크의 값이 틀렸어요. 고칠 수 있나요?
이미 올린 링크는 주소 자체를 바꿔야 해서, 대부분 글을 수정하거나 새 링크로 바꿔 올려야 해요. 통계에 쌓인 틀린 항목은 지울 수 없는 경우가 많아서, 보고서를 볼 때 그 항목을 같은 채널로 합쳐서 읽는 쪽이 현실적이에요. 그래서 링크를 올리기 전에 4단계의 시험을 한 번 거치는 게 중요해요.
Q3. 방문자가 UTM 이 붙은 주소를 그대로 복사해 퍼뜨리면요?
피할 수 없는 일이에요. 방문자가 주소창을 복사해 친구에게 주면, 친구의 방문도 같은 채널로 기록돼요. 그래서 UTM 숫자는 정확한 개수가 아니라 대략의 비중으로 읽어야 해요. 특히 방문 수가 적을수록 이런 오차가 크게 보여요.
정리
- UTM 은 사이트 바깥에서 들어오는 링크에만 붙여요. 내부 링크에 붙이면 진짜 출처가 지워져요.
source는 채널 이름,medium은 채널 종류,campaign은 한 번의 시도로 칸의 뜻을 고정해요.- 값은 영어 소문자로, 표 한 장에 정해 두고 표 밖의 값은 쓰지 않아요.
- 링크는 손으로 쓰지 않고 한 곳에서 만들어서 오타가 통계까지 가지 못하게 해요.
- 올리기 전에 시험 링크로 보고서에 값이 찍히는지 확인하고,
data-exclude-search는 켜지 않아요.
어디서 왔는지 아는 것만으로도 다음 주에 쓸 시간이 달라져요. 규칙은 표 한 장이면 충분하니, 오늘 채널 두 개만 정해서 시험 링크부터 열어 보세요.