만든 앱을 실제로 쓰는 사람 세어 보기
앱에 유료 이용권을 붙여 놓고 나서야 쓰는 사람이 몇인지 모른다는 것을 알았습니다. 세는 방법을 만들었더니 0명이 나왔는데, 회원 명부가 두 군데 있었고 제가 빈 쪽을 세고 있었습니다. 제대로 세니 가입 열 명, 초안을 만들어 본 계정 0명이었습니다.

AI로 생성한 그림입니다
사업이 끝나고 결과보고서를 쓸 때 제일 먼저 채우는 칸이 참여 인원입니다. 저는 제가 만든 앱에서 그 칸을 못 채웠습니다. 몇 명이 가입했는지, 그중 실제로 써 본 사람이 몇 명인지 물었더니 답할 방법이 없었습니다.
세는 방법을 만들었더니 처음에는 0명이 나왔습니다. 계정은 분명히 있는데요. 회원 명부가 두 군데 있었고 제가 빈 쪽을 세고 있었습니다.
이 글은 그 숫자 넉 줄을 만든 기록입니다. 나온 결과는 좋지 않았습니다.
앱을 만들어 놓고 왜 세어 보게 됐나요
쓰는 사람이 몇인지 모르는 채로 요금부터 붙이면 순서가 거꾸로 됩니다. 저는 앱에 유료 이용권을 달아 둔 참이었습니다. 무료로 초안을 다섯 번까지 만들고, 더 쓰려면 결제하는 구조입니다.
그러고 나니 답해야 할 물음이 생겼습니다. 이 요금을 계속 둘 것인가, 접을 것인가. 감으로는 못 정합니다. 사업을 이어갈지 접을지 볼 때 참여 인원과 재참여 인원을 먼저 세는 것과 같습니다.
그래서 판정에 쓸 숫자를 넉 줄로 정했습니다. 이번 주에 가입한 사람, 지금까지 가입한 사람, 초안을 한 번이라도 만든 계정, 무료 다섯 번을 다 쓴 계정.
넷째 줄이 제일 중요합니다. 한도까지 닿은 사람이 0명이면 결제한 사람도 반드시 0명입니다. 그건 가격이 비싸서가 아닙니다. 아직 아무도 안 썼다는 뜻입니다.
계정이 열 개인데 왜 0명이 나왔나요
제가 세라고 시킨 표에 원래 아무것도 없었기 때문입니다. 앱의 회원 정보는 데이터베이스라는 곳에 표 모양으로 쌓입니다. 엑셀 시트가 여러 장 있는 파일이라고 보시면 됩니다.
제가 쓰는 데이터베이스에는 회원가입 기능이 기본으로 딸려 있습니다. 그 기능을 쓰면 정해진 회원 표에 사람이 쌓입니다. 저는 그걸 안 쓰고 회원 표를 직접 만들어 썼습니다. 만들 때 제 손으로 그렇게 정해 놓고, 세러 갈 때는 기본으로 딸려 오는 쪽을 셌습니다.
그 표는 비어 있으니 0이 나옵니다. 오류도 안 납니다. 명령은 정상이고 답도 정상입니다. 다만 물어본 곳이 틀렸습니다.
이걸 알아챈 건 다른 숫자 덕분입니다. 같은 결과에서 최근 30일에 무언가 한 계정이 2명으로 나왔거든요. 가입자가 0명인데 활동한 사람이 2명일 수는 없습니다. 두 숫자가 서로 어긋나서 잡혔습니다.
무엇을 세기로 했나요
세는 대상을 문장으로 먼저 적었습니다. 코드보다 이게 먼저입니다.
- 가입: 회원 표에 줄이 생긴 사람. 이번 주와 누적을 따로 셉니다.
- 초안 생성: 앱에서 문서 초안을 실제로 만든 사람. 가입만 하고 나간 사람과 구분합니다.
- 한도 소진: 이번 달 무료 다섯 번을 다 쓴 계정. 결제 직전까지 온 사람입니다.
- 활동: 최근 30일에 앱에서 뭐라도 한 계정. 전환율을 낼 때 분모가 됩니다.
기록은 이미 쌓이고 있었습니다. 앱은 사람이 버튼을 누를 때마다 기록 표에 한 줄씩 남깁니다. 문서 내용이나 이름 같은 건 안 담고, 어떤 기능을 썼는지만 짧게 적습니다. 세기 위해 새로 만든 표는 없습니다.
숫자를 뽑는 명령문은 이렇게 생겼습니다
파일 하나에 명령문 한 벌을 적어 두고, 볼 때마다 통째로 붙여넣어 돌립니다. 핵심은 이 대목입니다.
-- 초안을 한 번이라도 만든 계정
select count(distinct user_id)
from public.events
where event_name = 'feature_use'
and props->>'feature' = 'doc_generate';
-- 이번 달 무료 다섯 번을 다 쓴 계정 (유료 계정은 뺀다)
select count(*)
from (
select user_id, count(*) as n
from public.events
where event_name = 'feature_use'
and props->>'feature' = 'doc_generate'
and created_at >= date_trunc('month', now())
group by user_id
) t
where n >= 5;
events 가 아까 말한 기록 표이고, feature_use 는 기능을 실제로 실행했다는 표시입니다. doc_generate 는 그중 초안 만들기입니다.
여기서 지킨 선이 하나 있습니다. 표를 새로 만들지 않았습니다. 세기 위해 표를 늘리면 앱이 무거워지고, 그 표가 맞는지 다시 확인해야 합니다. 이미 쌓이는 기록을 세는 것으로 충분했습니다.
한 가지 더. 무료 한도를 다섯 번으로 정한 건 앱 코드이고, 다섯 번을 세는 건 이 명령문입니다. 두 군데에 같은 숫자가 적혀 있습니다. 나중에 한도를 바꾸면 여기도 같이 고쳐야 한다고 파일 맨 위에 적어 뒀습니다. 안 적어 두면 반년 뒤의 제가 모릅니다.
세어 보니 나온 숫자
9월 8일에 돌린 결과입니다.
| 세는 것 | 값 |
|---|---|
| 가입 (누적) | 10명 |
| 가입 (최근 7일) | 1명 |
| 초안을 한 번이라도 만든 계정 | 0명 |
| 무료 다섯 번을 다 쓴 계정 | 0명 |
| 최근 30일 활동 계정 | 2명 |
| 결제한 계정 | 0명 |
가입은 열 명인데 초안을 만들어 본 계정은 없습니다. 제 계정으로 시험한 것은 다른 경로라 여기 안 잡힙니다.
이 표를 보고 요금을 손대지 않기로 했습니다. 아무도 안 만들어 봤는데 가격을 내리면 결과가 안 바뀝니다. 손댈 곳은 요금이 아니라 앱에 도착한 사람이 첫 초안까지 가는 길입니다.
복지관 실적으로 옮기면
명부가 두 군데인 상황은 현장에도 흔합니다. 출석부에 적은 인원과 회원관리 시스템에 등록된 인원이 다르고, 담당자가 따로 만든 엑셀에는 또 다른 숫자가 있습니다. 실적을 낼 때마다 어느 쪽을 셌는지가 갈립니다.
제가 이번에 한 것은 세 가지였습니다.
먼저 무엇을 셀지 문장으로 적었습니다. 「참여 인원」이 아니라 「한 번이라도 출석한 사람」처럼, 세는 조건이 문장 안에 들어가 있어야 합니다. 다음으로 어느 명부에서 세는지를 그 문장 옆에 적었습니다. 마지막으로 서로 어긋나면 알아채도록 관련된 숫자를 같이 뽑았습니다. 가입 0명과 활동 2명이 나란히 있었기 때문에 틀린 걸 알았습니다.
숫자 하나만 뽑아 보면 그게 틀려도 모릅니다. 옆에 다른 숫자가 있어야 어긋난 게 보입니다.
이 숫자로 아직 못 하는 것
전환율은 아직 볼 수 없습니다. 최근 30일 활동 계정이 2명이라 분모가 너무 작습니다. 여기서 한 명이 결제하면 50퍼센트, 안 하면 0퍼센트입니다. 어느 쪽도 요금을 접을지 말지에 답해 주지 않습니다.
그래서 판정 시계를 아직 안 켰습니다. 활동 계정이 30명이 되는 달부터 8주를 세기로 정했습니다. 30명이면 한 명이 결제했을 때 3퍼센트쯤 되니, 그때부터 숫자가 뜻을 갖습니다.
이탈한 사람 수는 대략치입니다. 구독이 켜지고 꺼진 이력을 따로 안 쌓아서, 지금 꺼져 있고 최근에 바뀐 줄을 셉니다. 한 사람이 한 달에 여러 번 오갔으면 한 번으로 셉니다.
그리고 이 표는 왜 안 쓰는지를 말해 주지 않습니다. 가입까지 왔다가 초안을 안 만든 열 명이 어디서 멈췄는지는 숫자로 안 나옵니다. 그건 사람한테 물어야 합니다. 다음에 할 일이 그것입니다.
이 글은 AI로 초안을 쓰고 사람이 확인해 다듬었습니다.
함께 보면 좋은 글
직접 써 보기
양식 없이, 네 칸만 채우면 사업계획서 초안이 나옵니다
이 블로그와 별도로 운영하는 공개 웹앱입니다. 가입하면 매달 다섯 번까지 무료.
새 글과 새 무료 프로그램이 나오면 메일로 알려드려요.
메일로 소식 받기 (새 창에서 열림)