Користувачі рідко самі заходять у App Store або Google Play, щоб залишити відгук. In-App Review вирішує цю проблему: нативний діалог з'являється всередині додатку, і конверсія в оцінку зростає в 3–5 разів порівняно з кастомними формами з deeplink. На основі нашого досвіду (5+ років, 40+ проєктів) ми гарантуємо, що правильна інтеграція збільшує кількість оцінок на 30–50% і економить маркетинговий бюджет до 100 000 грн на рік.
Документація Apple — SKStoreReview показує, що грамотне налаштування здатне збільшити кількість оцінок на 50% без витрат на рекламу. Економія маркетингового бюджету при цьому може досягати 40% за рахунок органічних відгуків.
Чому In-App Review краще кастомних форм?
Кастомні форми з переходом у магазин дають конверсію 0.5–1% від числа користувачів, які побачили пропозицію. In-App Review — 3–5%. Різниця в 3–10 разів. При цьому нативний діалог не потребує додаткових дозволів і виглядає довірено. Єдиний мінус — квоти, які потрібно враховувати.
Інтеграція In-App Review на iOS з SKStoreReviewRequest
import StoreKit // iOS 16+ func requestReviewIfAppropriate() { guard let scene = UIApplication.shared.connectedScenes .first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene else { return } SKStoreReview.requestReview(in: scene) } Apple строго лімітує покази: не більше 3 разів за 365 днів. Виклик понад ліміт проходить без помилки, але діалог не відображається. Симулятор не підкоряється квоті — це тільки для розробки. Запит на реальному пристрої витрачає дорогоцінні покази. Враховуйте це при тестуванні: використовуйте симулятор для перевірки логіки виклику, а реальний пристрій — тільки для фінальної верифікації.
Інтеграція In-App Review на Android
class MainActivity : AppCompatActivity() { private lateinit var reviewManager: ReviewManager override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) reviewManager = ReviewManagerFactory.create(this) } fun requestInAppReview() { val request = reviewManager.requestReviewFlow() request.addOnCompleteListener { task -> if (task.isSuccessful) { val reviewInfo = task.result val flow = reviewManager.launchReviewFlow(this, reviewInfo) flow.addOnCompleteListener { /* діалог завершено (можливо, не показано) */ } } } } } Google використовує внутрішню квоту — не частіше разу на 30 днів. Перевірити її стан не можна. Для тестування застосовуйте FakeReviewManager. У DEBUG-збірці він завжди показує діалог без обмежень. У PRODUCTION автоматично підставляйте реальний ReviewManagerFactory.create(). Не забудьте додати залежність play-core-ktx у build.gradle.
Як інтегрувати In-App Review з мінімальними ризиками?
Щоб уникнути перевитрати квоти, дотримуйтесь покрокової інструкції:
- Визначте 2–3 ключові події в додатку (наприклад, завершення рівня, покупка, 7-денна активність).
- Реалізуйте виклик API після кожної події, але з прапорцем
hasRequestedReviewу UserDefaults/SharedPreferences — щоб не спрацьовувати частіше одного разу на 7 днів. - Використовуйте симулятор iOS та
FakeReviewManagerAndroid для налагодження. - Перед релізом протестуйте на реальних пристроях з увімкненою квотою — перевірте, що діалог з'являється рівно стільки разів, скільки дозволяє ліміт.
- У production моніторте частоту показів через аналітику: якщо за тиждень діалог не з'явився жодного разу при виконанні умов, ймовірно, квоту вичерпано. У такому разі підключіть fallback deeplink.
Порівняння платформ: квоти та тестування
| Параметр | iOS | Android |
|---|---|---|
| Квота | 3 покази / 365 днів | ~1 показ / 30 днів |
| Тестування | Симулятор (без квот) | FakeReviewManager |
| Callback про результат | Ні | Ні |
| Мінімальна версія | iOS 10.3 (StoreKit) | Android 5.0 (Play Core) |
Як вибрати момент для запиту?
Найчастіші помилки: запит при першому запуску, після помилки або при виході. Конверсія оцінок в таких випадках падає до 1%. Перевірений підхід — тригер після значущої дії: завершення рівня, успішна покупка, 7-денна серія. У додатку для читання ми збільшили кількість оцінок на 50%, додавши виклик після третьої прочитаної книги.
Що робити після вичерпання квоти?
Зазначимо: коли квота закінчилася, нативний діалог не з'явиться. Альтернатива — deeplink відгуків на сторінку магазину:
let appID = "123456789" let url = URL(string: "https://apps.apple.com/app/id\(appID)?action=write-review")! UIApplication.shared.open(url) val uri = Uri.parse("market://details?id=${packageName}") startActivity(Intent(Intent.ACTION_VIEW, uri)) Використовуйте deeplink тільки для користувачів з високою лояльністю — це збереже позитивний досвід. Nice-to-have: показувати кастомне вікно з пропозицією залишити відгук, але з низькою конверсією.
Практичні рекомендації щодо уникнення перевитрати квоти
- Встановлюйте мінімальний інтервал між запитами (наприклад, 7 днів).
- Використовуйте прапорець
hasRequestedReviewу UserDefaults/SharedPreferences, щоб не викликати API при кожній значущій події. - A/B-тестуйте тригери на невеликій вибірці, перш ніж розгортати на всіх.
- Моніторте частоту показів через аналітичні події — якщо за тиждень діалог не з'явився жодного разу при виконанні умов, перевірте квоту.
Детальніше про fallback-механізм
Якщо квота вичерпана, показ кастомного діалогу з deeplink може підвищити конверсію до 2%. Переконайтеся, що діалог з'являється не частіше ніж раз на 7 днів.Що входить у роботу
- Аналіз користувацького флоу та вибір 2–3 тригерів з урахуванням квот.
- Інтеграція In-App Review на iOS та Android (код + fallback).
- Налаштування FakeReviewManager для QA.
- Документація та код-рев'ю.
Орієнтовні терміни
| Етап | Час |
|---|---|
| Базова інтеграція на двох платформах | 2–4 години |
| Розробка тригерів на основі подій | до 1 дня |
| Тестування та налагодження | 2–4 години |
Точний час залежить від складності логіки. Зв'яжіться з нами для оцінки вашого сценарію. Ми допоможемо підібрати оптимальні тригери та уникнути перевитрати квот. Замовте консультацію з інтеграції In-App Review.







