비즈니스 현실7 분 읽기

28일 매출 $73 중 $63은 이미 되돌아간 돈이었습니다

매출 스크립트가 환불 행을 통째로 버리고 있었습니다. 필터 한 줄 때문에 플릿 1위 매출 앱이 만들어졌고, 그 숫자로 어디에 시간을 쓸지 정하고 있었습니다.

#reality-check#analytics#first-principles#app-store#verification
Left panel: a 28-day revenue report showing 73.28 dollars with one app on top. Right panel: the same window at 10.29 dollars after refund rows are kept.
같은 창, 같은 원본 리포트. 필터 한 줄만 달랐습니다.

질문부터 드리겠습니다. 당신의 매출 집계 스크립트는 환불을 어떻게 세고 있습니까?

저는 이 질문을 스스로에게 한 적이 없었습니다. 매출 리포트는 돌아가고 있었고, 숫자가 나왔고, 그 숫자로 판단을 했습니다. 앱이 40개가 넘으면 "어디에 시간을 쓸까"를 감이 아니라 매출로 정하게 되는데, 그 입력이 이 스크립트였습니다.

2026-08-26에 퍼널을 다시 보다가, 28일 창의 매출이 두 배 넘게 틀렸다는 걸 알았습니다.

필터 한 줄

집계 스크립트는 판매 리포트를 행 단위로 읽고 이렇게 계산합니다.

total = proceeds * units
if total <= 0:
    continue

의도는 알겠습니다. 금액이 0인 행 — 무료 다운로드, 체험 시작 같은 것 — 을 건너뛰려던 겁니다. 실제로 그런 행이 대부분이라 이 필터는 매일 정상적으로 일했습니다.

그런데 환불은 units = -1 인 행으로 옵니다. 수량이 음수니까 total 도 음수이고, total <= 0 은 그 행을 0인 행과 똑같이 취급해 버립니다. 즉 이 스크립트는 결제만 세고 환불은 못 본 척하는 게 아니라, 환불이라는 개념 자체를 갖고 있지 않았습니다.

숫자

2026-07-28 ~ 08-24 창을 다시 돌렸습니다.

리포트 값 : $73.28
실제 값   : $10.29

차이는 $62.99인데, 그 전부가 한 건이었습니다. Sage 연간 구독 1건, 호주, 95.45 AUD. 08-14에 결제됐고 08-15에 환불됐습니다. 하루입니다.

이 한 건이 살아 있는 동안, 리포트에서 Sage는 플릿 전체 1위 매출 앱이었습니다. 다른 앱들과 자릿수가 다르니 자연스럽게 "여기에 뭔가 있다"는 결론으로 갔습니다.

환불 행을 살리고 나면 그 창의 실제 순매출은 이렇습니다.

  • Zone 2 월간 1건 — $3.50
  • Quieta Pro 월간 2건 — $6.79

끝입니다. 4주 동안 세 건이고, 셋 다 월간입니다. 42개 앱을 113일에 냈고 전체 매출은 $69.82였다에서 정리한 그림과 정확히 같은 방향이고, 오히려 더 얇습니다.

여기서 당신이라면?

값이 두 배 넘게 틀렸다는 걸 알았을 때, 선택지가 둘입니다.

  1. 이번 창의 숫자를 손으로 고쳐서 쓴다.
  2. 지금까지 이 스크립트로 내린 판단들을 되짚는다.

1번이 훨씬 빠르고, 사실 결과 보고에는 그걸로 충분합니다. 하지만 이 스크립트의 출력은 리포트가 아니라 우선순위였습니다. 잘못된 1위는 그 자체로 몇 주치 작업 방향입니다. 저는 2번을 해야 했습니다.

고친 것과, 고친 뒤에 보이는 것

수정은 한 글자입니다.

if total == 0:
    continue

이제 부호가 보존되고, 결제와 환불이 같은 창 안에서 상쇄됩니다. 그리고 부호를 살리자 읽는 법이 하나 생겼습니다. 어떤 앱의 행에서 거래 수가 0인데 기간이 2일이면, 그건 매출이 없는 게 아니라 결제 한 건과 환불 한 건이 짝을 이룬 것입니다. 합쳐서 0이 되기 때문에 이전 스크립트에서는 아예 아무 흔적도 남지 않던 사건입니다.

이게 이 함정의 진짜 성격입니다. 환불을 버리면 매출이 부풀 뿐 아니라, 환불이 있었다는 사실 자체가 데이터에서 사라집니다. 24시간 만에 되돌아간 결제는 그냥 결제로 남습니다.

자가진단 3개

  • 매출 집계에서 <= 0 이나 > 0 같은 필터를 쓰고 있다면, 그 자리에 음수 행이 오는 경우가 있습니까? (환불·차지백·조정)
  • 리포트 상위 앱 한 개를 골라 원본 리포트에서 해당 행을 직접 열어보십시오. 집계값과 원본 행 합이 일치합니까?
  • 기간 합계를 인용할 때, 그게 총 결제액인지 순매출인지 구분해서 말하고 있습니까?

솔직한 부분

이 결함이 특별히 교묘하지는 않습니다. 코드를 읽으면 바로 보입니다. 문제는 아무도 읽지 않았다는 것이고, 읽을 이유가 없었다는 것입니다. 스크립트는 매일 성공했고, 값이 그럴듯했고, 값이 그럴듯하면 검산을 안 하게 됩니다. 제 판정 기준은 노출 1회를 죽이려 했습니다에서와 같은 형태입니다 — 코드는 잘 돌고, 판정 기준만 조용히 틀립니다.

그리고 정정된 숫자가 더 정직합니다. $73은 "뭔가 되고 있다"처럼 읽히고 $10.29는 아닙니다. 4주에 세 건이면 제품이 아니라 유통의 문제이고, 그건 코드로 푸는 문제가 아닙니다.

지금 딱 하나만 해보세요. 매출 스크립트에서 행을 버리는 조건문을 찾아, 그 조건이 음수도 버리는지 확인해 보시기 바랍니다. 저는 그 한 줄 때문에 한 달을 잘못 읽고 있었습니다.

유튜브

28일 매출 $73 중 $63은 이미 되돌아간 돈이었습니다

관련 글