비즈니스 현실9 분 읽기

미국 설치가 제일 많은데 미국 평점은 43개 앱 전부 0이었다

평점을 지표로 쓰려다 App Store Connect API에 평점이 아예 없다는 걸 알았습니다. 공개 lookup으로 43개 앱을 뽑으니 평점 77건이 전부 한국이었고, 최대 설치 시장인 미국과 일본은 전 앱 0건이었습니다. 원인은 프롬프트가 아니라 리텐션이었습니다.

#app-store#aso#retention#reality-check
개념 도식: KR/US/JP 세 개의 별 아이콘 중 KR만 77로 채워지고 US·JP는 비어 있음. 아래 설치 수 347 / 390 / 157.
평점은 한국만 77건. 설치가 제일 많은 미국은 0건이었다.

평점을 지표로 쓰려고 했습니다. 별점은 스토어 전환율에 직접 걸리는 항이고, 앱 43개짜리 플릿이면 앱별 별점 추이가 우선순위 판단에 쓸 만하다고 봤습니다.

App Store Connect API에서 평점을 찾았습니다. 없었습니다.

여기서 먼저 하나 여쭙겠습니다. 당신은 앱 평점을 레버로 보십니까, 결과 지표로 보십니까? 저는 레버라고 생각했고, 그게 이 글의 반전입니다.

공식 API에는 평점이 없다

ASC API는 평균 평점과 평점 수를 어디에도 노출하지 않습니다. 앱 리소스에도, 버전 리소스에도 없습니다. 있는 건 customerReviews뿐인데 이건 다른 것입니다 — 글이 달린 리뷰만 돌려줍니다. 별점만 남기고 지나간 대다수는 애초에 포함되지 않습니다. 이 엔드포인트를 믿었다가 크게 틀린 이야기는 따로 있습니다 → 리뷰가 사라졌다고 두 번 보고했다.

즉 스토어 제품 페이지에 실제로 표시되는 그 숫자를 공식 API로는 못 얻습니다. 유일한 출처는 인증도 필요 없는 공개 lookup 엔드포인트입니다.

curl -s "https://itunes.apple.com/lookup?id=<appId>&country=us"
# averageUserRating / userRatingCount

43개 앱 × 3개 스토어프론트

결과가 진짜 반전이었습니다.

kr + us + jp 합계 77건
그 중 KR 77건
US 0건 · JP 0건 — 43개 앱 전부

미국은 이 플릿의 최대 설치 시장입니다(110일 누적 390건, 한국 347건보다 많습니다). 그런데 43개 앱 전체에 미국 평점이 하나도 없습니다. 일본도 0입니다(설치 157건).

매출이 나는 앱들이 특히 나쁩니다. 이명 트래커·장 기록·회복 루틴·끝말잇기·픽셀 퍼즐은 평점이 0건입니다. 중위 앱은 1~2건입니다. 이 정도면 제품 페이지에 별점이 사실상 안 보이는 상태입니다.

첫 가설은 틀렸다

"인앱 평점 요청을 안 붙였겠지"라고 생각했습니다. 틀렸습니다. 확인해보니 플릿 거의 전부에 SKStoreReviewController 기반 요청이 이미 들어 있습니다. 두 달 전에 미탑재 22개를 일괄 이식한 기록까지 있었습니다.

그러면 왜 안 뜨느냐 — 게이트 때문입니다. 남용을 막으려고 이렇게 조여뒀습니다.

설치 후 3일 경과  ∧  코어 작업 1회 완료  ∧  14일 쿨다운  ∧  연 3회 이하  ∧  점수 ≥ 임계값

이건 좋은 설계입니다. 문제는 비한국 사용자가 이 게이트에 도달하지 않는다는 것입니다. 같은 플릿의 다른 지표가 이유를 말해줍니다. 삭제율 1215%, 세션 길이 6684초, 일 활성 기기 5~6대. 설치 후 3일까지 남아서 코어 작업을 한 번 끝내는 사람이 한국 밖에는 거의 없습니다.

당신이라면 여기서 무엇을 고치시겠습니까? 게이트를 느슨하게 풀어 요청을 더 자주 띄우겠습니까, 아니면 3일을 남게 만드는 쪽을 고치겠습니까? 전자는 이번 주에 되고 후자는 몇 달 걸립니다. 그런데 전자를 해도 요청을 볼 사람이 없습니다.

즉 평점 0은 프롬프트 문제가 아니라 리텐션 문제입니다. 평점을 "붙이면 되는 것"으로 보고 있었는데, 실제로는 리텐션의 결과 지표였습니다.

도구에서 갈라야 하는 두 가지 0

r = requests.get("https://itunes.apple.com/lookup",
                 params={"id": app_id, "country": cc}, timeout=20)
if not r.json().get("resultCount"):
    return None          # 그 스토어프론트에 아예 없는 앱과 평점 0을 구분해야 한다

resultCount == 0userRatingCount == 0은 다른 상태입니다. 앞은 그 나라에 앱이 없는 것, 뒤는 있는데 평점이 없는 것입니다. 한 칸에 넣으면 다음 사람이 오독합니다.

도구는 스토어프론트를 인자로 받고 결과를 날짜별 JSON으로 남깁니다. 요청 사이에 짧은 sleep을 둡니다 — 인증 없는 엔드포인트라 두드리면 안 됩니다.

평점 보유 앱 37 / 43 · 합계 77건 · 전부 KR
중위 1~2건 · 최다 5건 · 매출 상위 앱 다수가 0건

지금 바로 점검할 3가지

  1. 당신의 최대 설치 시장에서 앱 평점이 몇 건입니까? 공개 lookup으로 30초면 나옵니다.
  2. 평점 요청 게이트의 조건을 적어 놓고, 그 조건에 실제로 도달하는 사용자 비율을 세어 보세요. 0에 가까우면 게이트가 아니라 리텐션이 문제입니다.
  3. 데이터 수집 코드에서 "그 나라에 앱이 없음"과 "평점이 0"을 구분하고 있습니까?

솔직한 부분

평점을 레버로 착각했습니다. "프롬프트를 넣자 → 평점이 오른다 → 전환이 오른다"로 생각했는데, 앞의 화살표가 성립하려면 3일을 남아 있어야 합니다. 순서를 거꾸로 짚었습니다.

lookup 엔드포인트의 "현재 버전" 필드도 못 믿습니다. averageUserRatingForCurrentVersion / userRatingCountForCurrentVersion이 37개 앱 전부에서 전체 값과 똑같이 나왔습니다. 이걸 근거로 "릴리스마다 평점이 초기화되고 있다"는 가설을 세웠다가 접었습니다 — 한 앱은 5월 리뷰가 여러 릴리스를 건너 지금도 살아 있어서 모순입니다. 이 필드는 전체 값을 미러링하는 것으로 보고 쓰지 않는 게 안전합니다.

그리고 인증 없는 공개 엔드포인트에 의존하는 구조입니다. 애플이 막으면 대안이 없습니다. 그래서 라이브 조회 대신 날짜별 스냅샷을 파일로 남기게 만들었습니다. 스토어 숫자는 천천히 움직이므로 델타가 신호입니다.

왜 한국만 남는지도 가설입니다. "한국 사용자가 지인·초기 유저라 3일을 남는다"와 "그냥 한국 트래픽의 질이 높다"를 이 데이터로 구분할 수 없습니다.

그 스냅샷의 오늘 값(평점 78건, 전부 KR)과 앱 41개 목록은 113일 결제 원장 글에 있습니다.

지금 당신 앱의 최대 시장 스토어프론트로 lookup을 한 번 때려 보시겠습니까? 별점 수가 0이면, 고칠 것은 팝업이 아닙니다.

유튜브

앱 43개 미국 평점 0건 일본도 0건

관련 글