RevenueCat + App Store Connect 구독 세팅 완벽 튜토리얼
“앱은 다 만들었는데 구독 설정이 막막해요.”
칼로리 카메라처럼 개인이 만든 iOS 앱도, RevenueCat을 이용하면 인앱 구독을 몇 시간 안에 완성할 수 있습니다. 이 튜토리얼은 Apple App Store Connect와 RevenueCat 대시보드를 오가며 실제 서비스에서 바로 쓸 수 있는 설정 순서를 정리했습니다.
목표: App Store 서버 알림 → 상품 등록 → Entitlement → Offering/Package까지 완성된 RevenueCat 프로젝트
한눈에 보는 전체 플로우
- App Store Server Notifications: Apple이 보내는 영수증 이벤트를 RevenueCat으로 전달
- Products 등록: App Store Connect에서 만든 구독 상품 ID를 RevenueCat 상품과 연결
- Entitlement 생성: “프리미엄 권한”을 만들어 어떤 구독이 무엇을 해제하는지 정의
- Offering & Package 구성: 실제 Paywall에서 보여줄 월간/연간 구독 묶음 만들기
- 체크리스트 확인: 빠진 항목 없이 저장됐는지 검증
각 단계는 아래 예시 프로젝트(칼로리 카메라)를 기준으로 설명하지만, 다른 앱도 동일한 구조로 적용할 수 있습니다.
사전 준비물
- Apple 개발자 계정과 App Store Connect에서 등록된 앱 (
com.effy.caloriecamera) - RevenueCat 프로젝트 1개와 iOS 앱이 연결되어 있는 상태
- App Store Connect에서 이미 생성된 인앱 구독 상품
- 월간:
com.effy.caloriecamera.premium.monthly - 연간:
com.effy.caloriecamera.premium.yearly
- 월간:
- RevenueCat 대시보드 접근 권한
위 조건을 충족했다면 바로 실전에 들어갑니다.
1. App Store Server Notifications URL 추가 (필수)
RevenueCat이 구독 상태를 정확히 추적하려면 Apple이 보내는 서버 알림을 받아야 합니다. App Store Connect에서 다음과 같이 설정합니다.
- App Store Connect 접속 →
My Apps→ 앱 선택 - 왼쪽 메뉴
App Information클릭 - 페이지 하단
App Store Server Notifications섹션으로 이동 Version 2 Notifications에서 아래 URL을 각각 입력
https://api.revenuecat.com/v1/incoming-webhooks/apple-server-to-server-notification/PJwjaHKjuZNMEvfbpGvTgzQqmbaghwka
- Production Server URL: 위 URL
- Sandbox Server URL: 위 URL (동일 값 사용)
저장하면 Apple이 구독 취소, 환불, 갱신 같은 이벤트를 RevenueCat에 전달해줍니다. 실수로 빈칸이 남아 있으면 RevenueCat이 상태를 잘못 파악할 수 있으니 꼭 확인하세요.
2. RevenueCat에서 Products 등록
이제 RevenueCat이 어떤 SKU를 판매하는지 알아야 합니다.
- RevenueCat 대시보드 왼쪽 메뉴
Product catalog→Products + New클릭 후 상품 정보를 입력
월간 구독
- Product Identifier:
com.effy.caloriecamera.premium.monthly - Store:
Apple App Store - Type:
Subscription - Duration:
1 month - Display name:
Premium Monthly
연간 구독 (선택 사항이지만 추천)
- Product Identifier:
com.effy.caloriecamera.premium.yearly - Store:
Apple App Store - Type:
Subscription - Duration:
1 year - Display name:
Premium Yearly
팁:
Product Identifier는 App Store Connect에서 만든Product ID와 100% 동일해야 합니다. 대소문자나 점 하나라도 다르면 결제가 실패합니다.
3. Entitlement로 “무엇을 풀어줄지” 정의
Entitlement는 “구독자가 해제할 수 있는 권한 묶음”입니다. 프리미엄 기능이 여러 개라도 보통 하나의 Entitlement로 묶어 관리합니다.
- RevenueCat에서
Customer lists→Entitlements + New클릭- Identifier:
premium - Display name:
Premium Features
- Identifier:
- 방금 생성한
premiumEntitlement 클릭 →Attach Products - 아래 두 상품을 모두 체크 →
Savecom.effy.caloriecamera.premium.monthlycom.effy.caloriecamera.premium.yearly
이제 월간/연간 구독 둘 다 premium Entitlement를 해제하게 됩니다.
4. Offering 하나에 월간+연간 패키지 묶기
Offering은 실제 Paywall에서 보여줄 “플랜 묶음”입니다. 혼란을 막기 위해 월간/연간을 하나의 Offering 안에 넣는 것이 표준입니다.
Product catalog→Offerings- 기본으로 생성된
Monthly SubscriptionOffering 선택 + Add Package클릭 후 아래와 같이 추가
첫 번째 패키지 (월간)
- Package Identifier:
$rc_monthly(RevenueCat이 기본 제공하는 내장 ID) - iOS Product:
com.effy.caloriecamera.premium.monthly
두 번째 패키지 (연간)
- Package Identifier:
$rc_annual - iOS Product:
com.effy.caloriecamera.premium.yearly
왜 하나의 Offering에 묶어야 할까?
- 사용자가 Paywall에서 월간/연간을 한 화면에서 비교할 수 있습니다.
- SDK에서
offerings.current.monthly,offerings.current.annual처럼 간단하게 접근할 수 있습니다. - A/B 테스트를 할 때만 여러 Offering을 쓰고, 일반적인 경우는 하나의 Offering으로 관리합니다.
만약 용어가 헷갈린다면 아래 그림처럼 이해하면 됩니다.
Offering (Paywall)
├── Package: $rc_monthly → 월간 구독 SKU
└── Package: $rc_annual → 연간 구독 SKU
5. 최종 체크리스트
RevenueCat → App Store Connect 구독 세팅이 끝났다면 아래 항목을 다시 확인하세요.
- RevenueCat 프로젝트에 iOS 앱이 연결되어 있다.
- App Store Server Notification URL이 Production/Sandbox 모두 입력되어 있다.
- Products에 월간/연간 SKU가 등록돼 있다.
- Entitlement
premium이 존재하며 두 상품 모두 연결됐다. -
Monthly SubscriptionOffering 안에$rc_monthly,$rc_annual패키지가 있다. - RevenueCat Public API Key를 확보했다. (예:
appl_JKDJnIqZSJyjNYxhGHVWcGerlja)
모두 체크했다면 이제 앱 코드에서 SDK만 붙이면 됩니다.
6. SDK 연동을 위한 다음 단계
마지막으로 앱 코드에서 할 일까지 간단히 정리하면 다음과 같습니다.
- 패키지 설치
npx expo install react-native-purchases - 환경 변수 설정 (
.env)EXPO_PUBLIC_REVENUECAT_API_KEY=appl_JKDJnIqZSJyjNYxhGHVWcGerlja - 초기화 코드 (
lib/revenue-cat.ts) 작성import Purchases from 'react-native-purchases'; const API_KEY = process.env.EXPO_PUBLIC_REVENUECAT_API_KEY || ''; if (!API_KEY) { throw new Error('REVENUECAT_API_KEY is not set'); } export function initRevenueCat() { Purchases.configure({ apiKey: API_KEY }); } - 앱 진입점(
app/_layout.tsx)에서initRevenueCat()호출 - Paywall에서
Purchases.getOfferings()를 통해$rc_monthly,$rc_annual패키지를 불러와 결제 버튼에 연결 - 복원 버튼은
Purchases.restorePurchases()로 구현
이후에는 무료 사용자 제한 로직, Paywall UI, Sandbox 테스트 등을 차례로 진행하면 됩니다.
마무리
RevenueCat은 처음 접하면 메뉴가 많아 보이지만, App Store 알림 → Product → Entitlement → Offering 순서만 지키면 어렵지 않습니다. 월간과 연간 구독을 하나의 Offering에 묶어두면 사용자 경험과 코드 유지보수 모두에서 이점이 큽니다.
이제 서버 알림과 상품 구성이 끝났으니, SDK 연동과 Paywall 디자인으로 넘어가 보세요. 구독 결제는 출시 후 수정이 까다롭기 때문에 지금 정리한 체크리스트를 기준으로 꼼꼼히 검증하는 습관을 추천합니다.
궁금한 점이 있으면 RevenueCat 문서와 함께 이 튜토리얼을 다시 참고하세요. 하나씩 따라 하면, 혼자서도 충분히 매출이 나는 구독 비즈니스를 구축할 수 있습니다. 🚀