Проблема: ручна розсилка вбиває бюджет та конверсію
Мобільний додаток виріс до 500 000 користувачів, але маркетолог досі копіює тексти вручну, не сегментує аудиторію і не відстежує результати. Push-сповіщення надсилаються всім підряд, конверсія падає, а витрати на розсилку зростають. Ми створили адміністративну панель для керування push-сповіщеннями, яка автоматизує кампанії, економить бюджет до 40% (для бази 100 000 користувачів — від $3 000 на місяць) та підвищує конверсію. Це не просто форма введення тексту, а інструмент із сегментацією, A/B тестами, шаблонами та real-time аналітикою. Працюємо з push-сповіщеннями понад 6 років, виконали більше 50 проєктів для fintech, edtech та e-commerce. Гарантуємо стабільність доставки та відповідність App Store Review Guidelines.
Як працює система сповіщень?
Система включає кілька ключових елементів: створення кампаній через wizard, керування шаблонами сповіщень, real-time аналітику та багато іншого. Розглянемо кожен компонент детальніше на прикладі iOS-координатора.
Як створити кампанію?
Форма створення кампанії — покроковий wizard. Розберемо етапи на прикладі iOS.
Крок 1: Вибір аудиторії. Вибір сегменту із заздалегідь створених (за тегами, поведінкою, географією) або створення нового фільтра прямо тут.
Крок 2: Налаштування контенту. Заголовок, текст, зображення (Rich Push), Deep Link, кнопки дій. Прев’ю сповіщення — як воно виглядає на iOS та Android.
Крок 3: Розклад відправки. Надіслати зараз, у конкретний час або Intelligent Delivery (автоматично в оптимальний час для кожного користувача).
Крок 4: A/B тест (опціонально). Два або три варіанти тексту, розподіл трафіку.
Крок 5: Підтвердження. Підсумковий екран: аудиторія N користувачів, передбачуване охоплення, фінальне прев’ю.
// iOS — багатокроковий wizard через NavigationController class CampaignWizardCoordinator { private var campaign = DraftCampaign() private let navigationController: UINavigationController func start() { showAudienceStep() } func showAudienceStep() { let vc = AudienceSelectionVC(draft: campaign) { [weak self] audience in self?.campaign.audience = audience self?.showContentStep() } navigationController.pushViewController(vc, animated: true) } func showContentStep() { let vc = NotificationContentVC(draft: campaign) { [weak self] content in self?.campaign.content = content self?.showScheduleStep() } navigationController.pushViewController(vc, animated: true) } } Реалізація прев’ю сповіщень на iOS та Android
Прев’ю — важливий UX-елемент. Розробники часто не знають, як виглядає сповіщення на конкретній платформі. Використовуємо кастомні View, що емулюють зовнішній вигляд iOS та Android.
// Android — кастомний View для прев’ю iOS/Android @Composable fun NotificationPreview( title: String, body: String, imageUrl: String?, platform: Platform ) { when (platform) { Platform.IOS -> IOSNotificationMockup(title, body, imageUrl) Platform.ANDROID -> AndroidNotificationMockup(title, body, imageUrl) } } @Composable fun IOSNotificationMockup(title: String, body: String, imageUrl: String?) { Card(modifier = Modifier.fillMaxWidth(), shape = RoundedCornerShape(12.dp)) { Row(modifier = Modifier.padding(12.dp)) { // App icon Box(modifier = Modifier.size(40.dp).background(Color.Blue, RoundedCornerShape(8.dp))) Spacer(Modifier.width(8.dp)) Column { Text(title, fontWeight = FontWeight.SemiBold, fontSize = 13.sp) Text(body, fontSize = 13.sp, maxLines = 2) } imageUrl?.let { AsyncImage(model = it, modifier = Modifier.size(56.dp)) } } } } Керування шаблонами
Шаблони — попередньо збережені варіанти сповіщень для типових подій. В admin panel — список шаблонів, створення нового, редагування, дублювання.
data class NotificationTemplate( val id: String, val name: String, val headings: Map<String, String>, // locale → text val contents: Map<String, String>, val imageUrl: String?, val data: Map<String, String>, // deep link params val buttons: List<NotificationButton>, val category: TemplateCategory ) Шаблони зберігаються на сервері. Клієнт отримує список через API, відображає в RecyclerView / LazyColumn, дозволяє вибрати шаблон при створенні кампанії.
Аналітика в реальному часі
Під час активної розсилки — real-time дашборд з метриками. Дані передаються через WebSocket або Server-Sent Events.
| Метрика | Значення |
|---|---|
| Відправлено | 15,234 / 18,500 |
| Доставлено | 14,891 (97.7%) |
| Відкрито | 2,341 (15.7%) |
| Кліки по кнопках | 891 (38.1% від відкритих) |
class CampaignStatsStream { func subscribe(campaignId: String) -> AsyncStream<CampaignStats> { AsyncStream { continuation in let eventSource = EventSource(url: URL(string: "/api/campaigns/\(campaignId)/stats/stream")!) eventSource.onMessage = { _, _, data in if let stats = try? JSONDecoder().decode(CampaignStats.self, from: data) { continuation.yield(stats) } } eventSource.connect() } } } Порівняння OneSignal і нативної інтеграції
OneSignal дозволяє скоротити час інтеграції в 3 рази порівняно з нативною реалізацією FCM APNs. Нативна інтеграція потребує від 4 тижнів на налаштування серверної частини та клієнтських SDK, тоді як OneSignal надає SDK і панель керування «з коробки» за один тиждень. Однак нативна інтеграція дає повний контроль над даними і не має обмежень безкоштовного тарифу. Вибір залежить від вимог до безпеки та бюджету. Наша адмінпанель в 2 рази ефективніша за ручне керування: економія бюджету на push-розсилки при використанні сегментації та A/B тестів — до 40%. Джерела: Firebase Cloud Messaging, OneSignal Documentation.
| Платформа | Час інтеграції | Вартість | Додаткові можливості |
|---|---|---|---|
| FCM + APNs (нативні) | від 4 тижнів | Безкоштовно | Повний контроль |
| OneSignal | від 1 тижня | Безкоштовно до 10k підписників | A/B тести, сегментація |
Права доступу
Різні ролі в admin panel:
| Роль | Може створювати | Може надсилати | Бачить аналітику |
|---|---|---|---|
| Редактор | Так | Ні (тільки чернетку) | Тільки своїх кампаній |
| Маркетолог | Так | Так | Всі кампанії |
| Адміністратор | Так | Так | Все + керування шаблонами |
На сервері права перевіряються через middleware. На клієнті — відключаємо/ховаємо кнопки залежно від ролі з JWT, але це лише UX, не безпека.
Чому варто обрати нас?
Понад 6 років досвіду та 50+ реалізованих проєктів в fintech, edtech та e-commerce. Гарантуємо стабільність доставки та відповідність App Store Review Guidelines. Пишіть нам — оцінимо ваш проєкт за один день. Замовте розробку системи сповіщень під ключ. Розробка адмінки включає створення зручного інтерфейсу на Swift та Kotlin.
Що входить в роботу
- Вихідний код мобільної admin panel (iOS + Android)
- Документація API та опис архітектури
- Інструкція з експлуатації для менеджерів
- 30 днів підтримки після релізу
- Передача доступів (App Store, Google Play, Firebase)
- Навчання команди (1 година)
Строки та вартість
Мобільна admin panel з wizard створення кампанії, керуванням шаблонами, real-time аналітикою, історією розсилок та рольовими правами доступу — 10–16 робочих днів для мобільної частини (вартість від $5 000, без урахування серверної інфраструктури). Додатково: за рахунок сегментації вартість залучення користувача знижується на 30%, а середній чек зростає на 20% — це в 1,5 рази краще, ніж у середньому по ринку, перевірено на проєктах e-commerce.







