У новостного приложения с аудиторией 500 тыс. пользователей CTR push-уведомлений изначально был 2.1%. После внедрения персонализации на базе collaborative filtering и multi-armed bandit он вырос до 7–12% — в три с лишним раза. Рост дала системная работа с поведенческими данными, а не магия. Наша команда реализует AI-персонализацию push-уведомлений под ключ: от сбора событий до serving layer. Ежедневно обрабатывается до 200 тыс. событий, а latency рекомендаций не превышает 50 мс.
Мы используем проверенный стек: Swift 5.9 для iOS с async/await, Kotlin с Coroutines для Android, Flutter 3.x для кроссплатформы. Серверная часть на Python 3.11 с библиотеками Surprise (collaborative filtering), LightGBM (CTR prediction) и HuggingFace Transformers (текстовые эмбеддинги). Хранилище событий — ClickHouse (для аналитики) и BigQuery (для ML-пайплайнов). Все решения выдерживают пиковые нагрузки до 10 тыс. запросов в секунду.
Какие данные нужны для персонализации?
Без поведенческих данных персонализация невозможна. Минимальный набор событий:
-
notification_received — показ уведомления
-
notification_opened — тап по уведомлению
-
notification_dismissed — смахивание без открытия
-
content_viewed — просмотр контента
-
content_shared, content_saved, content_liked
Все события логируются с фичами: категория контента, время суток, день недели, тип устройства, версия ОС, длина заголовка. Для хранения используем ClickHouse или BigQuery — они оптимизированы для аналитических запросов. PostgreSQL не подойдет при объеме более 10 млн событий в день.
Как AI выбирает правильное уведомление для каждого пользователя?
Уровень 1: Collaborative filtering. Идея: пользователи, похожие на вас, уже кликнули на это. Реализация — Matrix Factorization (библиотека Surprise или implicit). Модель обучается раз в сутки на данных за последние 30 дней.
Уровень 2: Content-based filtering. Анализ контента, который пользователь читал: извлекаем ключевые слова и категории через TF-IDF или sentence embeddings (модель all-MiniLM-L6-v2). При появлении нового контента считаем cosine similarity с историей пользователя.
Уровень 3: CTR prediction. Бинарная классификация — тапнет или нет для каждой пары пользователь-контент. Используем LightGBM или XGBoost на табличных фичах, CatBoost для категориальных. Инференс занимает десятки миллисекунд.
На практике начинаем с уровня 1 (быстро и интерпретируемо), затем переходим к уровню 3, когда накоплено 50–100 тыс. событий.
| Уровень |
Метод |
Инструменты |
Когда применять |
| 1 |
Collaborative filtering |
Surprise, implicit |
Быстрый старт, мало данных |
| 2 |
Content-based |
TF-IDF, sentence embeddings |
Есть текстовый контент |
| 3 |
CTR prediction |
LightGBM, XGBoost |
Большая история событий |
Персонализация текста уведомления
Одна новость — разные заголовки для разных сегментов. Не генерация через LLM при каждой отправке (слишком медленно). Подход:
- Редактор создаёт 3–5 вариантов заголовка для одного контента.
- Multi-armed bandit (Thompson Sampling) выбирает вариант для каждого пользователя на основе его предыдущего CTR с похожими заголовками.
- Через 24 часа анализируем результат и выявляем победителя.
LLM (через API) может генерировать варианты в разных стилях, но редактор выбирает.
Почему suppression так важен?
При каждой отправке сервис персонализации:
- Получает список целевых пользователей.
- Запрашивает recommendation score из feature store (Redis с pre-computed vectors).
- Если score ниже порога — уведомление не отправляется (suppression).
- Если выше — выбирает персонализированный текст.
- Логирует решение для обучения.
Feature store в Redis обновляется ночным батчем и инкрементально. Suppression снижает opt-out rate и повышает релевантность. В нашей практике suppression снизил opt-out rate на 40% за 3 недели.
A/B тестирование и метрики
Обязательный A/B тест перед глобальным rollout: 10% пользователей получают персонализированные уведомления, 90% — стандартные. Метрики через 2 недели:
- CTR — основная метрика.
- Opt-out rate — снизился ли процент отписок.
- Session starts per notification.
- Revenue per notification.
Firebase A/B Testing + Remote Config покрывают базовые сценарии.
Мобильный клиент: что меняется
Ничего. Push приходит через стандартный FCM, обрабатывается как обычно. Вся логика серверная. Клиент только отправляет события поведения. Шифрование — через UNNotificationServiceExtension на iOS.
Этапы внедрения
| Этап |
Длительность |
Результат |
| Аудит |
1 неделя |
Отчет по текущей системе |
| Настройка аналитики |
1–2 недели |
Пайплайн событий |
| Разработка модели |
2–4 недели |
Прототип с метриками |
| A/B тест |
2 недели |
Статистически значимый результат |
Свяжитесь с нами, чтобы обсудить детали и получить индивидуальный план. Закажите бесплатный аудит — оценим возможности персонализации для вашего приложения.
Типичные ошибки при внедрении персонализации
- Отсутствие логирования dismiss событий — модель не видит негативную обратную связь.
- Использование PostgreSQL для аналитики — медленные запросы при миллионах событий.
- Запуск без A/B теста — невозможно измерить эффект.
Что входит в работу
- Аудит текущей системы уведомлений и аналитики.
- Проектирование пайплайна данных.
- Разработка и обучение моделей (collaborative / content-based / CTR).
- Реализация serving layer (feature store, suppression, multi-armed bandit).
- A/B тестирование и анализ метрик.
- Документация и обучение команды.
- Поддержка после запуска.
Наши компетенции
Более 7 лет опыта в мобильной разработке, более 50 проектов с персонализацией. Соблюдаем политики App Store и Google Play согласно Human Interface Guidelines.
Оцените возможности персонализации для вашего приложения — закажите бесплатный аудит.
Push-уведомления в мобильном приложении: APNs, FCM, сегментация, rich push
Мы внедрили push-уведомления в мобильном приложении для 50+ проектов — от стартапов до enterprise с аудиторией 10M+ пользователей. Нерелевантное или технически сломанное уведомление хуже его отсутствия: пользователь отключает push или удаляет приложение. Согласно отчёту Localytics, отказ от push-разрешений на iOS достигает 40% в первую неделю — причина почти всегда в нерелевантности, а не в механике. Уже через 2 недели после внедрения качественной сегментации конверсия открытия вырастает на 25–30%. Свяжитесь с нами для аудита текущей реализации — мы оценим проект и предложим оптимальный стек за один день.
Как работает инфраструктура: APNs и FCM
APNs — единственный канал доставки на iOS. Всё остальное (OneSignal, Braze, Airship) — обёртки поверх него. APNs принимает запрос по HTTP/2, аутентификация через JWT-токен (p8-ключ) или сертификат. JWT предпочтительнее: один ключ для всех приложений в аккаунте, не истекает ежегодно в отличие от сертификата. Подробнее — на Wikipedia.
Критический момент: APNs различает apns-push-type — alert, background, voip, complication, fileprovider, mdm. Неправильно указанный тип на iOS 13+ приводит к тому, что background-уведомление не разбудит приложение. Видели проекты, где content-available: 1 отправляли без apns-push-type: background — приложение не получало silent push на части устройств, и команда месяц искала «баг в приложении».
FCM на Android работает через Google Play Services. Для устройств без GMS (Huawei, часть китайского рынка) нужен Huawei Push Kit или прямой WebSocket — отдельная задача. FCM поддерживает data-сообщения (обрабатываются в onMessageReceived) и notification-сообщения (система отображает автоматически, если приложение в фоне). Смешивать их нужно осторожно: если в notification-блоке есть click_action, а deep link в приложении не зарегистрирован, тап по уведомлению просто откроет главный экран без навигации.
| Характеристика |
APNs |
FCM |
| Аутентификация |
JWT-токен или сертификат |
Сервис-аккаунт Firebase |
| Типы сообщений |
alert, background, voip, etc. |
notification, data |
| Silent push |
content-available + apns-push-type: background |
data-сообщение с приоритетом high |
| Ограничения по payload |
4 КБ |
4 КБ (верхний), до 2 КБ для notification |
| Работа без Google Play |
Н/П (только iOS) |
Нет, нужен альтернативный провайдер |
Почему сегментация — основа эффективных push-уведомлений?
Отправлять всем подряд — значит быстро исчерпать лояльность пользователей. Персонализированные сообщения кликают в 3 раза чаще массовых, а правильная сегментация снижает отток на 25% (на одном из проектов это принесло дополнительный доход 3 млн рублей за квартал). Стоимость настройки сегментации в OneSignal или кастомном бэкенде составляет от 100 000 до 250 000 рублей в зависимости от сложности фильтров.
Нормальная сегментация строится на нескольких уровнях.
| Тип сегментации |
Инструмент |
Пример |
| По топикам |
FCM topics / APNs push-to-topic |
Уведомления о статусе заказа |
| По атрибутам |
OneSignal, Braze |
last_active < 7_days + plan = premium |
| Персонализированные |
Кастомный бэкенд |
По device_token с привязкой к профилю |
Топики — для широких категорий: «новые акции», «обновления статуса заказа». Пользователь подписывается через FirebaseMessaging.getInstance().subscribeToTopic("orders"). Просто, но нет гибкой фильтрации.
Сегменты по атрибутам — через OneSignal, Braze или кастомный бэкенд. Храним в профиле пользователя: язык, тип устройства, последняя активность, LTV-сегмент. Уведомление уходит только тем, у кого last_active < 7_days и plan = premium. OneSignal позволяет строить такие фильтры в интерфейсе без кода.
Персонализированные — по конкретному device_token. Важно хранить токены правильно: токен обновляется при переустановке приложения, при восстановлении из бэкапа на новый телефон, при сбросе настроек. На iOS используем UNUserNotificationCenter + didRegisterForRemoteNotificationsWithDeviceToken, сохраняем на бэкенд при каждом запуске, не только при первом. Иначе через 3 месяца 30% токенов в базе устаревшие.
Что такое rich push и как он повышает конверсию?
Стандартное уведомление с заголовком и текстом кликают реже, чем rich push с картинкой и кнопками действий — в 3 раза. Но реализация rich push — отдельная работа на каждой платформе.
На iOS rich content требует UNNotificationServiceExtension (для модификации payload) и UNNotificationContentExtension (кастомный UI). Расширение запускается в отдельном процессе с ограниченным временем и памятью. Если расширение падает или превышает таймаут, система показывает оригинальный payload без медиа. Типичная ошибка — пытаться загрузить изображение по HTTP (не HTTPS): ATS заблокирует запрос, расширение молча завершится, пользователь увидит уведомление без картинки.
На Android с API 26+ уведомления привязаны к NotificationChannel. Если канал создан с IMPORTANCE_LOW, звук и вибрация недоступны. Разные типы уведомлений (транзакционные, маркетинговые) должны быть в разных каналах, чтобы пользователь мог отключить маркетинг, не теряя уведомлений о заказах. BigPictureStyle, MessagingStyle, InboxStyle — шаблоны для расширенных уведомлений. MessagingStyle с Person и аватарками — лучший выбор для чатов.
| Платформа |
Компонент |
Особенности |
| iOS |
UNNotificationServiceExtension |
Время выполнения ~30 с, память ~50 МБ, обязательный HTTPS |
| iOS |
UNNotificationContentExtension |
Кастомный UI, кнопки действий |
| Android |
NotificationChannel |
Уровень важности, звук, вибрация — настраиваются пользователем |
| Android |
BigPictureStyle / MessagingStyle |
Расширенный контент, группировка сообщений |
Как отследить доставку и конверсию push-уведомлений?
Отправить уведомление — полдела. Важно знать: доставлено ли оно, открыто ли, привело ли к целевому действию.
FCM отдаёт MessageId при отправке, но не гарантирует коллбэк о доставке — это by design. Для tracking открытий нужна кастомная логика: при тапе на уведомление в onMessageReceived или через getInitialNotification() / onNotificationOpenedApp (OneSignal SDK) отправляем событие в аналитику с notification_id.
OneSignal предоставляет встроенную аналитику доставки и CTR. Для более детального анализа — интегрируем с Amplitude или Mixpanel через webhook на событие открытия. Бюджет такого дашборда составляет от 50 000 до 150 000 рублей в зависимости от объёма событий.
Как мы внедряем push-уведомления: типовой процесс
-
Аудит текущей реализации — проверяем хранение токенов, обработку обновлений, типы уведомлений.
-
Проектирование архитектуры — выбираем транспорт (FCM + APNs), слой сегментации (OneSignal/Braze/кастом), способ персонализации.
-
Реализация — пишем код регистрации, обработки входящих, rich push, deep linking.
-
Тестирование — отправляем тестовые кампании, проверяем доставку на разных устройствах, симуляторах, регионах.
-
Мониторинг и аналитика — настраиваем дашборд, события открытия и конверсий.
-
Документация и обучение — передаём команде материалы по эксплуатации.
Типичный стек: FCM + APNs на транспортном уровне, OneSignal или Firebase Notifications Composer для сегментации, кастомный бэкенд для персонализированных событийных уведомлений. Для крупных приложений с >1M пользователей OneSignal имеет ценовые ограничения — тогда используем Braze или собственную реализацию на AWS SNS.
Типичные ошибки при настройке push-уведомлений
- Не хранить обновлённые
device_token при каждом запуске — через 3 месяца 30% токенов устаревают.
- Путать
apns-push-type — background-уведомления не пробуждают приложение.
- Создавать один
NotificationChannel для всех типов уведомлений — пользователь не сможет отключить маркетинг, не потеряв транзакции.
- Загружать медиа в rich push по HTTP — ATS блокирует запрос на iOS.
- Не проверять deep link в таргетинге — переходы идут на главный экран.
Сроки зависят от сложности: базовая интеграция FCM+APNs с транзакционными уведомлениями — 1–2 недели. Полноценная система с сегментацией, rich push, аналитикой и A/B-тестированием контента — 4–8 недель. Закажите аудит текущей push-инфраструктуры или получите консультацию по внедрению push-уведомлений в мобильном приложении — мы свяжемся с вами в течение дня и предоставим точную оценку.