Bundle Mobile: Expo + Supabase + RevenueCat 2026
Stack lengkap untuk launch mobile app cross-platform Indonesia: Expo + Supabase + RevenueCat. Saya pakai untuk 2 klien Jakarta sejak Q4 2025. Total cost dan recipe.
TL;DR
- Stack: Expo SDK 53 + Supabase + RevenueCat + React Native 0.78. Bundle hemat untuk launch mobile cross-platform.
- Cost: Rp 2-3 juta total untuk launch year-1 (MVP 1K user).
- Verdict: Recommended untuk SaaS mobile Indonesia dengan IAP subscription.
Konteks
Saya pakai bundle ini di 2 project klien Jakarta sejak Q4 2025:
- Booking app klinik dental (Q4 2025): native iOS + Android, booking + payment IAP. 800 user aktif, Rp 380rb/bulan infra cost, ARR Rp 24 juta.
- Content subscription untuk fotografer (Q1 2026): premium photo gallery, IAP weekly/monthly. 1200 user, Rp 280rb/bulan infra cost, ARR Rp 36 juta.
Plus 1 personal project (habit tracker untuk dev) untuk dogfood.
Total 8 bulan production. Zero downtime > 30 menit. App Store + Play Store approval 1-3 day per submission.
Pricing (Juni 2026)
Expo
- Free: SDK + EAS Build 30/bulan + EAS Update unlimited.
- Production: $19/bulan = Rp 304rb. Unlimited build, priority queue.
- Enterprise: $99+/bulan.
Supabase
- Free: 500MB DB, 50K MAU.
- Pro: $25/bulan = Rp 400rb.
RevenueCat
- Free: hingga $2.5K MTR (monthly tracked revenue). Saya pakai free tier untuk 2 klien.
- Pro: 1% revenue commission setelah $2.5K MTR.
One-time
- Apple Developer Program: $99/year = Rp 1.5 juta
- Google Play Console: $25 one-time = Rp 400rb
Total cost
- Launch (MVP 1K user): Rp 0-500rb/bulan + Rp 2 juta one-time
- Scale (10K user, MTR $5K): Rp 1.5-3 juta/bulan
Architecture
Mobile app (iOS + Android, single codebase Expo)
↓
Supabase Postgres (data + auth + storage)
↓ (subscription)
RevenueCat (handle Apple/Google IAP)
↓ (webhook)
Supabase Edge Function (entitlement sync)
Cross-platform: 95% kode shared. Native code (iOS/Android specific): hanya untuk plugin custom rare.
Setup recipe (4-6 minggu total)
Week 1: Init + Auth
bunx create-expo-app@latest my-mobile --template tabs
cd my-mobile
bunx expo install expo-router @supabase/supabase-js
Setup Supabase project. Konfigurasi auth dengan email + OAuth (Google/Apple).
// lib/supabase.ts
import { createClient } from '@supabase/supabase-js';
import AsyncStorage from '@react-native-async-storage/async-storage';
export const supabase = createClient(
process.env.EXPO_PUBLIC_SUPABASE_URL!,
process.env.EXPO_PUBLIC_SUPABASE_ANON_KEY!,
{
auth: {
storage: AsyncStorage,
autoRefreshToken: true,
persistSession: true,
detectSessionInUrl: false,
},
}
);
Week 2: Core feature
Build screen utama: home, profile, settings. Pakai Expo Router file-based routing.
Schema DB minimal:
create table profiles (
id uuid primary key references auth.users on delete cascade,
full_name text,
avatar_url text,
subscription_tier text default 'free',
created_at timestamp default now()
);
create table content (
id uuid primary key default gen_random_uuid(),
user_id uuid references profiles(id),
title text,
body text,
premium boolean default false,
created_at timestamp default now()
);
Week 3: RevenueCat IAP
Setup RevenueCat dashboard. Buat product di App Store Connect + Google Play Console.
import Purchases from 'react-native-purchases';
// Initialize
Purchases.configure({ apiKey: process.env.EXPO_PUBLIC_REVENUECAT_KEY! });
// Identify user
await Purchases.logIn(user.id);
// Get offerings
const offerings = await Purchases.getOfferings();
const monthly = offerings.current?.monthly;
// Purchase
const { customerInfo } = await Purchases.purchasePackage(monthly!);
// Check entitlement
if (customerInfo.entitlements.active['premium']) {
// Grant access
}
Webhook RevenueCat → Supabase Edge Function untuk sync entitlement:
// supabase/functions/revenuecat-webhook/index.ts
Deno.serve(async (req) => {
const event = await req.json();
if (event.type === 'INITIAL_PURCHASE' || event.type === 'RENEWAL') {
await supabase.from('profiles')
.update({ subscription_tier: 'premium' })
.eq('id', event.app_user_id);
}
return new Response('OK');
});
Week 4: Polish + EAS Build
- Splash screen, app icon (pakai Expo Splash + Icon)
- Push notification (expo-notifications + Supabase Realtime)
- Deep linking (Expo Linking)
- Offline mode (TanStack Query persist)
Build untuk testing:
eas build --profile preview --platform all
Week 5: TestFlight + Internal Testing
- iOS: upload via EAS Submit ke TestFlight
- Android: upload ke Internal Testing Play Store
Invite 5-10 tester. Iterate berdasarkan feedback.
Week 6: Production submission
eas build --profile production --platform all
eas submit --platform all
Apple review: 1-3 day. Google review: 6-24 jam.
Total 4-6 minggu untuk solo dev senior. Junior dev butuh 8-12 minggu.
Performance untuk Indonesia
Latency measure dari Jakarta (4G connection, Telkomsel):
| Endpoint | Median |
|---|---|
| Supabase query (Singapore region) | 35-55ms |
| RevenueCat API | 180-280ms |
| Expo Update CDN | 80-120ms |
| Apple/Google IAP | 800-1500ms |
Total app cold start: 1.2-2s. App responsiveness: native-feel (60fps animation, < 16ms frame time) dengan New Architecture.
Trade-off
Pro
- Single codebase iOS + Android — save 50-70% dev cost
- Expo SDK matang — banyak module ready (camera, geolocation, push, file system)
- EAS Build cloud — no local Xcode/Android Studio setup
- RevenueCat handle complexity IAP — save 1-2 minggu dev work
- OTA update via EAS Update — bisa push fix tanpa app store review
- TypeScript native — productivity tinggi
Con
- Bundle size mobile lebih besar dari native (15-25MB vs 5-10MB)
- Cold start sedikit lebih lambat dari native (1.2-2s vs 0.5-1s)
- Beberapa native API butuh custom Expo module (effort sedang)
- Vendor lock-in Expo ecosystem (mitigation: bisa “eject” ke bare React Native)
- Apple Developer + Google Play one-time cost Rp 2 juta upfront
Gotcha (lesson learned)
1. IAP testing di simulator: tidak work
Apple StoreKit testing butuh real device + Sandbox account. Google Play Billing butuh signed APK + tester whitelist. Plan 1-2 hari extra untuk setup proper IAP testing.
2. Supabase Realtime di mobile
Connection sometimes drop di background. Pakai TanStack Query refetch on app foreground sebagai backup.
3. RevenueCat webhook delay
Webhook bisa delay 1-5 menit dari purchase. Untuk UX best: optimistic UI + verify via RevenueCat SDK locally first.
4. EAS Build free tier
Free tier 30 build/bulan. Heavy iteration day saya hit limit. Solusi: pakai EAS Build local untuk dev iteration, cloud build untuk production submission.
5. App Store reject reason umum
- IAP product tidak match in-app pricing
- Privacy policy missing (Sign in with Apple wajib)
- Crash di iPad (test di iPad simulator wajib)
Konteks Indonesia
Klien klinik dental Jakarta: launch Oktober 2025, 800 user, IAP Rp 49rb/bulan. Infra cost Rp 380rb/bulan. Revenue Rp 24 juta/bulan. Margin healthy.
Klien fotografer content: launch Januari 2026, 1200 user, IAP Rp 35rb/mingguan. Infra cost Rp 280rb/bulan. Revenue Rp 36 juta/bulan.
Common klien Indonesia question: “Bisa pakai Midtrans GoPay/OVO instead of Apple/Google IAP?” Jawaban: tidak — Apple/Google policy mandate IAP untuk digital subscription. Kecuali Anda app fisik (gojek-like) atau Reader app (Spotify-like) — special rule berlaku.
Verdict
Recommended untuk SaaS mobile Indonesia 2026 dengan IAP.
Pakai bundle ini jika:
- Launch mobile app cross-platform iOS + Android
- Subscription model (weekly/monthly/yearly IAP)
- Tim 1-3 dev, budget Rp 2-5 juta launch year-1
- Comfort dengan React + TypeScript
Skip jika:
- App butuh native-only feature heavy (AR/VR real-time, ML on-device complex)
- Tidak butuh IAP (skip RevenueCat, pakai Stripe untuk web payment + companion app)
- Sudah ada team native iOS + Android established
Variasi: untuk app tanpa subscription (one-time purchase atau free), skip RevenueCat. Pakai expo-in-app-purchases atau react-native-iap langsung. Save 1% MTR.
Untuk web companion: Bundle AI SaaS Claude + Supabase + Vercel — Supabase shared, web + mobile single backend.
Ditulis oleh Asti Larasati