Victor

[연재] 쿠팡 파트너스 시작하기 — 배너부터

연재 · 2026-08-24

제 사이트에 달린 버튼인데, 수수료는 남이 받고 있었습니다

 

키보드 스위치 찾기 도구에는 축마다 최저가 라는 파란 버튼이 붙어 있어요. 네이버 쇼핑에서 국내 최저가를 받아다 붙인 자리입니다. 그 버튼이 어디로 가는지 주소를 한번 뜯어봤어요.

 

https://link.coupang.com/re/PCSNAVERPCSDP?pageKey=9428894465
   &ctag=9428894465&lptag=I28031845224&itemId=28031845224
   &vendorItemId=95679545016&spec=10305199

 

쿠팡 주소가 맞긴 맞아요. 그런데 앞에 붙은 PCSNAVERPCSDP 가 뭘까요. 네이버가 자기 제휴 코드를 박아둔 링크입니다. 네이버 쇼핑이 "이 상품 쿠팡에서 파네요" 하고 알려줄 때 내주는 주소인데, 이걸 그대로 가져다 제 사이트에 붙이면 어떻게 될까요.

 

제 화면에서 제 방문자가 누르는데, 수수료는 네이버가 받습니다.

 

 

배너 자체는 오전 한나절 만에 다 붙였어요. 배너 파일 두 장에 찍힌 시각이 10시 49분과 11시 07분입니다. 정말 쉬웠어요. 그런데 그렇게 붙여놓고 화면을 들여다보다가 이걸 발견한 거예요. 광고를 붙인다는 건 배너 코드를 복사해 넣는 일이 아니라, 클릭이 나가는 자리마다 그게 누구 링크인지 확인하는 일이더라고요.

 

오늘은 그 얘기입니다. 쉬웠던 절반과, 안 쉬웠던 절반이요.

 

먼저 쉬웠던 절반 — 배너 붙이기

 

쿠팡 파트너스에 가입하면 대시보드에서 배너 코드를 만들어 줍니다. 코드라고 해봐야 자바스크립트 몇 줄이에요. 배너 크기를 고르면 그 크기짜리 코드가 나옵니다.

 

제가 만든 건 두 개예요. 데스크톱용 728×90 하나, 모바일용 320×100 하나. 배너마다 번호가 붙는데 각각 1008304, 1008305 입니다. 그리고 추적 코드 AF8736762 — 이게 "이 클릭은 내 것"이라고 알려주는 값이라, 이게 틀리면 아무리 눌러도 제 수익이 아닙니다.

 

이걸 web_publish/ads/coupang-bar.html 이라는 파일 한 장에 넣었어요. 화면 맨 아래에 항상 떠 있는 고정 바입니다.

 

 

가까이 보면 이렇게 생겼어요.

 

 

여기 손댄 게 세 가지예요.

 

첫째, 닫기 버튼. 오른쪽 위 × 를 누르면 바가 사라지고, 브라우저에 "닫은 시각"이 기록됩니다. 그리고 24시간 동안은 다시 안 뜹니다. 영영 안 뜨게 하면 광고가 죽고, 매번 뜨게 하면 사람이 짜증나요. 하루가 적당하다고 봤습니다.

 

둘째, 화면 폭에 따라 배너를 갈아끼웁니다. 폭이 600px 아래면 데스크톱 배너를 숨기고 모바일 배너를 보여줘요. 728짜리 배너를 폰에 그대로 밀어넣으면 화면 밖으로 삐져나가서 가로 스크롤이 생깁니다.

 

 

셋째, 인쇄할 때는 안 나옵니다. 육아휴직 계산 결과를 뽑아서 회사에 낼 사람이 있을 텐데, 거기 쿠팡 배너가 같이 찍히면 좀 그렇잖아요. 한 줄이면 되는 일이에요.

 

도구에는 붙이고, 글 목록에는 안 붙였습니다

 

같은 바가 육아휴직 계산기에도, 카드 혜택에도 똑같이 붙습니다.

 

 

 

배포할 때 inject-ads.py 라는 작은 스크립트가 도구 페이지마다 이 파일을 </body> 앞에 끼워 넣어요. 도구를 하나 더 만들면 줄 하나만 늘리면 됩니다.

 

여기에 안전장치를 하나 걸었어요. 배너 코드를 아직 안 붙여넣은 상태(자리 표시 문구가 그대로 남아 있는 상태)면 아무것도 안 넣고 조용히 건너뜁니다. 빈 광고 껍데기가 배포되는 것보다는 없는 게 낫거든요.

 

반대로 홈 화면과 글 목록에는 배너가 없습니다.

 

 

 

여긴 사람이 "뭘 읽을까" 하고 고르는 자리예요. 고르는 중에 광고를 들이미는 건 순서가 아니라고 봤습니다. 대신 글은 다 읽고 나서 한 번 보여줍니다. 본문이 끝나고 댓글이 시작되기 전, 딱 그 자리 한 곳이에요.

 

 

광고 코드를 사이트 만드는 코드 안에 두지 않은 이유

 

여기서 결정을 하나 했는데, 이게 나중에 제일 고마웠어요.

 

사이트를 만드는 build.py 는 글 하나하나를 HTML로 찍어내는 파일입니다. 배너를 넣을 자리도 당연히 여기예요. 그런데 배너 코드를 여기 직접 박지 않았습니다. 대신 눈에 안 보이는 표시 하나만 남겨뒀어요.

 

# 글 본문이 끝난 자리. 배포할 때 web_publish/inject-inline-ads.py 가 여기를
# 쿠팡 배너로 바꾼다. 광고 코드를 여기 두지 않는 이유는 — 도구 페이지가 쓰는
# 배너와 같은 자리(web_publish/ads/)에 있어야 트래킹 코드가 갈라지지 않기
# 때문이다. 주입하지 않으면 그냥 눈에 안 보이는 주석으로 남는다.
AD_SLOT = "<!--INLINEAD-->"

 

이게 무슨 말이냐면요. 배너 코드가 두 군데(도구용 파일, 글용 파일)에 흩어져 있으면, 나중에 추적 코드를 바꾸거나 배너 크기를 손볼 때 한 곳만 고치고 다른 곳을 잊습니다. 그러면 사이트 절반은 새 코드, 절반은 옛 코드로 굴러가요. 눈으로는 똑같이 보이는데 정산이 두 갈래로 갈립니다.

 

그래서 배너의 정본은 ads/ 폴더 한 곳에만 두고, 글에는 <!--INLINEAD--> 라는 표시만 심어놨습니다. 배포할 때 스크립트가 그 표시를 찾아 배너로 바꿔요. 표시가 없는 페이지(홈·글 목록)는 손도 안 댑니다. 아까 말한 "홈에는 광고가 없다"가 별도 규칙이 아니라 표시를 안 심었으니 자동으로 그렇게 되는 것이고요.

 

그리고 이 바꿔치기는 몇 번을 돌려도 결과가 같습니다. 이미 배너가 들어간 페이지를 다시 만나면 그걸 도로 표시로 되돌린 다음 새로 넣어요. 배포는 하루에도 몇 번씩 도는 일이라, 두 번 돌렸다고 배너가 두 개 쌓이면 안 되거든요.

 

그런데 배너는 아무 상품이나 돕니다

 

여기까지가 그 한나절입니다. 붙여놓고 화면을 봤어요.

 

키보드 스위치 931개를 소리와 무게로 걸러 보여주는 페이지 아래에, 쿠팡 배너가 곡물바 · 아몬드 · A4용지 · 고양이 모래 · 옷걸이를 돌리고 있었습니다.

 

 

이게 잘못된 건 아니에요. 배너는 원래 그런 물건입니다. 방문자가 전에 뭘 봤는지, 지금 뭐가 잘 팔리는지로 상품을 골라 돌려요. 제 페이지가 무슨 얘기를 하고 있는지는 모릅니다.

 

그런데 스위치를 고르러 온 사람한테 옷걸이를 내미는 건, 광고로도 좀 아깝잖아요. 방금 "이 축 사고 싶다"고 마음먹은 사람 앞에 있어야 할 건 그 축이지 옷걸이가 아니에요.

 

그래서 필요한 게 배너가 아니라 그 상품으로 바로 가는 링크입니다. 그리고 그 링크는 반드시 제 링크여야 하고요. 여기서 맨 앞의 그 문제로 돌아옵니다.

 

pageKey 와 itemId — 남의 링크에서 상품번호만 꺼내기

 

네이버가 준 링크를 다시 볼게요.

 

link.coupang.com/re/PCSNAVERPCSDP?pageKey=9428894465&itemId=28031845224...

 

이 주소를 그대로 쓰면 안 된다는 건 알았어요. 그렇다고 버리자니 아까웠습니다. 여기엔 제가 손으로 찾으려면 한참 걸릴 정보가 들어 있거든요. pageKey 가 쿠팡 상품번호고, itemId 가 그 상품 안의 옵션 번호입니다.

 

이 둘만 있으면 쿠팡 상품 주소를 다시 조립할 수 있어요.

 

https://www.coupang.com/vp/products/9428894465?itemId=28031845224

 

이건 아무 제휴 코드도 안 붙은, 그냥 그 상품 페이지입니다. 그리고 쿠팡 파트너스에는 이런 평범한 주소를 넣으면 내 코드가 박힌 링크로 바꿔주는 창구가 있어요. 딥링크라고 부릅니다.

 

정리하면 이렇게 됩니다.

 

1. 네이버가 알려준 링크에서 상품번호와 옵션번호만 꺼낸다 2. 그걸로 맨 상품 주소를 되만든다 3. 파트너스에 넣어 내 링크를 받는다

 

네이버가 찾아준 수고는 쓰되, 수수료는 제가 받는 거예요. 이 세 줄이 coupang_deeplink.py 라는 파일의 전부입니다.

 

서명에 적는 시각은 한국 시각이 아닙니다

 

파트너스 창구는 아무나 못 두드려요. 요청할 때마다 서명을 만들어 붙여야 합니다. 열쇠 두 개(공개키·비밀키)로 "이 요청은 내가 보낸 게 맞다"를 증명하는 절차인데, 그 서명 안에 시각이 들어갑니다.

 

이 시각이 함정이에요. 코드에 이렇게 적어놨습니다.

 

def auth(method, path, ak, sk):
    """파트너스는 HMAC 서명을 요구한다. 시각은 GMT 여야 한다 —
    한국 시각으로 만들면 9시간 어긋나 전부 401 이 된다."""

 

한국은 세계 표준시보다 9시간 빠릅니다. 그래서 서명에 한국 시각을 적으면 상대 쪽에서는 "9시간 뒤 미래에서 온 요청"으로 읽혀요. 그런 건 안 받아줍니다. 전부 거절이에요.

 

거절 메시지에는 "시간대가 틀렸다"고 안 적혀 있습니다. 그냥 인증 실패라고만 나와요. 열쇠를 다시 발급받고, 오타를 찾고, 문서를 다시 읽다가 마지막에야 시각을 의심하게 되는 종류의 문제입니다. 이런 줄은 겪고 나서야 붙는 주석이에요.

 

50개를 보냈으면 50개가 돌아옵니다. 순서는요?

 

한 번에 50개씩 묶어 보냅니다. 900개를 하나씩 보내면 오래 걸리기도 하고, 상대 쪽에도 실례거든요.

 

여기서 붙잡은 게 하나 있어요. 50개를 보내면 50개가 돌아옵니다. 그런데 보낸 순서대로 돌아온다는 보장이 어디에도 없어요.

 

보낸 순서를 믿고 첫 번째 답을 첫 번째 축에, 두 번째 답을 두 번째 축에 짝지었다고 해볼게요. 순서가 한 칸이라도 밀리면 TTC 골드핑크 자리에 오테뮤 크림옐로우 링크가 들어갑니다. 화면은 멀쩡해요. 버튼도 잘 눌리고, 쿠팡 페이지도 잘 열립니다. 다만 사려던 것과 다른 물건이 열릴 뿐이에요.

 

그리고 이건 아무도 신고 안 해줍니다. 방문자는 "아 이 사이트 링크가 이상하네" 하고 그냥 나가요.

 

# 응답 순서가 보낸 순서와 같다는 보장이 없어, 원래 주소로 맞춘다.
by_url = {d.get("originalUrl"): d.get("shortenUrl") or d.get("landingUrl")
          for d in got}

 

답에 "이건 네가 보낸 이 주소에 대한 답이야"라고 원래 주소가 같이 들어 있어요. 순서 대신 그걸로 짝을 맞춥니다. 코드는 두 줄이지만, 이 두 줄이 있고 없고가 "링크가 다 붙었다"와 "링크가 다 붙었는데 전부 다른 물건"을 가릅니다.

 

링크는 한 곳에만 적습니다

 

발급받은 링크를 어디에 저장할까. 이게 은근히 중요한 결정이었어요.

 

제 스위치 얘기는 지금 네 군데에서 나갑니다. 사이트의 스위치 찾기 도구, 유튜브 쇼츠, 그 쇼츠 설명란, 그리고 댓글이요. 링크를 네 군데에 따로 적어두면 어떻게 될까요. 하나 고칠 때 세 개가 낡습니다. 단종된 상품 링크를 새 걸로 바꿨는데 설명란에는 옛날 링크가 그대로 남아 있고, 그걸 알아채는 건 몇 달 뒤예요.

 

그래서 링크를 적는 파일을 딱 한 장으로 정했습니다. buy.json 이에요.

 

{
 "223554360854": "https://link.coupang.com/a/fHC6o1OxCm",
 "223402071778": "https://link.coupang.com/a/fHCwMG8XQW",
 "223396192455": {
  "url": "https://link.coupang.com/a/fHCtzAXdfg",
  "note": "※ V2 는 단종되어 V3 판매 링크입니다"
 }
}

 

왼쪽은 글 번호, 오른쪽은 링크. 네 군데가 전부 이 파일을 봅니다. 여기만 채우면 네 군데가 같이 붙어요.

 

지금 스위치 찾기 도구에서 구매 버튼이 달린 카드를 눌러보면, 그 주소가 바로 이 파일에서 나온 겁니다.

 

 

세 번째 줄에 있는 note 를 봐주세요. "※ V2 는 단종되어 V3 판매 링크입니다."

 

이건 기계가 못 적는 줄이에요. 제가 리뷰한 건 오테뮤 피치 V2 인데 지금 쿠팡에서 파는 건 V3 뿐입니다. 링크를 안 걸면 사려는 사람이 헤매고, 그냥 걸면 리뷰한 물건과 다른 걸 파는 게 돼요. 그래서 링크는 걸되 다른 물건이라고 화면에 적기로 한 겁니다. 이런 건 규칙으로 안 만들어져요. 물건을 아는 사람이 한 줄씩 붙이는 수밖에 없습니다.

 

그래서 지금 몇 개 붙었냐면, 17개입니다

 

축은 931개인데 구매 링크가 달린 건 17개예요. 도구 화면에서 세어봐도 정확히 17개입니다.

 

이유가 두 가지 적혀 있어요.

 

# 스위치는 알리에서 산다. 쿠팡은 최종승인이 막혀 17개밖에 못 붙였고,
# 네이버 최저가는 우리 링크가 아니다.

 

# 스위치는 대부분 알리에서 산다. 국내에 안 들어온 축이 훨씬 많아 쿠팡 링크는
# 17개밖에 못 붙였는데, 편집표에 영문 정품명이 다 채워져서 이제 이름만으로 붙는다.

 

931개 중 17개. 솔직히 초라한 숫자예요. 그런데 이 17개는 제가 하나하나 쿠팡에서 검색해서 "이게 그 축이 맞다"고 확인한 것들입니다. 링크를 만들 때 쓴 목록도 남아 있어요. 축 이름과 쿠팡 검색 주소를 나란히 적어둔 표인데, 저기서 링크를 만들어 글 번호와 짝지어 채웠습니다.

 

나머지 914개를 이름으로 검색해서 자동으로 붙이면 어떻게 될까요. 안 해본 게 아니라, 다른 쇼핑몰에서 실제로 재봤어요. 결과는 이랬습니다. 축 이름을 그대로 넣으면 8건 중 8건이 결과 0이고, 이름을 깎아서 넣으면 결과는 뜨는데 엉뚱한 축이 옵니다. '카일 Choc 갈축' 자리에 '카일 박스 갈축'이 떴어요. 이름 두 글자 차이인데 완전히 다른 물건입니다.

 

여기에 대해 코드에 이렇게 적어놨습니다.

 

상품 제목이 우리 표와 어긋나면 바꾸지 않는다. '오테뮤 Ocean 택타일' 줄에 걸린 최저가 상품이 '오테뮤 저소음 바다축 Ocean Silent 리니어' 였다 — 종류도 소음도 다른 축이다. 남의 링크로 남겨 두는 건 네이버가 찾아 준 판매처를 그대로 보여주는 것이지만, 우리 제휴 링크로 바꾸면 그 축이라고 보증하는 말이 된다. 어긋난 줄은 손대지 않는다.

 

이게 제가 오늘 하고 싶은 말입니다. 남의 링크를 그대로 두는 건 "네이버가 여기 판다더라"를 전하는 일이고, 제 링크로 바꾸는 건 "이게 그 물건이 맞다"고 제가 말하는 일이에요. 수수료를 받는 순간 그 말에 책임이 붙습니다. 그래서 확신이 없는 914개는 비워뒀어요. 비워둔 자리는 수익이 0이지만, 잘못 채운 자리는 수익보다 비싼 걸 잃습니다.

 

링크가 있는 글에는 배너를 안 붙입니다

 

마지막으로 규칙 하나 더요. 어떤 글에는 배너 대신 이런 게 붙습니다.

 

 

"이 글에서 다룬 제품" 이라는 조용한 카드예요. 방금 읽은 그 키보드로 바로 갑니다. 이 카드가 붙은 글에는 쿠팡 배너를 넣어요. 이유는 두 가지입니다.

 

하나는 방금 읽은 그 제품을 내미는 게 아무 상품이나 도는 배너보다 낫기 때문이고, 다른 하나는 한 화면에 광고 블록이 둘씩 쌓이면 읽는 맛이 나빠지기 때문입니다. 광고 심사 점수에도 안 좋고요.

 

그리고 저 카드 아래에는 이 문장이 반드시 붙습니다.

 

제휴 링크입니다. 이 링크로 구매하시면 글쓴이가 일정액의 수수료를 받습니다. 가격은 같습니다.

 

이건 예의가 아니라 의무예요. 링크 자체에도 "대가를 받는 링크"라는 표시(sponsored)를 붙입니다. 빠뜨리면 검색 평가에서 불이익을 받아요.

 

광고를 달기 전에 먼저 있어야 하는 문서

 

배너를 붙이자마자 알게 된 건데, 개인정보처리방침이 없으면 광고를 못 답니다. 쿠팡 배너는 노출과 클릭을 구분하려고 쿠키를 쓰고, 쿠키를 쓰면 그걸 어디에 적어놔야 하거든요.

 

 

그래서 하단 고정 바에 개인정보처리방침 링크를 같이 넣었습니다. 이것도 그냥 넣은 게 아니에요.

 

<!-- 도구 페이지에는 본진 같은 푸터가 없다(각자 자기 화면을 꽉 쓴다).
     개인정보처리방침으로 가는 길이 어디엔가는 있어야 하는데, 광고 고지
     문구 옆이 원래 그런 것들이 모이는 자리라 여기 붙인다. -->

 

도구 페이지는 화면을 꽉 채워 쓰느라 아래쪽 링크 모음이 없어요. 그런데 방침으로 가는 길은 어디엔가 있어야 합니다. 고지 문구 옆이 원래 그런 것들이 모이는 자리라 거기 붙였어요. 이 얘기는 다음에 따로 하겠습니다.

 

그래서 얼마 벌었냐면요

 

이 글을 쓰던 8월 19일 저녁 기준으로 누적 방문자가 821명이었습니다. 그날 하루는 5명이었고요.

 

수익은 0원입니다.

 

배너를 달고, 크기별로 갈라놓고, 인쇄에서 빼고, 링크의 주인을 따지고, 서명 시각을 맞추고, 응답 순서를 의심하고, 링크 적는 자리를 한 곳으로 모으고 — 그래서 번 돈이 0원이에요.

 

그래도 이 순서가 틀렸다고 생각하진 않습니다. 트래픽은 나중에 올 수도 있고 안 올 수도 있어요. 그런데 트래픽이 온 다음에 링크의 주인을 고치려면, 그 사이에 나간 클릭은 이미 남의 것입니다. 배너를 붙이는 데 한나절, 링크가 누구 것인지 따지는 데 그 뒤로 닷새. 이 비율이 이상해 보이지만, 나중에 후회가 남는 쪽은 확실히 앞쪽이 아니더라고요.

 

정리하면 이번 편에서 사람이 붙잡은 자리는 이런 것들이었어요.

 

  • 네이버가 준 링크를 그대로 붙일 뻔한 것. 주소를 안 뜯어봤으면 몰랐습니다. 화면상으로는 완벽하게 잘 작동하는 버튼이었어요.
  • 914개를 자동으로 채우지 않기로 한 것. 채울 수는 있었어요. 다만 절반쯤은 다른 물건이었을 겁니다.
  • 단종된 상품에 한 줄 붙인 것. "V2 는 단종되어 V3 판매 링크입니다" 는 물건을 아는 사람만 쓸 수 있는 문장이에요.

 

기계가 잘한 건 따로 있습니다. 주소에서 상품번호를 꺼내는 규칙, 50개씩 묶어 보내는 처리, 몇 번을 돌려도 배너가 겹치지 않게 하는 장치, 화면 폭에 따라 배너를 갈아끼우는 코드 — 이건 제가 손으로 하면 며칠 걸렸을 거고 중간에 틀렸을 거예요.

 

규칙을 코드로 옮기는 건 기계가 훨씬 잘합니다. 그런데 "이게 그 물건이 맞다"고 말하는 건 아직 사람 몫이에요. 수수료가 붙는 순간 그건 말이 아니라 약속이 되니까요.

 

다음 편에서는 이 광고를 어디에 둘지 — 도구는 왜 고정 바이고 글은 왜 본문 끝인지, 그걸 정하면서 재본 것들을 적어보겠습니다.

 

#쿠팡파트너스 #제휴마케팅 #애드센스 #배너광고 #딥링크 #블로그수익화 #수익형블로그 #개인홈페이지 #정적사이트 #CloudflarePages #클로드 #ClaudeCode #바이브코딩 #AI활용법 #휴먼인더루프 #키보드스위치 #스위치찾기 #기계식키보드 #커스텀키보드 #네이버쇼핑API #오픈API #HMAC서명 #파이썬 #자동화 #사이드프로젝트 #1인개발 #웹사이트만들기 #광고수익 #개인정보처리방침 #빅터하우스

댓글

    로그인 없이 쓰는 대신, 등록한 댓글은 직접 지울 수 없습니다. 지워야 할 댓글은 옆의 신고를 눌러주세요.
    네이버 블로그글 원문 보러가기 →유튜브 쇼츠만드는 장면 20초로 보기 →
    관리자 Victor · 문의는 우상단 신고·제안으로 남겨주세요.
    글과 화면은 정적 파일로 만듭니다. 댓글과 조회수만 외부 데이터베이스에 저장합니다 — 개인정보처리방침

    오류 신고 · 제안

    관리자 Victor에게 전달됩니다