Payments
Payments for an Expo app, compared: RevenueCat, Adapty, Stripe Checkout, or none - Expo Go support and what each option installs.
Hey - here's how payments work in ReadyNative.
This category owns selling: the /paywall modal, the entitlement check you gate features on, and the Restore action the stores require you to offer.
@/lib/payments always exists, whichever option you pick: payments.useEntitlements(), payments.presentPaywall?.() and payments.restorePurchases() read the same in every one of them, and payments/none is a no-op that reports no entitlements. Screens you write against the shim keep working when you switch options.
Pick RevenueCat for the default path to store subscriptions - it handles StoreKit and Play Billing, and its remote paywalls can be edited without shipping an update. Pick Adapty if the no-code Paywall Builder and A/B tests on placements are what you want to iterate on; it's the same store billing underneath. Pick Stripe if you're selling to the web too, or if what you sell isn't digital goods that Apple and Google require in-app purchase for - it runs on hosted Checkout in the system browser, needs backend/api-routes, and is the one option that works in Expo Go.
This category is part of ReadyNative Pro.
Options
One option per category - --payments <option> picks it:
bun run setup --payments revenuecat| Option | Label | Expo Go | Hint |
|---|---|---|---|
revenuecat | RevenueCat (default) | no - dev build required | in-app subscriptions + paywall · dev build required (no Expo Go) |
adapty | Adapty | no - dev build required | in-app subscriptions + Paywall Builder · dev build required (no Expo Go) |
stripe | Stripe Checkout | yes | web checkout via API routes (no native SDK) · Expo Go OK |
none | No payments | yes | payments.useEntitlements() shim returns none |