react-native-purchases as you normally would, register a one-line adapter, then present a paywall session exactly like any other flow. This page assumes you already have the FlowPilot Expo SDK installed and configured.
Before you startPaywalls build on the standard FlowPilot setup, plus RevenueCat:
- A FlowPilot workspace, an app inside it, and an SDK API key for that app.
- A RevenueCat account with your products, entitlements, and an offering configured for your app.
- Paywalls enabled for your workspace. If you do not see a Paywalls item in the dashboard sidebar, reach out and we will turn it on.
Install RevenueCat
RevenueCat is an optional peer dependency of the FlowPilot SDK. Install it in any app that shows paywalls.Wire it up
Configure RevenueCat first, then FlowPilot, then register the adapter before presenting a paywall.Configure RevenueCat (host-owned)
Configure RevenueCat yourself, with your own API key and user identity. FlowPilot never configures RevenueCat and never changes who is signed in.
Present a paywall
On the Expo SDK you present a flow declaratively: resolve a session, then render it with<FlowPilotPresenter />. A paywall works the same way, and its result carries a paywallOutcome.
The paywall outcome
result.paywallOutcome is one of purchased, restored, dismissed, skippedEntitled, skippedNoFlow, skippedAudience, skippedHoldout, or failed, and is absent for non-paywall flows. result.paywallGatingMode tells you whether a dismissed paywall was soft (continue) or hard (your app keeps the feature locked). The base outcome (completed, dismissed, error) is unchanged, so existing handling still works. See Results and outcomes.
Fail-open by default
If no paywall is configured, the audience does not match, the user is in a holdout, or the flow fails to load,resolveSession returns null and your own UI runs. A paywall problem never blocks your app. When a feature must stay locked, your app enforces that using the outcome.
Test before you ship
Real purchases require a native development build, not Expo Go. In development, the RevenueCat Test Store is the fastest end-to-end path, and an Apple sandbox account covers renewal and restore testing. Run one pass on a real device before submitting.Diagnostics
The SDK logs each purchase state transition. Raise the log level to see them, and opt out of diagnostic reporting if you prefer:Common mistakes
- Testing in Expo Go. Purchases need a native dev build. Expo Go renders the paywall but cannot buy or restore.
- Registering the provider before configuring RevenueCat. Configure
react-native-purchasesfirst; the adapter reads through it. - Using
presentPlacement. It is a no-op on Expo. Resolve a session and render the presenter. - Treating a skip as an error. Every
skipped*outcome is a normal, fail-open result.