Implementing Soft Paywall (Skippable) in Mobile Application
Soft paywall—balance between monetization and activation. User sees offer to buy but can continue free. Task: show paywall when user already got enough value for conversion to be meaningful, not random.
When to Show
Typical mistake—show on first app open. User hasn't understood product value yet, closes → "saw paywall" metric rises, conversion doesn't. Correct triggers:
- After reaching "aha moment" (user created first project, generated first result, completed first lesson).
- On attempt to use premium feature.
- After N sessions (3–5 opens)—user returned, felt value.
- By time: on day 3 of free trial.
All triggers managed via PaywallTriggerManager—logic on server or Firebase Remote Config. When to show, how often, after how many sessions—parameters A/B tested.
Skip Button
Skip / "Continue free" button—shouldn't be hidden. Apple rejects apps where Skip is deliberately inconvenient, tiny font, or delayed. Rule: if free version functionally works—user must see exit without obstacles.
Technically: Skip tap logged to analytics (Analytics.logEvent("paywall_skipped", parameters: ["trigger": triggerName, "variant": variantId])). Data for A/B test—different variants have different skip and conversion rates. Both matter: paywall with 0% skip, 1% conversion worse than 40% skip, 5% conversion.
Show Frequency
Showing soft paywall every time user tries premium feature—aggressive and annoying. Standard: show if lastPaywallShownAt was >N days ago OR user tapped premium feature (intent-triggered). lastPaywallShownAt in UserDefaults / SharedPreferences, update on every show.
Server config via Remote Config: soft_paywall_cooldown_days: 3, max_impressions_per_week: 2—change without release during A/B test.
Overlay vs Full-Screen
Soft paywall can be:
-
Half-sheet / bottom sheet—
UISheetPresentationController(iOS 15+) with.mediumdetent. User sees app content underneath, reduces "trapped" anxiety. - Full-screen modal with transparent background (blur overlay) over content—for feature-triggered, showing exactly what's premium.
- Inline banner in feed at specific position—least aggressive, lower conversion, doesn't interrupt UX.
iOS UISheetPresentationController with prefersGrabberVisible = true signals dismissable sheet. Not random—people interact more when understanding they can exit.
Logic After Skip
User skipped paywall—don't show "Upgrade" button everywhere aggressively. Save intent (user_intent_score) and use for next show targeting: if user tried premium feature 3 times—show paywall sooner than standard cooldown.
PaywallTriggerManager increments premium_feature_attempt_count per attempt. At threshold—show regardless of cooldown.
Process
Define show triggers with product → develop PaywallTriggerManager + Remote Config integration → UI paywall + skip logic → event analytics → A/B test setup → QA → publication.
Timeline Estimates
Soft paywall with configurable triggers, event analytics, Remote Config management: 2–3 working days with ready IAP integration and server API.







