← Semua picks

Bundle Recipe Recommended

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.

7 Juni 2026 · 10 menit ·Use case: Launch mobile app Indonesia dengan IAP dalam 4-6 minggu
Expo SDK 53SupabaseRevenueCatReact Native

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:

  1. Booking app klinik dental (Q4 2025): native iOS + Android, booking + payment IAP. 800 user aktif, Rp 380rb/bulan infra cost, ARR Rp 24 juta.
  2. 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):

EndpointMedian
Supabase query (Singapore region)35-55ms
RevenueCat API180-280ms
Expo Update CDN80-120ms
Apple/Google IAP800-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

// Pick Bundle Recipe lain


← Semua picks RSS feed