백은규·

[2편] "같은 상품, 같은 매출"이 왜 안 같은가

"이 상품 매출이 얼마야?"

same-product-different-revenue 이미지 1

"이 상품 매출이 얼마야?"

이 질문에 답이 하나여야 할 것 같지만, 커머스 회사에서는 답이 3개 이상 나옵니다. 카페24에선 "[치어리더] 라플라스 마사지 PRO"로, 무신사에선 "마사지프로 EMS 마사지기"로, 쿠팡에선 "마사지PRO 홈케어 세트"로 등록되어 있습니다. 같은 SKU인데 채널마다 이름이 다릅니다.

상품 이름만 다른 게 아닙니다. "매출"이라는 측정값도 대시보드마다 다릅니다. 경영지원 대시보드에서 공헌이익률이 30%인 상품이 제품별 성과 대시보드에서는 25%로 나옵니다. 분모가 순매출이냐 결제금액이냐에 따라 달라지기 때문입니다.

이 글에서는 커머스 데이터에서 가장 흔한 두 가지 충돌 — 상품명 충돌과 측정값 충돌 — 을 정리하고, 온톨로지로 어떻게 해결하는지 설명합니다.


1부: 같은 상품이 17개의 이름을 가진다

문제의 규모

실제 운영 데이터를 보면, 하나의 SKU가 채널별로 다른 이름을 갖습니다.

채널등록 상품명내부 SKU
카페24 (자사몰)[치어리더] 라플라스 마사지 PROSKU-001
무신사 (사방넷)라플라스 EMS 고주파 마사지기SKU-001
쿠팡 (사방넷)라플라스 마사지PRO 홈케어 세트SKU-001
스마트스토어마사지 프로 목어깨 마사지기SKU-001

4개 채널에서 같은 물건을 파는데, 상품명이 전부 다릅니다.

여기에 세트/번들/1+1 구성이 더해지면 복잡도가 폭발합니다. "마사지프로 + 부스터젤 세트"는 카페24에서는 옵션 상품으로, 쿠팡에서는 별도 상품으로 등록됩니다. 같은 구성인데 데이터 구조가 다릅니다.

엑셀 VLOOKUP의 한계

대부분의 커머스 회사는 이 문제를 엑셀 매핑 시트로 해결합니다.

판매상품옵션명    →  VLOOKUP  →  기초상품(SKU)

이 방식의 문제:

  • 새 상품이 등록될 때마다 수동 업데이트

  • 채널이 10개를 넘으면 매핑 시트가 수천 행

  • 세트/번들의 구성품 분해가 안 됨

  • 사람이 쉬면 매핑이 멈춤

온톨로지 방식: 기초 상품 노드에 관계를 연결

우리가 선택한 구조는 기초 상품(SKU)을 중심 노드로 두고, 각 채널의 판매 상품 옵션을 관계로 연결하는 것입니다.

                     [기초 상품: 마사지 PRO]
                    /        |        \\
       [카페24 옵션]   [무신사 옵션]   [쿠팡 옵션]
       치어리더 라플라스  마사지프로 EMS  마사지PRO 홈케어

이 관계가 정의되면:

  • "마사지프로 매출 알려줘" → 3개 채널의 옵션을 자동으로 합산

  • 세트/번들 → 구성품 SKU로 자동 분해 후 원가·광고비 배분

  • 새 채널 추가 시 → 관계만 연결하면 기존 분석이 즉시 확장

실제 대시보드에서는 이 관계를 활용해 필터를 겁니다. "상품명 = 라플라스 마사지 PRO 외 71개 (하나라도 일치)" — 이 71개가 바로 하나의 SKU에 연결된 모든 채널별 옵션명입니다.


2부: 순매출이 3개인 회사

같은 "매출"인데 숫자가 다르다

커머스 대시보드를 만들다 보면 반드시 마주치는 문제가 있습니다. 같은 "매출"이라는 단어를 쓰는데, 대시보드마다 숫자가 다릅니다.

대시보드사용하는 "매출"분모
경영지원순매출 (환불 차감 후)공헌이익률 = 공헌이익 / 순매출
제품별 성과결제금액 (환불 차감 전)실 공헌이익률 = 실 공헌이익 / 결제금액
인구통계실 결제금액 (결제일+0)주문 행 기준 집계

같은 날, 같은 상품인데 경영지원에서 30%이고 제품별 성과에서 25%입니다. 틀린 게 아니라 분모가 다른 겁니다. 하지만 이 맥락을 모르면 "어떤 숫자가 맞아요?"라는 질문이 끊이지 않습니다.

왜 분모가 다른가

각 대시보드가 다른 분모를 쓰는 데는 이유가 있습니다.

마케팅 관점에서는 환불 차감 전 결제금액, 그것도 상품 단위로 봐야 합니다. 광고 소재의 랜딩 URL이 보통 옵션 단위가 아니라 상품 단위로 걸리기 때문입니다. 옵션별 환불까지 차감한 숫자로 광고 성과를 보면, 광고가 만든 실제 클릭→구매 흐름과 측정 단위가 어긋납니다.

경영지원 관점에서는 환불 차감 후 순매출을 봐야 합니다. 정산에 가장 가까운 숫자여야 하기 때문입니다. 환불 포함 결제금액으로 공헌이익률을 계산하면, 실제로 회사 통장에 들어온 돈과 괴리가 생깁니다.

같은 "매출"이라는 단어 뒤에 부서별 의사결정 맥락이 숨어 있습니다.

"결제금액"이라는 단어 자체가 채널마다 다르다

더 골치 아픈 것은, 분모를 통일하려고 해도 채널이 정의하는 "결제금액"이 제각각이라는 점입니다.

출처"결제금액"의 정의
카페24 어드민 “애널리틱스”환불 미포함 결제 합계
카페24 어드민 “통계 > 일별 매출”환불 포함 결제 합계
스마트스토어결제 합계 - 마켓 부담 할인 - 마켓 부담 쿠폰

같은 카페24 안에서도 어드민의 어느 메뉴를 보느냐에 따라 환불 포함 여부가 다릅니다. 스마트스토어는 마켓이 부담한 할인/쿠폰을 미리 빼고 보여줍니다.

그래서 "결제금액"이라는 단어 하나만으로는 충분하지 않습니다. 어느 채널의, 어느 화면의, 어느 정의의 결제금액인지 명시해야 비로소 같은 분모로 비교할 수 있습니다.

광고 ROAS도 3개

기준ROAS출처
광고 어드민500%Meta/Google이 자기 기준으로 보고 (과장 경향)
GA4 라스트클릭320%utm 기반 실제 전환 기준
공헌이익 기준-5%원가+광고비+수수료+배송비 차감 후

마케팅팀이 "ROAS 500%"라고 하는데, 경영지원에서 "공헌이익 마이너스"라고 하는 상황이 실제로 일어납니다. 세 ROAS 모두 틀린 숫자가 아닙니다. 맥락이 다른 겁니다.

온톨로지 방식: 측정값에 맥락을 부여

우리는 dashboard_meta라는 메타데이터 레이어를 통해 각 측정값에 맥락을 명시합니다.

측정값: "공헌이익률" ├─ context: "경영지원" → 분모=순매출, 환불 차감 후 ├─ context: "제품별 성과" → 분모=결제금액, 환불 차감 전 └─ context: "클로드용 데이터" → 분모=결제금액, 일별×판매처×기초상품

AI에게 "공헌이익률 알려줘"라고 물었을 때, 온톨로지가 없으면 아무 숫자나 반환합니다. 온톨로지가 있으면 "어떤 기준의 공헌이익률인지" 되물을 수 있고, 맥락에 맞는 정확한 답을 줍니다.


실전 체크리스트: AX팀이 먼저 해야 할 것

  1. 기초 상품(SKU) 마스터 테이블을 만들어라 — 채널별 옵션명이 아닌, 내부 SKU 기준 단일 테이블

  2. 채널별 옵션명 → SKU 매핑을 자동화하라 — 엑셀 매핑 시트를 코드로 옮기는 것만으로도 첫 단계

  3. "매출"이라는 단어를 금지하라 — 순매출/결제금액/실결제금액/GMV 중 어떤 것인지 항상 명시

  4. 포뮬러의 분모를 문서화하라 — 대시보드별 커스텀 측정값의 수식과 분모를 한 곳에 정리

  5. AI에게 데이터를 주기 전에 관계 정의부터 — CSV를 던지기 전에 "이 테이블의 결제금액과 저 테이블의 결제금액은 다른 것이다"를 명시


커머스 데이터를 AI가 이해하게 만들기 — 시리즈 2편