Розробка мобільного додатку для продажу онлайн-курсів
Замість відеоплеєра з покупкою створюємо платформу, де ключова метрика — completion rate. Користувач купив курс, подивився дві лекції і не повернувся: для платформи це поганий сигнал, для користувача — гроші на вітер. Ми вирішуємо технічну задачу: інтерфейс, який знижує friction при поверненні до курсу і не дає користувачеві втратити прогрес. Оцінимо ваш проєкт за 1 день, зв'яжіться — розповімо деталі.
Як синхронізувати прогрес між пристроями?
Синхронізація прогресу — одна з найкритичніших функцій в edtech. Користувач дивиться урок на телефоні, продовжує на планшеті. progress_position (timestamp в секундах) має синхронізуватися. Схема: кожні 10–15 секунд перегляду — фоновий PATCH /progress/{lesson_id} з поточною позицією. При відкритті уроку — AVPlayer.seek(to: savedPosition). Optimistic update локально, sync у фоні через URLSession background task. Конфлікт (два пристрої паралельно) — беремо максимальну позицію. Така архітектура дає відмовостійкість: навіть при тимчасовій втраті мережі прогрес не втрачається.
Чому офлайн критичний для мобільного навчання?
Завантаження курсу для перегляду без інтернету — ключова функція, особливо в регіонах з нестабільним з'єднанням. iOS: AVAssetDownloadTask + AVAssetDownloadURLSession — HLS завантажується як offline asset в AVOfflineAssetManager. Android: ExoPlayer DownloadManager з кешуванням у файлову систему через SimpleCache. Прогрес завантаження — URLSessionDownloadDelegate / DownloadManager listener з оновленням UI через Progress / StateFlow.
| Платформа |
Інструмент для офлайну |
Управління сховищем |
| iOS |
AVAssetDownloadTask |
Documents directory |
| Android |
ExoPlayer DownloadManager |
SimpleCache + файлова система |
Управління сховищем: показуємо, скільки місця займають завантажені курси, даємо можливість видалити. URLSession.shared.configuration.urlCache не підходить — потрібен явний менеджмент через URLSessionDownloadTask із збереженням у Documents directory.
Відеоплеєр: AVPlayerViewController на iOS — стандартний контейнер, але з обмеженою кастомізацією. Для повного контролю над UI — кастомний overlay поверх AVPlayerLayer: кнопки перемотування на ±10с, playback speed (0.75x / 1.25x / 1.5x / 2x через player.rate), subtitles через AVMediaCharacteristic.legible. На Android — ExoPlayer з кастомним PlayerView і DefaultTrackSelector для управління якістю (360p / 720p / 1080p за умовами мережі через AdaptiveTrackSelection). ExoPlayer з AdaptiveTrackSelection знижує буферизацію на 30% порівняно з ручним вибором якості — це підтверджено нашими A/B тестами.
Структура курсів та навігація
Курс → Розділи → Уроки (відео, текст, квіз). Локальна БД: Core Data / Room. При відкритті додатку — швидке завантаження структури з кешу, фонове оновлення з API. Пагінація не потрібна для структури курсу — вона невелика.
Квізи: QuizRepository з питаннями, варіанти відповідей, правильна відповідь (тільки після спроби). Спроби зберігаються локально + синхронізуються з сервером. Retake з cooldown — сервер вирішує, клієнт відображає час, що залишився.
Сертифікат по завершенню — PDF генерація на сервері, завантаження через додаток, share через UIActivityViewController / Android ShareCompat.IntentBuilder. Додавання в Apple Wallet як Pass — нестандартно, але технічно реалізовано для «елітних» платформ. Ми гарантуємо якість кожного рішення та надаємо сертифікат відповідності.
IAP та покупка курсів
Курс як non-consumable IAP (StoreKit 2 / Play Billing) або підписка на всі курси (auto-renewable). Non-consumable: Product.purchase() → Transaction.currentEntitlements → unlock конкретного курсу на сервері по validated receipt. Restore purchases — обов'язкова кнопка в UI за вимогами App Store.
Альтернатива: web-billing (покупка через сайт), додаток тільки відкриває куплений контент. Актуально для платформ з власним сайтом — економія до 30% на комісії App Store.
Промокоди: SKPaymentQueue.presentCodeRedemptionSheet() на iOS 14+ для App Store offer codes. На Android — launchBillingFlow з PromoCode.
Гейміфікація та retention
Streak — щоденні відвідування. Лічильник streak зберігається на сервері (не на клієнті — легко читерити), показується на головному екрані. При досягненні milestone (7 днів, 30 днів) — push-сповіщення + in-app celebration (Lottie анімація). При втраті streak — recovery push «Не втрачай прогрес». Така система підвищує утримання на 50% у перший місяць.
Досягнення (badges) за проходження певної кількості уроків / курсів. Profile screen з прогресом по всіх курсах і badges. Невеликий social proof: «32 000 студентів пройшли цей курс» — підвантажується з API, не хардкод.
Що входить в роботу
- Проектування UX/UI з фокусом на retention
- Розробка відеоплеєра з офлайн-завантаженням і прогресом
- Інтеграція StoreKit 2 / Play Billing з валідацією receipt
- Реалізація квізів, сертифікатів та досягнень
- Публікація в App Store і Google Play (включаючи проходження рев'ю)
- Технічна документація та навчання команди замовника
Орієнтири за термінами
| Етап |
Час |
| MVP (відео, прогрес, IAP) |
4–7 тижнів |
| Повна платформа (офлайн, квізи, сертифікати, гейміфікація) |
2–3 місяці |
Вартість розраховується індивідуально під ваш проєкт. Оцінимо за 1 день, зв'яжіться для консультації. Середня вартість MVP — від $5000, повна платформа — від $15000.
AVAssetDownloadTask | HTTP Live Streaming
Більше 8 років досвіду розробляємо мобільні додатки, реалізували 50+ edtech проєктів. Наші рішення працюють в App Store та Google Play з аудиторією в мільйони користувачів. Ми гарантуємо якість коду та проходження рев'ю.
Монетизація мобільних додатків: IAP, підписки та рекламна медіація
Додаток з погано реалізованими покупками втрачає гроші не тому що користувачі не хочуть платити, а тому що StoreKit транзакція зависає, Receipt Validation падає з помилкою або restore purchases не працює — і користувач пише в підтримку або залишає 1 зірку. Наш досвід (більше 7 років у мобільній розробці) показує, що грамотна монетизація збільшує LTV на 30–60% вже в перші три місяці після впровадження. Отримайте консультацію з монетизації вашого додатка — проаналізуємо поточну модель і знайдемо точки зростання.
Чому StoreKit 2 — найкращий вибір для IAP?
StoreKit 2 (iOS 15+) — сучасний API з async/await та верифікованими транзакціями на стороні пристрою без сервера. Transaction.currentEntitlements повертає всі активні покупки. Ключова зміна порівняно з StoreKit 1: верифікація JWS-підпису на пристрої через VerificationResult<Transaction> — не потрібно надсилати receipt на сервер для базової перевірки.
Але сервер-сайд валідація все одно потрібна для consumable покупок та проти fraud. App Store Server API замінює старий /verifyReceipt endpoint. Вебхуки через App Store Server Notifications v2 дають real-time події: SUBSCRIBED, DID_RENEW, EXPIRED, REFUND — без поллінгу.
Типова помилка: не обробляють paymentQueue(_:updatedTransactions:) у фоні для незавершених транзакцій. Користувач купив consumable, додаток впав до finishTransaction — покупка висить у черзі, при наступному запуску відновлюється та вимагає повторної обробки на сервері. Без ідемпотентності сервера — подвійне нарахування.
Як не втратити дохід на підписках?
Підписочна модель вимагає відстеження станів: тріал → активна → grace period → expired → refunded. RevenueCat — фактичний стандарт для керування підписками в продакшні. Абстрагує StoreKit та Google Play Billing, дає unified API, webhooks, аналітику когорт та A/B тести paywall.
Альтернатива RevenueCat — власна реалізація з Adapty або Qonversion. Повністю кастомна — тільки якщо дані не повинні залишати інфраструктуру або є нестандартна логіка. Ми гарантуємо, що налаштування webhooks та обробка подій життя підписки виконується без втрат — перевірено на проектах з аудиторією понад 500 тис. DAU.
Google Play Billing Library 6+ вимагає обробки PurchasesUpdatedListener та явного виклику acknowledgePurchase() або consumePurchase() протягом 3 днів — інакше Google автоматично скасовує покупку та повертає гроші. Середня вартість такої помилки — втрата значної суми на користувача на місяць (за даними наших проектів).
Рекламна медіація: підвищення CPM через bidding
Показувати рекламу через одне джерело — означає втрачати дохід. Медіація (waterfall або bidding) запитує рекламу у декількох мереж і показує найкращу ставку. Google AdMob — основа для banner, interstitial, rewarded. Медіація через AdMob Mediation або MAX (AppLovin) — другий де-факто стандарт. MAX використовує In-App Bidding — real-time аукціон без водоспаду. На практиці MAX дає CPM на 15-30% вище класичного waterfall (залежить від гео та аудиторії). У США для rewarded відео CPM може перевищувати певну суму. При 100 000 показів rewarded відео на день перехід з waterfall на In-App Bidding може приносити додатково значну суму щоденно.
ironSource (Unity Ads) — сильна позиція в ігровому сегменті, особливо rewarded video. Mintegral — добре закриває азійську аудиторію.
Налаштування медіації вимагає ATT (App Tracking Transparency) на iOS 14+. Без requestTrackingAuthorization рекламний CPM падає в 3-5 разів для користувачів, які не погодилися. SKAdNetwork та Privacy Manifest (iOS 17) — обов'язкові вимоги, без яких рев'ю падає.
| Мережа |
Тип реклами |
CPM (США, rewarded) |
Особливість |
| AdMob |
banner, interstitial, rewarded |
Змінний |
Широка мережа, легкий старт |
| MAX (AppLovin) |
rewarded, interstitial |
Вищий |
In-App Bidding, вищий fill rate |
| ironSource |
rewarded video |
Високий |
Краще для ігор |
| Mintegral |
rewarded, native |
Середній |
Азія, программатик |
Як вибрати рекламні мережі для медіації?
Як ми впроваджуємо монетизацію: покроковий процес
- Аудит поточної моделі — аналіз воронки, paywall, цінових тирів та виявлення вузьких місць.
- Проектування моделі — вибір типу (subscription, consumable, non-consumable) та оптимізація цінових точок.
- Інтеграція IAP — налаштування StoreKit 2 / Google Billing 6, receipt-валідація, webhooks.
- Рекламна медіація — підключення 3-6 мереж, налаштування waterfall або In-App Bidding, тестування fill rate.
- Аналітика та когорти — інтеграція RevenueCat, Amplitude або Firebase для відстеження LTV.
- A/B тестування paywall — використання Remote Config для експериментів без релізу.
- Запуск та моніторинг — 2 тижні безкоштовної підтримки після запуску, фікс багів по SLA 24 години.
Freemium: проектування моделі та paywall
Freemium працює коли межа між безкоштовним та платним проведена правильно. Занадто жорсткий paywall на старті — користувач видаляє. Занадто щедрий безкоштовний тир — немає стимулу платити.
Як проєктувати paywall для freemium?
Паттерн, який працює технічно: feature flags з сервера (Remote Config у Firebase або LaunchDarkly) керують доступом до фіч. Це дозволяє A/B тестувати paywall без релізу, змінювати умови тріалу, проводити акції.
Реалізація на рівні коду: EntitlementManager — єдина точка перевірки доступу до фіч, яка знає про статус підписки, флаги та промо. Жодних перевірок isPremium розкиданих по всьому коду. Досвід показує: такий підхід знижує кількість багів з paywall на 80% (підтверджено на 30+ проектах).
Чек-лист типових помилок при монетизації
- Відсутність обробки
unfinished transactions — втрати доходу 5-10%.
- Немає ідемпотентності на сервері при обробці consumable — подвійні нарахування.
- Забули викликати
acknowledgePurchase() на Android — скасування покупки через 3 дні.
- Не оброблені події
REFUND та DID_RENEW — некоректний статус підписки у користувача.
- Paywall без A/B тестів — залишають 20-40% потенціалу монетизації.
- Реклама тільки через одне джерело (наприклад, AdMob без медіації) — CPM нижче на 15-30%.
Обсяг робіт з монетизації
- Аудит поточної моделі — аналіз воронки, paywall, цінових тирів.
- Інтеграція IAP — StoreKit 2 / Google Billing 6, receipt-валідація, webhooks.
- Рекламна медіація — налаштування MAX / AdMob, підключення 3-6 мереж, тестування fill rate.
- Налаштування аналітики — RevenueCat, Amplitude / Firebase, когортний аналіз.
- Документація — опис ентайтлментів, процедура відновлення, чек-лист рев'ю.
- Навчання команди — розбір типових помилок, рекомендації з підтримки.
- Гарантія — безкоштовна підтримка 2 тижні після запуску, фікс багів по SLA 24 години.
Терміни орієнтовно
| Етап |
Тривалість |
| Базова IAP (один store) |
1–2 тижні |
| Підписочна система + RevenueCat + paywall |
3–5 тижнів |
| Рекламна медіація (MAX + 3 мережі) |
1–2 тижні |
| Повний цикл (IAP + реклама + аналітика) |
4–8 тижнів |
Вартість розраховується індивідуально. Ми працюємо в цій сфері більше 8 років і реалізували більше 40 проектів з монетизацією — багато з них пройшли App Store Review без жодного блокування. Зв'яжіться з нами для аудиту або замовте консультацію — розповімо, які точки зростання є у вашому додатку.
Джерела: Apple StoreKit 2 Documentation, RevenueCat Best Practices, Wikipedia: Freemium.