Optimize paywall fetching in React Native SDK

A reliable paywall fetch on React Native does three things: renders fast, returns the audience-targeted paywall, and falls back gracefully when the network is slow. The rules below cover the timing, caching, and fallback patterns to get there.

The rules assume adapty.activate() and adapty.identify() have already resolved. See Call order in React Native SDK.

Rules and pitfalls

Do thisDon’t do thisWhy
Fetch the placement you’re about to show.Prefetch all placements concurrently on launch.Bulk prefetch blocks the JS thread and produces a black screen during the burst.
Fetch getPaywall after attribution has had a chance to resolve — for example, 1–2 seconds after activate or after onProfileUpdate fires.Call getPaywall at the root component mount.Attribution hasn’t landed yet. The paywall resolves against the default audience and silently bypasses segments and ASA personalization.
Set a loadTimeoutMs and configure a fallback paywall for every placement.Wait on getPaywall indefinitely.Without a timeout, users on poor connectivity see a blank screen until the network resolves — or close the app.

See Fetch paywalls and products for the fetchPolicy and loadTimeoutMs parameter reference, and Placements for picking the right placement.

Tune for poor connectivity

For markets with consistently poor connectivity (rural areas, transit, regions affected by routing):

  • Set fetchPolicy: .returnCacheDataElseLoad on every fetch except the very first.
  • Configure a fallback paywall for every placement in the Adapty dashboard.
  • Set loadTimeoutMs to 3–5 seconds and accept the fallback when the timeout fires.
  • Don’t gate paywall display on getProfile(). Call getPaywall independently so a slow profile doesn’t block the UI.