기준이 다른 두 숫자는 더하지 않는다
2026년 9월 8일 처음 적재한 데이터에서 Meta가 보고한 가입 전환은 서버에서 광고와 연결된 가입보다 약 3배 많았습니다. 어느 쪽이 틀렸다기보다 기준이 다릅니다. Meta는 광고 세트의 기여 설정으로 전환을 잡고, 서버는 가입할 때 저장한 광고 ID로 셉니다. 그래서 두 값은 별도 필드로만 보여 주고 더하지 않습니다. 가입자가 14일 안에 인스타를 연결했는지, 핵심 기능을 썼는지, 결제했는지는 서버만 알기에 판단은 서버 숫자로 합니다.
방문 신호를 지우지 않고 모은다
웹은 페이지를 옮길 때마다 UTM, 광고 ID, 클릭 ID, 리퍼러, 랜딩 경로를 읽고, 첫 방문이거나 UTM·광고 ID·클릭 ID·픽셀 쿠키가 새로 생긴 방문일 때만 브라우저 저장소에 씁니다. 서버는 가입하거나 처음 인스타를 연결할 때 이 값을 받아 채널을 판정합니다.
병합 키마다 저장된 값이 있으면 유지, 빈 키만 이번 방문 값으로 채움
(저장은 첫 방문 또는 UTM·광고 ID·클릭 ID·픽셀 쿠키가 새로 생길 때만)
판정 위에서부터 처음 맞는 규칙
광고 ID(없으면 utm_content) · Meta 유료 UTM · fbclid -> meta_paid
Meta UTM -> meta_organic
Google 유료 UTM · gclid -> google_paid
검색 · 카카오 · 공유 · 메일 UTM -> search · kakao · share · email
그 밖의 UTM -> other
리퍼러 (Meta 도메인이면 meta_organic) -> search · kakao · referral
랜딩 경로만 있음 -> direct
아무 신호 없음 -> 미수집 (direct와 구분)이 방식은 first-touch가 아닙니다. 랜딩 경로는 늘 값이 있어 첫 방문부터 유입 기록이 저장되는데, 첫 기록만 지키면 광고를 보기 전에 들어와 본 사람은 전부 direct로 굳습니다. 그래서 이런 신호가 새로 들어온 방문이 빈 키를 채웁니다. 서버도 같은 원칙이라 이미 기록이 있으면 저장된 칸은 두고 빈 칸만 채우며, 신호가 새로 채워지면 채널을 다시 판정합니다. 대가로 한 기록에 여러 방문이 섞이고, 광고 A를 클릭한 뒤 광고 B로 가입하면 광고 ID는 A로 남습니다.
광고비는 노출일, 코호트는 가입일
광고별 성과는 예약 작업이 매일 어제까지의 30일을 광고·하루 단위로 다시 받아 한 트랜잭션에서 구간을 통째로 교체하게 했습니다. 늦게 잡히는 전환 때문에 같은 날짜를 매일 덮어쓰므로 upsert 대신 구간 교체로 멱등하게 만들고, 광고비 0원인 날과 수집하지 못한 날을 구분하려고 수집한 날짜를 따로 기록합니다. 9월 8일 임시 테이블에서 같은 입력을 다시 넣어도 중복이 없음을 확인했습니다.
서버는 광고 ID와 클릭 ID를 저장하지만 Meta 광고비는 광고·하루 단위 집계로만 받으므로, 클릭 단위로 맞추는 척하지 않았습니다. 광고비는 노출일에 묶고 사람은 가입일(KST)로 코호트를 만든 뒤 광고 ID로 결합합니다. 노출일 광고비와 가입일 코호트를 한 날짜축에 놓은 시계열은 그날 광고가 그날 가입을 만들었다는 뜻이 아니라, 소재나 예산을 바꾼 전후를 비교하는 용도입니다. 코호트는 가입 후 14일 창에서 인스타 연결, 핵심 기능 사용, 결제를 셉니다. 14일이 안 된 가입은 관찰 완료로 세지 않고 광고비도 같은 날짜로 잘라, 관찰 중인 가입이 늘어도 비용 값이 흔들리지 않게 했습니다.
숫자가 부족하면 결론을 내지 않는다
수집 불완전 또는 연결률 < 80% -> 추적 확인 (측정부터 의심)
지출 · 클릭은 충분한데 관찰 완료 가입 0 -> 전환 없음 경보
관찰 완료 가입 < 20명 -> 수집 중 (예산 판단 보류)
그 외 -> 비교 검토연결률은 Meta 유료 유입으로 판정된 가입 중 광고 ID가 수집한 광고와 맞는 비율입니다. 광고별 지표에는 연결된 가입만 들어가서 연결률이 낮으면 광고별 숫자가 통째로 작아집니다. 9월 8~9일 측정한 연결률은 약 95%였습니다(분모가 지금보다 넓던 당시 정의 기준). 80%와 20명은 통계적 유의성 기준이 아니라 숫자가 예산 판단으로 넘어가기 전의 운영 가드입니다.
빈 칸 채움이 만든 오귀속
9월 28일 운영 데이터에서 가입한 지 오래된 사용자들이 9월 광고 가입자로 잡힌 것을 확인했습니다. 카카오·Google·Apple 가입은 계정이 새로 생길 때만 유입을 기록하지만, 인스타그램 경로는 처음 인스타를 연결할 때 기록합니다. 유입 기록을 도입하기 전 가입자는 칸이 빈 기록만 있었는데, 이들이 광고로 다시 들어와 처음 인스타를 연결하자 앞서 말한 서버의 빈 칸 채움이 비어 있던 광고 ID를 그 광고로 채웠고 채널도 meta_paid가 됐습니다. 가입일로 거르는 9월 보고서에는 들어가지 않지만, 가입일 조건이 없는 광고별 가입자 목록과 사용자 카드에는 섞이는 구조였습니다.
// 모든 기록 경로가 지나는 서버 공통 함수 한 곳에서
if 현재 시각 - 가입 시각 > 24시간:
유입 칸은 채우지 않는다이 창은 접점의 나이가 아니라 기록 호출이 가입 후 언제 일어났는지만 봅니다. 가입 직후 온보딩의 인스타 연결은 기록되고 몇 달 뒤의 첫 연결은 걸러집니다. 이 수정은 앞으로의 오염만 막으므로 이미 채워진 행은 따로 가려내야 합니다.
수집 규칙에도 유효기간이 있다
빈 칸 채움은 가입 전 여정을 모으려는 장치였지만, 시간 경계 없이 가입 뒤의 호출에도 적용되자 오귀속을 만들었습니다. 수집 규칙은 언제까지 유효한지도 같이 정해야 했습니다. 그리고 숫자를 내지 않는 것도 기능이었습니다. 기준이 다른 숫자를 더하지 않는 규칙과 측정이나 표본이 부족하면 보류하는 규칙은 틀린 숫자가 예산 판단까지 가는 일을 줄여 줍니다.