이 글은 “인플루언서에게 제품을 보내는 마케팅이 진짜 매출을 올렸는지 어떻게 측정할까?” 라는 문제를 고민하며 만든 AI 도구 설계 이야기입니다.

처음 생각은 단순했습니다. “팔로워 많고 조회수 높은 인플루언서를 AI로 고르면 되지 않을까요?” 하고요. 하지만 알고 보니 문제는 “누굴 고르느냐"가 아니라 “보낸 뒤 매출이 정말 늘었는지 어떻게 아느냐” 였습니다.

인플루언서에게 전용 쿠폰을 주면 “이 사람 통해 들어온 주문"은 셀 수 있습니다. 하지만 그 안에는 어차피 살 사람이 쿠폰만 쓴 경우, 쿠폰이 다른 곳으로 퍼진 경우, 같은 시기 다른 광고 덕분인 경우가 섞여 있습니다. 쿠폰 주문을 그대로 “시딩 성과"라 부르면 부풀려진 수치가 됩니다.

그래서 비슷한 인플루언서 일부에게는 일부러 제품을 늦게 보냅니다. “제품 받은 그룹"과 “아직 안 받은 그룹"을 같은 기간에 비교하면, 순수하게 시딩 덕분에 늘어난 주문을 가늠할 수 있습니다. 글 제목 그대로 비교 대상이 없으면 진짜 효과를 측정할 수 없다 는 게 핵심입니다.

이 도구는 매출을 높은 정확도로 예측하는 게 아니라, 실수와 조작을 막는 안전장치 역할을 합니다. 광고 표시를 빠뜨렸거나 과장된 문구는 게시 전에 걸러내고, 회사가 승인한 자료만 쓰도록 하며, 조건을 바꿔 다시 돌리는 꼼수를 막습니다. 표본이 너무 적으면 “아직 성과를 주장할 수 없음” 이라 솔직하게 표시합니다.

마지막 중요한 점: 실제 기업 데이터로 검증한 게 아니라 연습용·공개 데이터만 사용 했으므로, “이걸로 매출이 진짜 늘었다고 증명할 수 없다” 는 게 핵심입니다. 이 글은 매출 증가를 입증하는 글이 아니라, 나중에 제대로 된 검증을 시작할 수 있는 절차와 안전장치를 먼저 만든 설계 기록 입니다.

시딩 제품 설계

글과 화면에 나오는 시딩 후보, 주문, 매출 수치는 모두 연습용으로 만든 값이거나 공개 데이터에서 가져온 것입니다. 특정 기업의 후보 명단이나 주문 내역, 매출 실적과는 관계가 없습니다.

가상 데이터로 구성한 시딩 실험 설계 화면

인플루언서에게 제품을 보내는 시딩 업무를 AI로 개선하는 설계를 했습니다. 처음에는 후보를 더 잘 고르는 모델부터 떠올렸으나, 작업을 진행할수록 제가 풀어야 할 문제는 후보 순위보다 집행 전후에 있다는 사실이 보였습니다. 집행 전에 위험한 문구를 걸러야 했고 집행 뒤에는 주문이 왜 늘었는지 비교할 방법이 필요했습니다.

문제를 보는 관점 좁히기

AI가 그럴듯한 추천을 나열하는 화면 대신 담당자가 실제로 내리는 결정 하나를 골라 그 판단을 돕는 쪽으로 문제를 좁혔습니다. 시딩 설계에서는 어떤 인플루언서가 잘 팔지 맞히는 일이 아니라 제한된 시딩 예산을 어디에 쓸지 정하는 결정을 골랐습니다.

설계 검증을 위한 사전 테스트

설계를 다듬기 전에 두 가지 시나리오를 먼저 테스트했습니다. 처음에는 가상 브랜드의 시딩 데이터로 짧게 시험 삼아 다뤄 봤고 다음에는 시딩과 무관한 재구매 이탈 문제로 같은 방식을 옮겨 쓸 수 있는지 확인했습니다. 데이터가 정제되지 않은 상태로 들어오는 경우를 대비해 두 번째 테스트에는 일부러 오류를 섞어 두었습니다. 지저분한 값을 초반에 믿을 수 있는 값과 확인이 필요한 값, 제외할 값으로 구분해 내는 연습이었습니다. 시딩 데이터가 없어도 같은 방법을 다른 영역에 옮겨 쓸 수 있는지 확인하려는 목적이 컸습니다.

설계 원칙은 서로 다른 AI 두 곳에 각각 따로 세우게 했습니다. 독립적으로 세운 두 전략에서 같은 결론이 다섯 가지 나왔습니다. 범위를 좁혀 완성할 것, 인과를 과장하지 않을 것, 결정을 한 장으로 보여줄 것, 설계가 대응해야 할 실패 상황을 먼저 정할 것, 실제 예산 제약을 먼저 맞춰볼 것이었습니다. 겹친 결론만 설계에 반영했습니다.

예산 제약을 먼저 맞춰본다는 항목이 일정을 바꿨습니다. 시딩할 수 있는 인플루언서 수와 한 명당 시딩 예산의 최대값을 미리 정해두고, 그 조건을 만족하는 할당이 가능한지 먼저 확인하기로 했습니다. 기능을 계속 추가하는 대신 검산과 설계 검증에 시간을 배정했습니다. 출시 후에 다듬으면 된다는 생각은 버렸습니다.

잘 팔 사람을 찾으려던 첫 설계

처음 구상한 화면은 흔히 보던 방식이었습니다. 팔로워 수와 평균 조회수, 참여율을 한데 모아 시딩 후보마다 점수를 매기고 높은 사람부터 제품을 보내는 방식이었습니다. 마케터가 여러 계정을 빠르게 비교해야 한다는 점에서는 쓸모가 있어 보였습니다. 실제로 공개 지표를 같은 기준으로 정리하는 것만으로도 수작업은 줄일 수 있습니다.

문제는 그 점수를 매출 예측값으로 바꾸는 순간 생겼습니다. 내부 판매 데이터가 없으니 어떤 후보가 실제 주문을 얼마나 만들었는지 학습하거나 검증할 수 없었습니다. 조회수와 참여율로 관심이 얼마나 큰지는 가늠할 수 있습니다. 그 관심이 회사의 유료 주문으로 이어졌는지는 알 수 없었습니다. 예상 광고수익률을 소수점 아래까지 세밀하게 계산하면 근거가 부족한 숫자도 실제 측정값처럼 보입니다.

기준값을 잡아 보려고 2019년 12월 공개 화장품 스토어 데이터 의 원본 파일도 살펴봤습니다. 이 파일에서 확인한 값은 3,533,286개의 이벤트 행입니다. 조회, 장바구니 담기, 구매 등 공개된 행동 데이터를 관찰한 값일 뿐입니다. 기업의 내부 데이터와는 관계없습니다. 공개 데이터가 시장 행동을 가늠하는 참고 자료는 될 수 있어도 없는 사내 판매 데이터를 대신하지는 못합니다.

저는 예상 매출을 필요 이상으로 정교하게 계산하는 일을 멈췄습니다. 후보 점수는 제한된 실험 예산을 어디에 먼저 쓸지 정하는 우선순위로만 두고 실제 효과는 별도의 비교 실험에서 확인하기로 했습니다.

쿠폰 주문으로 알 수 있는 것과 없는 것

전용 쿠폰과 추적 링크는 필요합니다. 어떤 경로를 거쳐 주문이 들어왔는지 후보 단위로 셀 수 있기 때문입니다. 그렇다고 쿠폰이 찍힌 주문을 모두 시딩 성과로 부를 수는 없습니다. 원래 구매하려던 고객이 쿠폰을 썼을 수 있고 코드가 다른 채널로 공유됐을 수도 있습니다. 검색 광고나 기존 고객 대상 메시지처럼 같은 기간에 진행한 마케팅도 주문에 영향을 줍니다.

이 차이를 놓치면 쿠폰으로 집계한 주문과 시딩으로 실제 늘어난 주문이 같은 숫자로 보입니다. 쿠폰 주문은 유입 경로까지만 알려줍니다. 실제로 늘어난 주문을 계산하려면 시딩하지 않았을 때와 비교할 기준이 필요합니다. 쿠폰 집계에는 그 기준이 없습니다.

그래서 비슷한 후보 일부에게는 측정 기간이 끝날 때까지 제품을 보내지 않는 비교 대상을 두었습니다. 이들은 제품을 아예 받지 못하는 후보가 아니라 측정 기간 동안 기다렸다가 이후에 시작하는 지연 시작 그룹입니다. 시딩 대상을 제품에 노출된 그룹으로, 비교 대상을 아직 노출되지 않은 그룹으로 두고 같은 기간의 결과를 비교합니다. Google Ads의 실험 방법 안내 도 무작위로 나눈 노출 그룹과 비노출 그룹의 직접 비교를 증분 측정의 출발점으로 설명합니다.

비교 대상을 둬도 결과를 왜곡하는 다른 요인이 다 사라지지는 않습니다. 시딩 후보끼리 잠재 고객이 겹치거나 같은 기간에 다른 캠페인이 노출되면 시딩만의 영향을 분리하기 어렵습니다. 그래도 쿠폰 주문을 시딩의 결과라고 단정하는 것보다 무엇을 비교했는지 분명히 남길 수 있습니다.

점수보다 먼저 확인한 광고 문구

순위를 정하기 전에 집행 자체를 멈춰야 하는 경우가 있었습니다. 제품을 제공받았다는 표시가 없거나, 표시를 적어 놓고 본문에서 광고 아님처럼 부정하면 점수가 높아도 먼저 확인해야 합니다. 화장품을 질병 치료제처럼 소개한 문구는 막고 회사가 승인하지 않은 근거는 판단 자료로 쓰지 않았습니다. 조회수 점수가 이런 위험을 상쇄하게 두고 싶지 않았습니다.

협찬 표시 기준은 추천·보증 등에 관한 표시·광고 심사지침을 참고했습니다. 경제적 이해관계는 소비자가 알아보기 쉬운 방식으로 추천 내용 가까이에 표시해야 합니다. 주변 문구가 그 표시를 약하게 만들거나 모순되게 해서도 안 됩니다. 치료나 의약품으로 오인하기 쉬운 표현은 화장품법 제13조를 기준으로 게시 전에 위험 여부를 점검했습니다.

이 자동 점검은 게시 전 위험을 거르는 선별 절차입니다. 여기서 통과했다고 법규를 지켰다는 보장은 없어서 관할 지역과 제품 분류, 문장 전체의 맥락은 사람이 다시 확인해야 합니다. 제가 만든 제품은 위험한 후보를 점수표 위로 올리기 전에 멈춰 세우는 역할까지만 맡습니다.

점수 계산을 뒤로 미루니 화면 구성 순서도 바뀌었습니다. 사용자는 높은 점수를 먼저 보는 대신 어떤 표시가 빠졌는지, 어느 표현이 승인 범위를 벗어났는지부터 확인합니다. 후보를 제외한 이유를 함께 남기면 마케터가 문구를 고쳐 다시 검토할 수도 있습니다.

회사 승인 자료로 한정한 판단 근거

안전 검사를 넣어도 입력값을 사용자가 마음대로 적을 수 있으면 기준이 쉽게 흔들립니다. 그래서 제품 문구는 회사가 승인한 문구와 정확히 맞아야 하도록 설계했습니다. 승인한 사람과 승인 시각, 공식 출처를 저장한 스냅숏도 같은 기준표에서 불러왔습니다. 작성자가 문구와 근거를 임의로 만들어 승인된 자료처럼 제출하지 못하도록 막았습니다.

후보 지표도 숫자 하나만 받지 않았습니다. 후보의 고정 ID와 값을 수집한 시각을 먼저 확인했습니다. 지표의 이름과 수치도 원본 파일과 대조했습니다. 파일에는 SHA-256 값을 붙였습니다. 파일 내용이 한 바이트라도 달라지면 계산값이 달라지므로 나중에 파일이 바뀌었는지 찾아낼 수 있습니다.

SHA-256이 확인해 주는 범위는 파일 변경 여부까지입니다. 같은 값이 유지돼도 실제 플랫폼이나 권한 있는 담당자가 발행했다는 증거는 되지 않습니다. 가짜 파일을 처음부터 만들고 그 값까지 계산하면 형식 검사는 통과합니다. 운영 환경이라면 접근이 통제된 원본 내보내기나 서명을 추가해야 합니다.

이 구분을 결과 화면에서도 드러냈습니다. 시스템은 파일의 값과 지문이 맞는지 계산하지만 원천의 진위를 판단하려면 발행 경로와 권한 정보까지 확인해야 합니다.

시딩 대상과 비교 대상의 무작위 배정

안전 검사와 근거 확인을 통과한 후보는 시딩 대상과 지연 시작 비교 대상으로 무작위 배정했습니다. 사용자에게 결과를 먼저 보여 주면 마음에 들지 않는 배정이 나올 때마다 요청 이름을 바꿔 다시 실행하기 쉽습니다. 그래서 배정 결과를 변경 이력에 먼저 기록한 뒤에 화면에 공개하도록 설계했습니다.

캠페인 이름이나 목표 설명처럼 화면에 보이는 값만 바꾼 요청에는 이전 배정을 재사용합니다. 후보 구성, 예산, 측정 기간처럼 결과에 영향을 주는 값이 바뀌면 새 배정을 만들지 않고 충돌로 멈춥니다. 조건을 조금씩 바꿔 유리한 비교 대상이 나올 때까지 다시 뽑지 못하게 했습니다.

예산도 배정이 끝난 뒤에 검토하면 늦습니다. 어떤 후보 조합이 시딩 대상으로 뽑혀도 최소 집행액과 후보별 상한을 지킬 수 있는지 먼저 계산했습니다. 실행할 수 없는 예산이면 배정 기록을 남기지 않고 중단합니다. 예산 조건을 고친 뒤에야 첫 배정이 이뤄지도록 했습니다.

승인 자료 확인부터 비교 실험과 다음 판단까지 이어지는 과정

이 글에서 사용한 가장 단순한 절대 차이 추정치는 아래와 같습니다.

시딩 효과 추정치 = 시딩 대상 주문 이벤트 비율 - 비교 대상 주문 이벤트 비율

두 그룹의 크기가 다르므로 주문 건수 자체를 빼지 않고 각 그룹의 비율을 비교합니다. 물론 증분 측정 방식이 이것 하나만 있는 것은 아닙니다. 실제 광고 측정 시스템은 누락된 결과를 보정하거나 상대 차이와 신뢰구간을 함께 보고하기도 합니다. 이 제품에서는 작은 실험의 판단 기준을 설명하는 데 충분해서 사전에 정한 절대 비율 차이를 썼습니다.

다섯 명 표본의 한계

데모에서 안전 검사와 근거 확인을 통과한 후보는 다섯 명이었습니다. 시딩 대상 3명과 비교 대상 2명으로 나뉘었습니다. 화면에서 두 그룹의 주문 이벤트 비율 차이가 크게 나타나도 이 규모로는 성과를 주장할 수 없습니다.

표본 수 계산에는 기준 주문 이벤트 비율 8%, 확인하려는 최소 절대 차이 4%포인트, 유의수준 0.05, 검정력 0.8을 넣었습니다. 그 설정에서 필요한 표본은 군당 약 883명이었습니다. 883명이라는 수는 이 가정으로 계산한 근사값입니다. 기준 비율이나 확인하려는 차이, 기간과 배분이 달라지면 필요한 수 역시 달라집니다.

피셔 정확검정은 표가 작을 때 가능한 분할을 직접 계산해 두 집단 차이가 우연히 나타날 가능성을 보는 양측 검정입니다. 뉴컴 구간은 각 집단의 Wilson 비율 구간을 조합해 두 비율의 차이가 놓일 수 있는 범위를 보여 줍니다. 검정값 하나로 결론짓지 않고 표본 계획과 차이의 범위를 함께 보게 했습니다.

가상 결과를 분석기에 넣어 확인했을 때 실제 출력은 PILOT_ONLY_DO_NOT_CLAIM이었습니다. 표본이 부족해 성과라고 말하지 않는 상태라는 뜻입니다. 수치가 좋아 보이거나 검정 결과가 유의하더라도 사전에 정한 표본 조건을 채우지 못하면 같은 상태를 돌려주도록 했습니다.

AI에게 맡긴 취약점 점검 질문 만들기

AI에게 어떤 후보가 매출을 잘 낼지 물으면 근거가 부족한 상황에서도 답은 만들어 낼 수 있습니다. 저는 그 역할을 맡기지 않았습니다. 대신 사용자가 문구와 승인자를 함께 위조하면 어떻게 되는지, 캠페인 이름을 바꿔 원하는 배정을 찾을 수 있는지, 과거 날짜로 결과를 바로 끝낼 수 있는지를 취약점 점검 질문으로 만들게 했습니다.

이렇게 모은 취약점 점검 질문은 제품이 지켜야 할 조건으로 옮겼습니다. 어떤 입력을 거절해야 하는지, 어느 단계에서 기록을 남기지 않아야 하는지, 한 번 정한 배정을 언제 재사용해야 하는지를 코드와 테스트로 확인했습니다. AI가 아이디어를 많이 낸다는 장점은 허점을 폭넓게 찾는 데 활용했습니다.

구현에 관여하지 않은 별도의 AI 세션도 두었습니다. 구현과 무관한 맥락에서 같은 취약점 점검을 다시 실행하고 문서에 적은 동작과 코드의 실제 동작이 맞는지 검토했습니다. 같은 대화에서 만든 설명을 별도 검토 없이 승인하지 않으려는 방법이었습니다.

그렇다고 AI 검토가 정확성을 보장해 준 것은 아닙니다. 승인 문구와 담당자, 예산과 측정 지표, 실험 조건은 사람이 정해야 합니다. 별도 AI 검토도 사람이 확인할 범위를 줄여 주는 도구이지 운영 데이터의 진위나 설계의 타당성을 대신 증명하지 않습니다.

잘못된 입력 32개 테스트

취약점 점검 질문은 자동 테스트 32개로 남겼습니다. 정상 입력이 한 번 동작하는지만 보지 않고 일부러 잘못된 값과 조작 시도를 넣었습니다. 대표 사례는 아래처럼 묶을 수 있습니다.

범주일부러 넣어 본 문제
근거 변조승인 정보와 수집값, 원본 파일 내용과 SHA-256을 서로 다르게 바꿉니다
위험 문구협찬 표시를 빼거나 부정하고 치료를 암시하는 표현을 넣습니다
배정 쇼핑캠페인 이름을 바꾸거나 임의의 난수값을 넣고 시딩 후보 순서를 뒤집습니다
실행 불가능한 예산최소 집행액과 후보별 상한을 동시에 지킬 수 없는 요청을 보냅니다
날짜를 소급한 결과과거 날짜와 직접 만든 결과 파일로 측정을 바로 닫으려 합니다
소표본 과장표본이 부족한데 검정값만 보고 성과 상태를 요구합니다
기록 체인 변조이전 기록을 고친 뒤 새 결정을 이어 붙이려 합니다

실제 구현 코드에서 테스트를 새로 실행했고 32개 테스트가 모두 통과(32/32 tests passed)했습니다. 이 문구는 실제 기업 캠페인의 성공과는 관계없습니다. 위 공격 입력 32개에서 구현이 정한 중단과 재사용 규칙이 예상대로 작동했다는 테스트 결과입니다.

테스트를 작성하면서 문서도 여러 번 고쳤습니다. 예를 들어 SHA-256을 근거의 진위 확인처럼 설명했던 문장은 파일 변경 확인으로 범위를 줄였습니다. 서버가 받은 시각도 날짜 소급을 막을 뿐 결과 발행자를 인증하지 않는다고 분리했습니다. 문서에는 테스트가 확인한 범위와 그 밖의 한계를 나눠 적었습니다.

실제 캠페인에서 검증해야 할 것

이 과제에서 실제 기업의 시딩을 집행하지 않았고 내부 판매 원본에도 접근하지 못했습니다. 따라서 시딩 때문에 실제 매출이 늘었다고 말할 수 없습니다. 같은 설계가 다른 캠페인에서도 반복해서 같은 결과를 내는지도 확인하지 못했습니다.

결과 파일의 내용과 SHA-256이 일치해도 누가 그 파일을 발행했는지는 남은 문제입니다. 서버 접수 시각은 과거 날짜로 결과를 꾸미는 일을 막지만 파일 속 주문이 실제 사업에서 발생했다는 사실까지 인증하지 않습니다. 후보 사이의 고객 중복이나 집행 미준수도 자동으로 바로잡지 못합니다.

다음 실제 단계는 한 캠페인의 후보와 측정 지표, 기간과 분석 방법을 집행 전에 등록하는 일입니다. 결과는 접근이 통제된 원천 시스템의 내보내기 파일이나 서명된 내보내기로 받아야 합니다. 그래야 사전에 정한 배정과 실제 결과를 연결하면서 발행 경로도 함께 확인합니다.

이 절차를 거친 뒤에도 한 번의 결과를 일반화해서는 안 됩니다. 캠페인 조건이 달라지면 같은 방식으로 다시 측정하고 불확실성을 남겨야 합니다. 이번 과제에서 만든 것은 그 검증을 시작할 절차까지입니다.

질문을 바꾼 뒤 달라진 제품

처음 질문은 누가 제품을 잘 팔 것인지였습니다. 이 질문에 머물면 제품의 중심은 후보 점수표와 예상 매출 순위가 됩니다. 내부 판매 데이터가 없는 상태에서는 화면이 정교해질수록 추정이 확인된 사실처럼 보일 위험도 커졌습니다.

질문을 바꾼 뒤에는 화면이 강조하는 내용이 바뀌었습니다. 지금 집행해도 되는지 먼저 판단하고 실제로 보낸 그룹과 기다린 그룹의 차이를 나중에 측정하는 순서로 진행해야 했습니다. 순위는 실험 대상을 고르는 보조 정보에 그쳤습니다. 비교할 수 없는 결과에는 성과 라벨을 붙이지 않았습니다.

질문을 바꾸면서 제품이 답을 내는 시점도 달라졌습니다. 집행 전에는 숫자 하나를 예측하는 대신 멈춰야 할 이유와 배정 기준을 기록하고 차이는 측정 기간이 끝난 뒤 계산하도록 했습니다.

이제 순위 목록보다 실제 캠페인의 기록을 확인하고 싶습니다. 사전에 적은 조건을 지켰는지, 결과가 기대와 달라도 같은 기준으로 남겼는지가 궁금합니다. 그때부터는 이 제품이 제가 내린 결정을 나중에 검토하는 실험 도구로 쓰입니다.