Реализация Soft Paywall (с возможностью пропуска) в мобильном приложении
Soft paywall — это баланс между монетизацией и активацией. Пользователь видит предложение купить, но может продолжить бесплатно. Задача: показать paywall в момент, когда пользователь уже получил достаточно ценности, чтобы конверсия была осмысленной, а не случайной.
Когда показывать
Типичная ошибка — показывать soft 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. Пользователь видит под ним контент приложения, это снижает anxiety от «заперт». - 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.







