Optimize paywall fetching in Kotlin Multiplatform SDK
A reliable paywall fetch on Kotlin Multiplatform 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 Kotlin Multiplatform SDK.
Rules and pitfalls
| Do this | Don’t do this | Why |
|---|---|---|
| Fetch the placement you’re about to show. | Prefetch all placements concurrently on launch. | Bulk prefetch blocks the main 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 setOnProfileUpdatedListener fires. | Call getPaywall at app launch. | Attribution hasn’t landed yet. The paywall resolves against the default audience and silently bypasses segments and ASA personalization. |
Set a loadTimeout 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 loadTimeout 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 = AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoadon every fetch except the very first. - Configure a fallback paywall for every placement in the Adapty dashboard.
- Set
loadTimeoutto 3–5 seconds and accept the fallback when the timeout fires. - Don’t gate paywall display on
Adapty.getProfile(). CallgetPaywallindependently so a slow profile doesn’t block the UI.