메타 전환 API: 픽셀 없이 광고에서 온 문의를 광고와 연결하는 방법
메타 광고를 켜기 전에 하나가 걸렸습니다. 광고 플랫폼이 "이 광고를 보고 문의까지 한 사람이 몇 명인가"를 알아야 그 기준으로 예산을 쓰는데, 그걸 알려 주는 정석은 사이트에 메타 픽셀을 붙이는 것입니다. 그런데 저희 사이트는 쿠키를 하나도 안 만드는 구조로 만들어 두었고, 개인정보 처리방침에도 그렇게 적어 두었습니다. 픽셀은 _fbp 쿠키를 심습니다.
픽셀을 붙이면 처리방침을 고치고 쿠키 배너를 달아야 합니다. 안 붙이면 메타는 클릭 수만 보고 예산을 씁니다. 둘 다 싫었습니다.
픽셀이 하는 일 두 가지, 표식 남기기와 알리기
픽셀 스크립트가 브라우저에서 하는 일을 나눠 보면 둘입니다. 방문자가 광고를 타고 들어왔다는 표식을 쿠키에 남기는 것, 그리고 문의 같은 행동이 일어났을 때 그 표식과 함께 메타에 알리는 것.
메타는 두 번째 일을 서버가 대신할 수 있게 전환 API 를 열어 두었습니다. 보통은 픽셀과 전환 API 를 같이 써서 광고 차단기에 막힌 만큼을 서버가 메꾸는 용도로 씁니다. 저는 반대로 픽셀을 아예 빼고 전환 API 만 쓰기로 했습니다. 그러려면 첫 번째 일, 즉 "광고를 타고 왔다"는 표식을 쿠키 없이 남겨야 합니다.
쿠키 대신 주소에 붙어 오는 fbclid
메타는 광고 링크를 열 때 주소 끝에 fbclid=… 를 붙여 보냅니다. 구글이 gclid 를 붙이는 것과 같습니다. 픽셀은 이 값을 읽어 _fbc 쿠키로 저장할 뿐입니다.
저희 사이트는 이미 UTM 값을 세션 저장소에 담아 두는 코드가 있었습니다. 첫 진입 페이지와 utm_source 같은 것을 탭 단위로 30분 기억하는 자체 분석용입니다. 거기에 fbclid 와 gclid 두 칸을 더했습니다. 쿠키가 아니라 세션 저장소라 처리방침의 "쿠키 0개"는 그대로입니다.
문의 폼을 제출할 때 이 세션 정보를 함께 보내고, 서버는 문의 레코드에 그대로 붙여 저장합니다. 이건 원래 "어느 광고에서 온 문의인지"를 어드민에서 보려고 한 일인데, 전환 API 의 매칭 키도 같은 값이라 한 번에 해결됐습니다.
서버에서 보내는 것과 보내지 않는 것
문의가 저장된 직후 서버가 메타에 Lead 이벤트를 하나 보냅니다. 보내는 내용은 이렇습니다.
| 항목 | 값 | 이유 |
|---|---|---|
fbc |
fb.1.<클릭 시각>.<fbclid> |
픽셀이 쿠키에 넣는 것과 같은 형식. 이게 광고와 문의를 잇는 열쇠 |
client_ip_address, client_user_agent |
요청 헤더 그대로 | 메타가 매칭 품질을 올리는 데 씀 |
event_time, event_source_url |
문의 시각, 첫 진입 페이지 | |
event_id |
문의 레코드 ID | 같은 문의를 두 번 보내도 하나로 접힘 |
이름, 이메일, 전화번호는 보내지 않습니다. 메타는 이메일과 전화를 SHA-256 으로 해시해 보내면 매칭률이 오른다고 안내하는데, 그러면 처리방침 제4조에 "해시한 이메일·전화번호를 메타에 제공한다"고 적어야 합니다. 첫 광고에서 그 항목까지 열 이유가 없어서 뺐습니다. 매칭률이 실제로 얼마나 차이 나는지는 광고를 돌려 봐야 압니다.
fbclid 가 없는 문의는 아예 보내지 않습니다. 메타 광고를 안 거친 방문자의 IP 까지 메타로 나갈 이유가 없고, 매칭 키 없는 이벤트는 메타 쪽에서도 쓸모가 없습니다.
처리방침에 적은 것
코드보다 문구가 더 조심스러웠습니다. 제4조 처리위탁 항목에 이렇게 넣었습니다.
Meta Platforms, Inc.: 메타 광고의 전환 측정(전환 API). 메타 광고를 통해 방문한 뒤 문의를 제출한 경우에 한하여, 광고 클릭 식별자(fbclid), 문의 발생 시각, 접속 IP·브라우저 정보를 서버에서 전달합니다. 이름·이메일·전화번호·문의내용은 전달하지 않으며, 브라우저에 메타 픽셀이나 쿠키를 설치하지 않습니다.
"전달하지 않는다"고 적은 것은 코드가 실제로 그렇기 때문입니다. 나중에 해시 이메일을 보내기로 하면 코드보다 이 문장을 먼저 고쳐야 합니다.
코드보다 오래 걸린 계정과 토큰
토큰을 받는 데 코드 짜는 시간보다 오래 걸렸습니다. 순서대로 적어 둡니다.
처음 만든 데이터 세트는 개인 광고 계정에 묶여 있었는데, 전환 API 토큰은 비즈니스 포트폴리오의 관리자만 만들 수 있었습니다. 그래서 포트폴리오를 만들고 개인 광고 계정을 옮기려 했더니 "결제 이력이 없는 계정은 옮길 수 없다"고 했습니다. 결국 포트폴리오 안에 광고 계정과 데이터 세트를 새로 만들었습니다. 먼저 만든 데이터 세트는 지울 수 없어서 이름만 "사용 안 함"으로 바꿔 두었습니다.
토큰 생성 화면에서 데이터 세트를 고르는 드롭다운이 비어 있었던 것은 이벤트 관리자가 옛 개인 계정을 보고 있어서였습니다. 오른쪽 위 계정을 새 광고 계정으로 바꾸니 나왔습니다.
토큰을 Vercel 환경변수에 넣고 나서 한 번 더 걸렸습니다. 저는 서버 런타임 값이라 등록만 하면 다음 요청부터 읽을 거라고 생각했는데, Vercel 은 배포 시점에 함수에 값을 박습니다. 재배포하고서야 반영됐습니다.
확인한 것과 아직 안 한 것
메타의 테스트 이벤트 코드를 붙여 Lead 하나를 보내니 events_received: 1 로 돌아왔고 이벤트 관리자의 테스트 탭에 "서버" 출처로 떴습니다. 여기까지가 확인된 것입니다.
실제 광고를 타고 온 문의로 매칭이 되는지, 픽셀 없이 매칭률이 얼마나 나오는지는 광고를 켜야 압니다. 메타 문서는 픽셀과 전환 API 를 함께 쓰라고 권하고, 저는 그 권고를 일부러 안 따랐습니다. 매칭률이 너무 낮으면 해시 이메일을 추가하는 것이 다음 수이고, 그때는 처리방침 문장부터 바꿉니다. 결과가 나오면 이어서 적겠습니다.
함께 읽기
- 국내 광고 채널이 켜기 전에 요구하는 것: 심사·전환 추적·개인정보광고 계정을 만들고 카드를 등록하면 그날 광고가 나갈 것 같지만, 국내 주요 채널은 그 앞에 관문을 셋 둡니다. 계정·사이트 심사, 전환 추적 설치, 그리고 그 설치가 개인정보 처리방침에 남기는 문장. 광고비는 셋 중 어느 것도 대신해 주지 않습니다.
- AI 검색 유입 측정: ChatGPT 가 붙이는 utm_source 와 광고 표에서 떼어 내는 법ChatGPT 답변 안의 링크를 눌러 보면 주소 끝에 이런 것이 붙어 있습니다.
- 카카오·당근 광고: 네이버·구글·메타 다음에 볼 국내 채널 두 곳네이버·구글·메타 셋을 비교하고 나면 국내에 두 채널이 더 남습니다. 카카오와 당근. 둘 다 "전 국민이 쓰는 앱" 위에 있는 광고라 크게 보이는데, 상품이 아니라 서비스를 파는 회사가 들어가 보면 맞는 자리가 생각보다 좁습니다.
- 네이버 광고 종류: 검색과 디스플레이가 갈리는 지점, 서비스업이 먼저 켤 것네이버 광고주센터에 들어가면 왼쪽 위에 "검색 광고 | 디스플레이 광고" 토글이 하나 있습니다. 이걸 넘기면 메뉴 이름은 거의 그대로인데 화면이 통째로 바뀝니다. 같은 "전환 추적 관리"인데 한쪽은 설정을 켜면 바로 스크립트가 나오고, 다른 쪽은 신청서를 내고 며칠 뒤 메일을 기다리라고 합니다.
- 콜드 스타트 문제: 지역 커뮤니티 서비스가 첫 사용자를 얻는 방법운영 서비스가 약 40시간 동안 500 을 내고 있었습니다. 그것을 알린 것은 사용자가 아니라 크론 감시였습니다. 코드는 배포되고, 데이터베이스는 살아 있고, 도메인은 열려 있는데, 그 40시간 동안 화면을 열어 본 사람이 없었다는 뜻입니다.