Expo + Supabase + RevenueCat Boilerplate
Ship a subscription app to both stores. Expo ~54 for builds, Supabase for auth and data, RevenueCat for billing. The billing stack that actually works in production.
Ship a subscription app to both stores. Expo ~54 for builds, Supabase for auth and data, RevenueCat for billing. The billing stack that actually works in production.
Starter Kit
Subscription app stack: Expo + Supabase + RevenueCat. Auth, billing, store submission — pre-wired.
Expo ~54 for mobile builds. Supabase for auth and database. RevenueCat for subscriptions and in-app purchases.
This is the stack I settled on after trying three other approaches. Stripe doesn't work for iOS digital goods (Apple's rules). Manual StoreKit + Google Play Billing took 28 hours to implement. RevenueCat abstracts both into one SDK.
I tried implementing StoreKit 2 and Google Play Billing directly. Here's what happened:
28 hours of manual work → 2 hours with RevenueCat. That math is obvious.
| Component | What's Done |
|---|---|
| RevenueCat SDK | Installed, API keys configured |
| Entitlement checks | Custom hook for gating features |
| Paywall UI | Customizable template |
| Subscription products | Monthly + Annual templates |
| Restore purchases | Automatic |
| Server validation | RevenueCat webhooks → Supabase |
User signs up (Supabase Auth)
→ Supabase user ID synced to RevenueCat
→ User purchases subscription (RevenueCat)
→ Entitlement updated in RevenueCat
→ App checks entitlement via hook
→ Feature access granted/denied
The Supabase user ID is the single source of identity. RevenueCat tracks what they've paid for. The app checks RevenueCat for access. Clean separation.
Across 4 apps shipped with this stack:
One-time purchase. Full-stack boilerplate + 11 AI agents. No subscription.