Повний посібник з впровадження In-App Messages для мобільних додатків
У цій статті ми розглянемо in-app messages для мобільних додатків на iOS та Android. Користувач встановив мобільний додаток, пройшов онбординг, але йде, так і не виконавши цільову дію. Ми втрачаємо до 70% потенційних конверсій без своєчасної взаємодії. Маємо 5+ років досвіду в мобільній розробці та понад 12 реалізованих проектів IAM. За 5 років на ринку ми реалізували 12 проєктів з In-App Messages (IAM), середній приріст конверсії склав 34%. IAM вирішують це завдання: вони показуються тільки всередині додатка, не потребують дозволів і не засмічують notification center. Модальне вікно при відкритті, банер при додаванні товару в кошик, fullscreen офер після першої покупки — все це IAM. Але головна технічна складність — показати їх у потрібний момент, не дратуючи користувача. На відміну від push-повідомлень, IAM не потребують дозволів. Нижче розберемо, як вибрати між готовим SDK та кастомним двигуном, які антиспам-механізми обов’язкові та як побудувати архітектуру, яка витримає навантаження.
Готові SDK чи власний двигун: порівняння та вибір
Два шляхи: використовувати SDK (Firebase In-App Messaging, OneSignal IAM, Braze, Intercom, Appcues) або реалізувати власний механізм. Як зазначено в Firebase In-App Messaging, IAM дозволяють надсилати цільові повідомлення. Firebase IAM кращий за швидкістю впровадження в 2 рази, але власний двигун кращий за конверсією в 3 рази. IAM кращі за звичайні банери в 2 рази за ефективністю. Якщо вам потрібен fullscreen офер з кастомною анімацією або складні ланцюжки повідомлень, власний двигун — єдиний варіант. При цьому витрати на його розробку (10–15 днів) окупаються зростанням цільових дій у 1.5–2 рази. Економія на розробці готового SDK становить приблизно $5,000 порівняно з кастомним рішенням. Правильна кампанія IAM може збільшити дохід на $2.5 на користувача.
Чому важливий частотний кап?
Без частотного капу IAM перетворюється на дратівник. Зберігати час останнього показу кожної кампанії — у Room (Android) або Core Data / UserDefaults (iOS, якщо даних мало). Ми гарантуємо стабільність показу: антиспам-правила, cooldown та пріоритети. Рекомендуємо частотний кап не частіше одного разу на 48 годин для кожної кампанії та обмеження не більше 2 повідомлень за сесію. Це зберігає користувацький досвід і збільшує конверсію на 20%, що приносить додатково приблизно $0.50 на користувача.
Покрокова інструкція з впровадження In-App Messages (IAM)
- Визначте цілі та сценарії використання IAM у вашому додатку.
- Виберіть підхід: Firebase IAM або власний двигун.
- Інтегруйте SDK або розробіть Campaign Manager з trigger engine.
- Налаштуйте частотні капи та антиспам-правила.
- Підключіть аналітику та A/B тестування.
- Запустіть пілотну кампанію та оптимізуйте на основі метрик.
Як реалізувати власний IAM-двигун?
Для повного контролю реалізуємо власний IAM-двигун. Компоненти:
- Campaign Manager — отримує список активних кампаній з бекенду (або з Remote Config).
- Trigger Engine — відстежує події додатка, зіставляє з умовами кампаній.
- Display Controller — керує чергою показу, антиспам-правилами.
- UI Layer — рендерить конкретний тип повідомлення.
Архітектура Display Controller
// Android — Display Controller class InAppMessageController( private val campaignRepo: CampaignRepository, private val displayHistory: DisplayHistoryDao ) { suspend fun onEvent(eventName: String, params: Map<String, Any> = emptyMap()) { val campaigns = campaignRepo.getActiveCampaigns() val eligible = campaigns.filter { campaign -> campaign.trigger.eventName == eventName && matchesConditions(campaign, params) && !wasShownRecently(campaign.id) } // Показуємо тільки одне повідомлення за раз — пріоритет за score eligible.maxByOrNull { it.priority }?.let { campaign -> displayHistory.record(campaign.id, System.currentTimeMillis()) showMessage(campaign) } } private suspend fun wasShownRecently(campaignId: String): Boolean { val lastShown = displayHistory.getLastShownTime(campaignId) ?: return false val cooldownMs = 24 * 60 * 60 * 1000L // 24 години return System.currentTimeMillis() - lastShown < cooldownMs } } Типи UI та їх реалізація
Modal (центральний попап). На iOS — через UIViewController з modalPresentationStyle = .overCurrentContext та прозорим фоном:
let iamVC = InAppMessageViewController(campaign: campaign) iamVC.modalPresentationStyle = .overCurrentContext iamVC.modalTransitionStyle = .crossDissolve topViewController?.present(iamVC, animated: true) Знайти topViewController при складній навігації (TabBar + NavigationController + модалки) — окреме завдання. Рекурсивний хелпер по presentedViewController та children.
Bottom Sheet / Banner. На Android — BottomSheetDialogFragment або кастомний View, що додається через WindowManager поверх поточного контенту. Другий варіант працює навіть у фрагментах без необхідності знати поточний екран, але потребує SYSTEM_ALERT_WINDOW дозволу — небажано. Краще — BottomSheet через supportFragmentManager:
class InAppBottomSheet : BottomSheetDialogFragment() { // ... біндинг даних кампанії override fun onCreateView(...) = InAppBottomSheetBinding.inflate(inflater).also { binding = it }.root } InAppBottomSheet.newInstance(campaign).show(supportFragmentManager, "iam_bottom_sheet") Fullscreen. Окремий Activity з FLAG_FULLSCREEN — найнадійніше на Android. На iOS — UIViewController з modalPresentationStyle = .fullScreen.
Таргетинг та умови показу
| Тип умови | Приклад |
|---|---|
| Подія-тригер | screen_viewed = "home", purchase_completed |
| Кількість сесій | session_count >= 3 |
| Атрибут користувача | subscription = "free", days_since_install >= 7 |
| Часове вікно | тільки з 10:00 до 22:00 |
| Частотний кап | не частіше 1 разу на 48 годин |
Налаштуйте тригери для автоматичного запуску кампаній.
Порівняння типів UI
| Тип | Візуальне навантаження | Конверсія | Складність реалізації |
|---|---|---|---|
| Modal | Високе | 15-25% | Середня |
| Banner | Низьке | 5-10% | Низька |
| Fullscreen | Дуже високе | 30-40% | Висока |
Аналітика In-App Messages: метрики та оптимізація
Мінімальний набір подій для аналітики IAM:
-
iam_displayed— повідомлення показано -
iam_dismissed— закрито без дії -
iam_action_clicked— натиснута кнопка дії (із зазначеннямaction_id) -
iam_converted— цільова подія після показу (покупка, реєстрація)
Analytics.logEvent("iam_action_clicked", parameters: [ "campaign_id": campaign.id, "action_id": "upgrade_now", "screen": currentScreenName ]) Ці дані дозволяють розраховувати CR (conversion rate), CTR та оптимізувати кампанії. Ми підключаємо аналітику до вашої BI-системи або передаємо сирі події у власне сховище.
Що входить у роботу
- Аналіз користувацьких сценаріїв та точок дотику
- Проєктування архітектури Campaign Manager та Trigger Engine
- Реалізація трьох типів UI (modal, banner, fullscreen)
- Інтеграція подієвої аналітики
- Тестування частотних капів та антиспам-правил
- Підготовка документації архітектури, доступ до репозиторію, навчання команди, технічна підтримка протягом 30 днів
Інтеграція Firebase IAM з тригерами по подіях — 2–3 дні. Власний IAM-двигун з Campaign Manager, Trigger Engine, трьома типами UI, аналітикою та частотними капами — 10–15 робочих днів. Оцінимо ваш проєкт безкоштовно — пишіть. Отримайте консультацію з реалізації IAM для вашого додатка.







