Реалізація Soft Paywall (з можливістю пропуску) у мобільному застосунку
Soft paywall — це баланс між монетизацією та активацією. Користувач бачить пропозицію купити, але може продовжити безплатно. Задача: показати paywall у момент, коли користувач вже отримав достатньо цінності, щоб конверсія була осмисленою, а не випадковою.
Коли показувати
Типова помилка — показувати при першому відкритті застосунку. Користувач ще не зрозумів цінність продукту, закриває → показник «видів paywall» зростає, конверсія немає. Правильні триггери:
- Після досяганню «aha moment» (користувач створив перший проект, згенерував перший результат, пройшов перший урок).
- При спробі використати premium-фічу.
- Після N-го сеансу (3–5 відкриттів) — користувач повернувся, значить цінність почув.
- За часом: на 3-й день використання безплатного періоду.
Всі триггери керуються через PaywallTriggerManager — логіка на сервері або Firebase Remote Config. Коли показувати, як часто, через скільки сеансів — це параметри, які A/B тестуються.
Кнопка «Пропустити»
Кнопка Skip / «Продовжити безплатно» — не повинна бути схована. Apple при ревю застосунків відкидає UI, де Skip умисно розташований неудобно, маленьким шрифтом або з'являється з затримкою. Правило: якщо безплатна версія функціонально працює — користувач повинен бачити шлях назад без перешкод.
Технічно: натиснення Skip логується в аналітику (Analytics.logEvent("paywall_skipped", parameters: ["trigger": triggerName, "variant": variantId])). Це дані для A/B тесту — різні варіанти paywall мають різний skip rate та conversion rate. Обидва числа важливі: paywall з нульовим skip rate та 1% конверсією гірше, ніж paywall з 40% skip rate та 5% конверсією.
Частота показу
Показувати soft paywall кожний раз при відкритті premium-фічи — агресивно та раздражає. Стандартна схема: показуємо, якщо lastPaywallShownAt було більше N днів тому АБО якщо користувач сам натиснув на premium-фічу (intent-triggered). lastPaywallShownAt зберігається в UserDefaults / SharedPreferences, оновлюється при кожному показі.
Серверна конфігурація через Remote Config: soft_paywall_cooldown_days: 3, max_impressions_per_week: 2 — змінюється без релізу при A/B тестуванні.
Overlay vs full-screen
Soft paywall може бути:
-
Half-sheet / bottom sheet —
UISheetPresentationController(iOS 15+) з.mediumdetent. Користувач бачить під ним контент застосунку, це зменшує тривогу від «замкнутий». - Full-screen modal з прозорим фоном (blur overlay) поверх контенту — для feature-triggered paywall, коли показуємо що саме доступна в premium.
- Inline banner у ленте на певній позиції — найменш агресивний варіант, конверсія нижча, але не переривает UX.
На iOS UISheetPresentationController з prefersGrabberVisible = true сигналізує користувачеві, що це dismissable sheet. Це не випадковість — люди частіше взаємодіють з UI, коли розуміють, що можуть вийти.
Логіка після Skip
Користувач пропустив paywall — не показуємо йому кнопку «Upgrade» везде агресивно. Зберігаємо запис про намір (user_intent_score) та використовуємо для точніше таргетингу наступного показу: якщо користувач 3 рази спробував використати premium-фічу — наступний paywall показуємо раніше стандартного cooldown.
PaywallTriggerManager інкрементує premium_feature_attempt_count при кожній спробі. При досяганні порогу — показує paywall незалежно від cooldown.
Процес роботи
Визначення триггерів показу разом з продуктом → розроблення PaywallTriggerManager + Remote Config інтеграція → UI paywall + skip логіка → аналітика події → A/B тест setup → QA → публікація.
Ориентири по срокам
Soft paywall з конфігурованими триггерами, аналітикою событій та Remote Config управлінням — 2–3 робочих дня при готовій IAP інтеграції та SerверAPI.







