Проблема: ручная рассылка убивает бюджет и конверсию
Мобильное приложение выросло до 500 000 пользователей, но маркетолог по-прежнему копирует тексты вручную, не сегментирует аудиторию и не отслеживает результаты. Push-уведомления отправляются всем подряд, конверсия падает, а затраты на рассылку растут. Мы создали административную панель для управления push-уведомлениями, которая автоматизирует кампании, экономит бюджет до 40% и повышает конверсию. Это не просто форма ввода текста, а инструмент с сегментацией, A/B тестами, шаблонами и real-time аналитикой. Работаем с push-уведомлениями более 6 лет, выполнили более 50 проектов для fintech, edtech и e-commerce. Гарантируем стабильность доставки и соответствие App Store Review Guidelines.
Архитектура системы
Ключевые компоненты
Admin Panel (мобильное приложение)
↓
Campaign API (бэкенд)
↓
Queue (RabbitMQ / Redis)
↓
Push Worker (отправка через FCM / APNs / OneSignal)
↓
Webhook Handler (статусы доставки)
↓
Analytics DB (клики, открытия, конверсии)
Мобильное приложение — только управляющий интерфейс. Всю тяжёлую работу делает серверная сторона.
Как устроена система уведомлений через административную панель?
Система включает в себя несколько ключевых элементов: создание кампаний через 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 и панель управления «из коробки» за одну неделю. Однако нативная интеграция даёт полный контроль над данными и не имеет ограничений бесплатного тарифа. Выбор зависит от требований к безопасности и бюджету. Экономия бюджета на push-рассылки при использовании сегментации и A/B тестов — до 40%.
| Платформа | Время интеграции | Стоимость | Доп. возможности |
|---|---|---|---|
| FCM + APNs (нативные) | от 4 недель | Бесплатно | Полный контроль |
| OneSignal | от 1 недели | Бесплатно до 10k подписчиков | A/B тесты, сегментация |
Права доступа
Разные роли в admin panel:
| Роль | Может создавать | Может отправлять | Видит аналитику |
|---|---|---|---|
| Редактор | Да | Нет (только черновик) | Только своих кампаний |
| Маркетолог | Да | Да | Все кампании |
| Администратор | Да | Да | Всё + управление шаблонами |
На сервере права проверяются через middleware. На клиенте — отключаем/скрываем кнопки по role из JWT, но это только UX, не безопасность.
Почему стоит выбрать нас?
Работаем с push-уведомлениями более 6 лет. Выполнили более 50 проектов для fintech, edtech и e-commerce. Гарантируем стабильность доставки и соответствие App Store Review Guidelines. Свяжитесь с нами, чтобы оценить ваш проект за один день. Закажите разработку системы уведомлений с гарантией стабильности.
Что входит в работу
- Исходный код мобильной admin panel (iOS + Android)
- Документация API и описание архитектуры
- Инструкция по эксплуатации для менеджеров
- 30 дней поддержки после релиза
- Передача доступов (App Store, Google Play, Firebase)
- Обучение команды (1 час)
Сроки
Мобильная admin panel с wizard создания кампании, управлением шаблонами, real-time аналитикой, историей рассылок и ролевыми правами доступа — 10–16 рабочих дней для мобильной части (без учёта серверной инфраструктуры очереди и worker'ов).
Дополнительно: за счёт сегментации стоимость привлечения пользователя снижается на 30%, а средний чек вырастает на 20% — проверено на проектах e-commerce.







