GenerateSaaS
Billing

Billing

In-app purchases through RevenueCat - setup, product mapping, and what the app shows.

Store purchases are additive to your web provider: the same account, billed by Apple or Google instead. They ship only with --mobile-purchases revenuecat.

Setup

Create a RevenueCat project, one app per store.
Create the store products, then map them to RevenueCat offerings.
Set the two EXPO_PUBLIC_REVENUECAT_* keys in apps/mobile/.env, then the server variables and the webhook - see Mobile store billing.

Product mapping

Each paid price in packages/config/src/pricing.ts carries the store ids and the prices a store sale books, all generated blank.

FieldWhat you pasteWhere you read it
appleProductIdThe product identifier, exactly as App Store Connect shows itApp Store Connect → Subscriptions
googleProductId<subscription_id>:<base_plan_id>, the composite RevenueCat sends - not the subscription id alonePlay Console → Subscriptions → Base plans
storeAmountsWhat the stores charge, per currency - a sale books this, not amountsYour catalogue

A blank store id hides that plan from the paywall: fill both before you submit, each with a storeAmounts entry in your base currency, since the boot check refuses an id that would book zero revenue.

What the app shows, and from where

On screenComes fromNever from
A store pricepriceString, the store's own localized stringstoreAmounts or amounts
The plan, its expiry, any trial, the creditsGET /billing/statusthe SDK's entitlements
The history, in the reader's localeGET /billing/historythe store

GET /billing/status answers for the active organization's owner, GET /billing/history for the signed-in user. History, credit packs, upgrade, restore and the external link show only where the viewer funds their own plan.

On this page