세미나 광고 이미지
  • 비즈니스 데이터 분석

구독 서비스의 성장 지표 확인하기 #2. 구독 매출

세미나 광고 이미지
세미나 광고 이미지
앞선 글에서 구독 서비스의 성장 지표 중 구독자(Subscriber)에 대한 내용을 살펴봤습니다. 이번 글에서는 구독 서비스의 두 번째 성장 지표인 구독 매출(Sales 혹은 Revenue)에 대해 알아보도록 하겠습니다.
지난 달 대비 이번 달의 유료 구독자가 늘었다면 우리 서비스가 잘 성장하고 있다고 볼 수 있습니다. 그렇다면, 비슷한 맥락에서 지난 달 대비 이번 달의 구독 매출이 늘었다면 마찬가지로 우리 서비스가 잘 성장하고 있다고 봐도 될까요? 이 질문에 대한 답은 '알 수 없다' 입니다. 증분을 그대로 성과와 연결할 수 있는 '구독자'와 달리, '구독 매출'의 성과 판단을 위해서는 단순 기간별 집계 이상의 분석이 필요하기 때문입니다. 지금부터 이 부분에 대해 자세히 살펴보겠습니다.
사진 출처: Unsplash의rc.xyz NFT gallery
사진 출처: Unsplashrc.xyz NFT gallery

1. 매출 발생 시점 기준으로, 결제 금액 합산하기

구독 매출을 분석할 때 단순히 일별/월별 결제금액을 합산해서 사용하는 것은 바람직하지 않습니다. 일반적인 구독 결제 프로세스에서는 구독 기간 전체에 대한 금액을 초기에 한 번 결제하기 때문에(1개월 사용권, 혹은 1년 사용권을 결제하면 해당 기간 동안은 추가 결제 없이 서비스를 사용할 수 있음), 구독 매출은 미래의 매출을 현재로 가져와서 선반영하는 특성을 가집니다. (이러한 특성으로 인해 회계적으로는 구독 매출을 선수금에 해당하는 부채로 먼저 잡고, 서비스 이용 기간에 따른 경과분 만을 분리해서 매출로 잡는 것이 일반적입니다. 이 글에서 회계 이야기를 하려는 건 아니니깐 TMI는 여기까지...)
복잡한 회계 처리를 고려하지 않더라도, 단순히 일별/월별 결제금액을 합산하는 것만으로는 데이터의 해상도가 너무 낮아서 의미있는 인사이트를 얻기 어렵습니다. 지난달과 이번달 매출이 똑같이 1억원이라고 하더라도, 첫 구독과 재구독 비율, 구독 상품의 종류, 구독 기간(월 구독, 연 구독)이나 구독 상품의 가격 등 결제의 여러 속성(property)에 따라서 지난 달의 1억원 구독 매출과 이번 달의 1억원 구독 매출은 전혀 다른 의미일 수 있습니다.
​​

2. 매출을 구독 기간 전체로 안분해서 평탄화(flatten)하기

단순히 일별/월별 결제금액을 합산하는 것으로 구독 서비스 매출 성장을 판단하기 어렵다면, 어떤 대안이 있을까요? 우선 생각해 볼 수 있는 방법은 구독 매출을 (결제 시점에 모두 인식하지 않고) 구독 기간 전체로 안분해서(flattening) 인식하는 것입니다. 예를 들면, 한 유저가 36500원짜리 연 구독 상품을 결제한 경우, 이를 365로 나눠서 결제 당일부터 1년간 매일 100원씩의 매출을 낸 것처럼 계산하는 것이죠. 이 경우 미래의 매출을 한번에 선반영한다는 문제를 해결할 수 있기 때문에 훨씬 신뢰할만한 매출 트렌드를 확인할 수 있습니다. 일종의 Flattening Revenue 라고 할 수 있겠네요. (물론 평탄화 된 데이터를 주나 월 단위로 묶어서 기간별 합계를 볼 수도 있습니다)
하지만 구독 기간을 고려해서 평탄화를 하더라도, 데이터 해상도가 높다고 이야기하긴 어렵습니다. 매출 트렌드가 우상향인지, 혹은 정체인지... 같은 큰 그림은 볼 수 있지만, 지금 매출이 정체하는 원인을 분석하거나 매출을 높이기 위한 가설들을 세세하게 찾아내기에는 확인할 수 있는 정보의 양이 부족하고 내용이 단순하기 때문입니다.
​​

3. 결제한 유저의 속성을 기반으로 매출을 쪼개서 살펴보기

구독 매출을 분석할 때 널리 권장되는 프레임워크는 MRR(Monthly Recurring Revenue) 입니다. MRR의 핵심은 Recurring 되는 매출과 그렇지 않은 매출을 구분하고, 각각의 매출이 어떤 맥락에서 발생했는지를 쪼개서 보는 데 있습니다. 가령 1개월 단위로 1만원을 결제하는 구독 서비스에서 신규 구독자가 1명 발생하면, 이 사용자가 구독을 해지하기 전까지는 매월(Monthly) 반복해서(Recurring) 1만원의 매출이 발생할 것이라고 기대할 수 있습니다. 이처럼 매월 반복 결제되는 매출을 파악하고, 반복 결제 매출의 증감에 영향을 미치는 이벤트들(신규 구독, 구독 해지, 구독상품 업그레이드...)로 인해 영향을 받는 매출을 분리해서 계산하는 것이 MRR 분석의 핵심입니다.
지난달의 MRR이 100만원이고, 1개월 동안 반복 매출에 영향을 주는 아무런 이벤트가 없었다면 (=신규 구독자도 없고, 구독 해지자도 없고, 구독 상품을 변경한 사람도 없다면) 이번달의 MRR은 동일한 100만원입니다. 즉 새로운 달의 MRR은 전월 MRR을 Baseline으로 해서, 이 달에 발생한 이벤트로 인한 변화량을 반영해서 계산할 수 있습니다. 이 달에 발생한 이벤트는 MRR을 증가시키는 것과 감소시키는 것으로 나눠서 생각할 수 있는데요. MRR을 증가시키는 이벤트에는 신규 구독자가 생기거나, 기존에 구독을 하다가 해지했던 사람이 다시 돌아오거나, 현재 구독자가 구독 상품을 상향해서 업그레이드 하는 케이스를 생각해 볼 수 있습니다. 반대로 MRR을 감소시키는 이벤트는 구독자의 이탈, 구독 상품 다운그레이드 등을 예로 들 수 있겠네요. 이를 간단한 수식으로 나타내면 아래와 같습니다.
MRR 기본 수식
MRR 기본 수식
위 식에서 전월 MRR - left_subsrenew_subs(현 구독 유저의 갱신 매출) 로 표현할 수도 있습니다. 이 경우 수식은 아래와 같은 형태로도 표현 가능합니다.
MRR 기본 수식 2
MRR 기본 수식 2
renew_subs를 알 수 있다면, 구독 매출의 이탈율도 계산할 수 있는데요. 아래 수식을 통해 간단히 구할 수 있습니다.
Churn rate
Churn rate
이상이 일반적인(?) MRR에 대한 설명인데요. 위에 설명한 것 처럼 MRR 자체는 간단한 개념이고, 관련 키워드로 검색을 하다보면 참고할만한 아티클도 쉽게 찾을 수 있습니다. 하지만, 막상 현실에서(!) MRR 분석을 진행하는 것은 말처럼 쉽지 않은 경우가 많습니다. 저도 이 이론(?)은 잘 알고 있었지만, 막상 업무 중에 MRR을 계산해서 활용하려니 몇 가지 어려움에 부딪혔는데요. 이 부분에 대해 조금 더 자세히 설명드리려고 합니다.
​​

4. 실전에서 MRR 계산하고 활용하기

1) 유저에 대한 식별

MRR 분석을 위해서는 기본적으로 유저 단위로 결제 상품과 횟수를 확인할 수 있어야 합니다. 이를 바탕으로 각 결제건을 첫 결제 혹은 갱신 결제로 매핑, 식별할 수 있어야 recurring 매출 판단이 가능합니다. 구독과 결제 정보를 모두 내재화해서 가지고 있다면 별로 문제될 게 없을텐데요. 만약 애플과 구글 앱스토어에서 제공하는 인앱결제를 사용하고 있다면, 이 부분이 생각만큼 간단하지 않습니다. (알라미 서비스는, 알라미 로그인과는 별개로 애플이나 구글 계정을 기반으로 구독 결제를 하는 구조를 가지고 있습니다)
구글의 경우, Google Play의 Sales Report 를 통해 아래와 같은 포맷의 데이터를 확인할 수 있습니다. (저희는 fivetrans을 사용해서 각 스토어의 구독 관련 데이터를 내부 DW에 적재합니다.) 각 결제 건에 대한 raw data를 확인할 수 있는 구조이지만, 개별 유저의 gaid나 email 등의 식별자는 포함되어 있지 않습니다. 그래서 첫결제와 재결제(혹은 연속 결제)를 판단하기 위해서는 주문번호(order_number)를 활용해야 합니다. order_number의 prefix를 통해 동일 유저를 식별하고, suffix에 표시되는 일련번호에 따라 연속결제 횟수를 판단할 수 있습니다. 연속 결제를 볼 때, 과거 결제일과 일정한 간격이 유지되는지를 확인하면 renew인지 return인지를 구분할 수도 있겠죠.
Google Play에서 받아오는 Sales 데이터 샘플
Google Play에서 받아오는 Sales 데이터 샘플
TMI지만, 첫 결제를 표시하는 suffix 부분이 0, 1, null 등 여러 가지 케이스로 나타나기 때문에 (SQL 문법 기준으로 설명하자면) 아래와 같이 row_number() 함수를 써서 해당 유저의 결제 횟수를 별도로 계산하는 식으로 활용할 수 있습니다.
 
상대적으로 애플 앱스토어는 애초에 유저 단위의 정보를 주지 않고, 모든 데이터를 집계 된 형태로 주기 때문에 분석이 훨씬 더 까다롭습니다. 그나마 첫결제와 재결제를 별도 flag로 구분해 주긴 하지만, trial 결제를 하더라도 이를 첫결제로 로깅하기 때문에 trial → paid 로 이어지는 사용 플로우에 대해서는 첫번째 유료 결제를 정확히 구분하기 어렵습니다. 이때문에 애플 앱스토어 구독 데이터를 상세히 분석하기 위해서는 스토어에서 전달받는 데이터랑 별개로 자체적인 구독 데이터 로깅 시스템이 반드시 필요합니다.
​​

2) 구독 해지 매출(left_subs)을 계산하기

left_subs는 구독 해지로 인해 감소한 매출을 의미합니다. 여기서 주의해야 하는 부분은, 구독 해지가 passive 이벤트라는 점입니다. 실제로 '구독 해지'라는 이벤트를 하면서 마이너스 결제가 발생하는 게 아니라 '재결제를 하지 않음' 이라는 수동적인 이벤트로 인해 연속해서 결제할 수 있었던 금액이 '결제되지 않는' 이벤트라는 의미입니다. (행동 로그 기준으로는 '구독 해지'라는 이벤트를 특정할 수 있지만, 스토어를 통해서 확인 가능한 Sales 리포트에는 '구독을 해지했음' 이라는 상태값이 드러나지 않습니다. 당연하게도 여기는 결제가 이루어진 건들만 기록되니까요)
그래서 이론적으로는 전월 MRR에서 left_subs를 빼서 renew_subs를 구하는 것처럼 되어있지만, 현실에서는 renew_subs를 먼저 집계한 다음에 전월 MRR에서 이 숫자를 빼서 left_subs를 구하는 것이 자연스럽습니다. 즉, left_subs = 전월 MRR - renew_subs 로 계산할 수 있습니다.
​​

3) Renew_subs 와 Return_subs 의 구분

연속된 재결제(renew_subs)와 연속되지 않은 재결제(return_subs)를 구분해야 할까요?
굳이 구분하지 않는 경우도 많지만 (이 경우 return_subs는 new_subs의 부분집합으로 분류하는 경우가 많음), 개인적으로는 구분해서 보는 것이 바람직하다고 생각합니다. 첫결제와 연속되지 않은 재결제는 그 성격이 다르기 때문입니다. 특히 구독은 처음 시작이 굉장히 중요하기 때문에 install(혹은 signup) → new_subs 로 연결되는 퍼널 분석이 중요한데, return_subs 비중이 크다면 이 퍼널을 분석할 때 데이터를 잘못 해석할 여지가 있습니다.
Google Play Sales 테이블 예시
Google Play Sales 테이블 예시
renew_subs와 return_subs를 구분하는 기술적인 방법은, 결제가 일정 주기로 빠짐없이 반복되는지를 확인하는 것입니다. (월 결제의 경우, 이전 결제일과의 차이가 32일 이내인 경우 renew로 판단하고 그보다 길면 return으로 판단하는 식...)​
 
​​

4) 연 구독 상품의 MRR을 보는 방법은?

연 구독 상품은 어떤 식으로 MRR을 볼 수 있을까요? 사실 연 구독이라고 해서 구조적으로 월 구독과 달라지는 부분은 없기 때문에 Duration을 연 단위로 나눈 후에 ARR(Annual Recurring Revenue)을 보는 것이 가장 간단합니다. 하지만 이 경우 성과가 쌓이는 1년 동안 (손가락 빨면서) 기다려야 한다는 문제가 있습니다. 이슈가 생길 경우 인지하거나 대응하는 게 너무 늦어질 수도 있고, 여러모로 추천하는 방법은 아닙니다. 생각해보면 1년에 한 줄씩 데이터가 쌓이는 걸 보면서 의사결정을 하는 건 너무 비현실적이죠.
이러한 이유로 구독 기간이 연 단위라고 하더라도, 데이터를 쌓고 분석하는 것은 월 단위로 진행하는 것이 더 좋습니다. 개념적으로는 연 구독 결제금액을 12로 나눠서 월 단위 결제가 발생한 것처럼(!) flatten 시켜서 살펴보는 것이라고 설명할 수 있습니다. 단, 이 경우 앞서 이야기한 월 구독 분석과는 다른 점이 하나 있는데요. cont_subs 라는 상태값이 하나 더 필요합니다. cont_subs는 그 달에 결제를 하진 않았지만, 이미 연 구독 결제를 한 상태에서 구독 만료가 되기 전이라서 구독이 유지되고 있는 상태를 의미합니다. 즉 이탈이나 재결제의 대상이 아닌 Status 입니다. 이를 반영해서 연 구독 MRR 수식을 재정리하면 아래와 같습니다.
연 구독 MRR 수식
연 구독 MRR 수식
위 식에서 renew_subs = 전월 MRR - left_subs - cont_subs 로 바꿔서 표시할 수 있습니다. 이를 적용해서 수정하면 전월 MRR과 당월 MRR의 관계를 아래 식으로 나타낼 수도 있습니다. (월 구독 MRR 분석할 때 봤던 것과 동일한 식이죠? cont_subs는 Baseline에 포함되기 때문에 그렇습니다.)
연 구독 MRR 수식 2
연 구독 MRR 수식 2

5) 환불에 대한 처리

결제 후 환불이 발생하는 경우, 이를 어떻게 반영해야 할까요? 간단한 방법은 환불된 order에 대한 원주문 결제 내역을 분석에서 제외 처리하는 것입니다. (환불이 발생하면 해당 order_id로 인한 결제 자체가 없었던 것처럼...) 다만 이 경우 환불이 발생하면 과거 날짜의 데이터가 지속적으로 수정되기 때문에, 날마다 전체 데이터를 갱신해야 한다는 문제가 있습니다.
복잡하지만 좀 더 정확한 방법은 환불에 대한 상태값을 별도로 구분하는 것입니다. 앞서 구독 해지를 left_subs 라는 상태값으로 정의했는데요. 환불은 구독 해지와 다른 이벤트라는 점을 유의해야 합니다. left_subs(구독해지)는 이후에 진행되는 결제를 멈추는 passive event인 반면 (과거의 결제 건은 변함없음), refund_subs(환불)은 과거에 결제한 데이터를 되돌리는는 active event 입니다.
​​

6) 유저 단위의 계산과 매출 단위의 계산이 모두 가능

마지막으로 언급할 부분은, 위와 같이 구독상품의 MRR을 쪼개서 분석할 때 '유저' 단위의 집계와 '매출' 단위의 집계를 혼동하지 않아야 한다는 점입니다.
예를 들면, 아래 식은 '구독자 수'를 기준으로도 만들 수 있고, '구독 매출'을 기준으로도 만들 수 있습니다. 위 식에서의 new_subs는 분석 목적에 따라 '신규 구독자 수'가 될 수도 있고, '신규 구독자로 인한 매출'이 될 수도 있다는 점을 기억하시고, 집계 쿼리나 대시보드를 만들 때 이 부분을 혼동하지 않도록 주의하시기 바랍니다.
notion image
이상으로 2편에 걸쳐 구독 서비스의 성장지표(구독자, 구독 매출)를 살펴봤습니다. (원래 두 편을 연이어서 쓰려고 했는데, 뭔가 다른 일들로 조금씩 미루다보니 완성하는데 무려 4달이 걸렸네요.) 구독자 수나 구독 매출이 중요한 지표인 것은 틀림없지만, 둘 다 결과적으로 집계되는 후행지표에 가깝다보니 이를 이루고 있는 다양한 구성요소들을 잘 쪼개서 보는 것이 구독 데이터 분석 해상도를 크게 높일 수 있다는 점을 기억하시면 좋을 것 같아요. 구독 서비스를 담당하시는 분들께 도움이 되셨으면 좋겠네요!
 
제가 근무하는 딜라이트룸에서 개발, 디자인을 비롯한 여러 포지션의 동료들을 찾고 있습니다. 딜라이트룸 채용에 관심 있으신 분들은, 아래 링크를 참고해주세요! :)
 
 
✍🏻
Editor 선미’s comment
이 글의 원문은 양승화님의 블로그에 업로드 된 “구독 서비스의 성장 지표 확인하기 #2. 구독 매출”입니다.
양승화딜라이트룸 | Data Lead

딜라이트룸의 데이터와 마케팅 조직을 담당하고 있습니다. 알라미(Alarmy) 서비스의 핵심 지표를 관리하고, 가설 검증과 성장 실험을 진행합니다. <그로스 해킹>이라는 책을 썼습니다.

함께 읽어보면 좋은 글

주식회사 데이터리안