Butterfly(할 일 관리 앱)에 유료 구독(Pro, Team 25, Team 50)을 붙이면서 결제 검증과 구독 관리를 직접 다 짜지 않으려고 RevenueCat을 선택했다. "SDK 하나 붙이고 서비스 계정 키 하나 올리면 끝"일 줄 알았는데, 실제로는 하루를 꼬박 썼다. 나중에 비슷한 걸 또 하게 될 나 자신을 위해, 그리고 혹시 같은 길을 가려는 사람을 위해 겪은 일을 그대로 남겨둔다.

RevenueCat 공식 발표 이미지 — Kotlin 로고와 'Announcing RevenueCat KMP 3.0' 문구
이미지: revenuecat.com

0. 출발점: Google Play Console 구독 상품부터

RevenueCat에 연결하려면 일단 Google Play Console에 구독 상품과 기본 요금제가 있어야 한다. 이 단계에서도 작은 함정이 있었다.

  • 기본 요금제를 "자동 갱신"이 아니라 "선불"로 잘못 만든 걸 뒤늦게 발견했다. 바로잡으려고 봤더니, 한 번이라도 활성화된 기본 요금제는 삭제가 안 되고 영구 비활성화만 가능했다. 결국 기존 건 꺼두고 올바른 자동 갱신 요금제를 새로 만들어야 했다.
  • 요금제 생성 화면 자체도 입력했는데 값이 저장이 안 되는 경우가 종종 있어서, 저장했다고 생각하고 넘어갔다가 나중에 "그런 요금제 없는데?"라는 걸 확인하는 해프닝도 있었다.

여기까지는 그래도 Play Console 하나짜리 문제라 버틸 만했다.

1. RevenueCat 쪽 Products / Entitlements / Offerings — 여기는 양호

RevenueCat 대시보드에서 실제 Play Store 상품을 등록하고, Entitlement(권한 단위)로 묶고, Offering에 패키지로 구성하는 과정 자체는 개념이 명확해서 할 만했다. Product → Entitlement → Offering으로 이어지는 구조는 이해하고 나니 합리적이었다.

다만 이 작업을 자동화로 진행하던 중에는 입력한 값이 화면에 바로 반영되지 않고, 새로고침하거나 다시 시도해야 값이 들어가는 현상이 꽤 자주 발생했다. 사람이 직접 타이핑할 땐 못 느낄 수 있는 문제지만, 대시보드 자체의 반응성이 가끔 불안정하다는 인상을 받았다.

2. 진짜 고비 ①: 서비스 계정과 Pub/Sub

"서비스 계정 JSON 키 만들어서 업로드하면 끝" — 이 한 줄이 제일 큰 함정이었다.

JSON 올리자마자 이런 에러가 떴다.

Your Google service account credentials do not have permissions to access the Google Cloud Pub/Sub API.

이게 Play Console 문제가 아니라 Google Cloud IAM 쪽 문제라는 걸 알아내는 데 시간이 걸렸다. RevenueCat이 실시간 구독 알림을 받으려고 Pub/Sub이라는 구글 클라우드 서비스를 쓰는데, 서비스 계정에 그 권한(Pub/Sub 편집자 역할)이 없었던 것이다.

여기서 또 헷갈렸던 부분: 분명 "서비스 계정" 목록엔 내가 만든 계정이 있는데, IAM 화면에는 안 보였다. 알고 보니 권한이 하나도 없는 계정은 IAM 멤버 목록에 아예 뜨지 않는다. "액세스 권한 부여"로 새로 추가해야 했는데, 이건 공식 가이드만 봐서는 바로 눈에 안 들어오는 함정이었다.

3. 진짜 고비 ②: Play Console 권한 — 메뉴가 사라졌다

Pub/Sub 문제를 풀고 나니 이번엔 이런 에러.

Could not validate access to the Google Play in-app product catalog Could not validate access to the Google Play subscription catalog and base plans

이건 Google Cloud가 아니라 Play Console 쪽에서 서비스 계정에 앱 접근 권한을 줘야 하는 문제였다. 그런데 예전 가이드에서 보던 "API 액세스"라는 메뉴가 지금 Play Console에는 없다. 한참 찾다가 알아낸 건, 지금은 **"사용자 및 권한 > 신규 사용자 초대"**로 서비스 계정 이메일을 사람 계정 초대하듯 등록해야 한다는 것. 메뉴 이름도 위치도 가이드와 실제 화면이 안 맞아서 계속 헤맸다.

게다가 RevenueCat 에러 메시지에는 권한 2개만 언급됐는데, 공식 문서를 다시 찾아보니 실제로 필요한 권한은 4개였다.

  1. 앱 정보 보기 및 대량 보고서 다운로드 (읽기 전용)
  2. 재무 데이터, 주문, 취소 설문조사 응답 보기
  3. 주문 및 정기 결제 관리
  4. 스토어 등록정보 관리

에러 메시지에 안 나온 3, 4번을 안 챙겼으면 나중에 또 다른 에러를 만났을 것이다.

4. 권한 다 줬는데도 안 됨 — 최대 36시간

권한을 다 맞게 설정했는데도 여전히 안 됐다. 이것저것 찾아보다가 RevenueCat 공식 문서 맨 아래쯤에서 발견한 문구.

Credentials can take up to 36 hours to become valid.

즉, 설정을 100% 올바르게 했어도 최대 36시간을 그냥 기다려야 하는 구조다. 이 사실이 에러 화면 어디에도 안 나오고, 별도 문서 페이지를 찾아 들어가야 알 수 있다는 게 제일 답답했다. "내가 뭘 잘못했나"를 몇 시간째 의심하게 만드는 구조다.

그나마 공식적으로 소개된 우회 방법이 하나 있다: Play Console에서 아무 구독 상품의 설명을 살짝 바꿨다가 저장하면 반영이 빨라지는 경우가 있다고 한다 (보장은 안 됨).

총평

기능이나 개념 설계(Entitlement, Offering 구조) 자체는 괜찮다고 생각한다. 문제는 설정 과정이:

  • Google Play Console (구독 상품)
  • Google Cloud IAM (서비스 계정 권한)
  • Google Play Console (사용자 권한, 메뉴 위치도 자주 바뀜)
  • RevenueCat 대시보드

이렇게 서로 다른 네 개의 시스템을 돌아다녀야 하고, 각 시스템에서 발생하는 에러 메시지가 서로 다른 시스템의 설정 문제를 가리키는 경우가 많다는 점이다. 거기에 공식 가이드가 최신 UI를 완전히 따라가지 못하는 부분(사라진 메뉴, 에러 메시지와 실제 필요 권한 목록의 불일치)까지 겹치면서, 하루 작업 분량을 그냥 "원인 찾기"에 다 썼다.

개인적으로는 — 추천하냐고 묻는다면, 선뜻 추천하기는 어렵다. 기능은 쓸 만하지만 초기 설정 난이도와 디버깅 난이도가 생각보다 훨씬 높았다. 지금은 일단 36시간을 기다리는 중이고, 결과가 나오면 후기를 업데이트할 예정이다.