Настройка персонализации push-уведомлений в мобильном приложении
Уведомление «Привет, {{имя}}!» — это не персонализация. Настоящая персонализация — это когда пользователь получает сообщение о скидке именно на ту категорию товаров, которую просматривал три дня назад, в то время суток, когда он обычно открывает приложение. Разберём, как это реализуется технически.
Динамические переменные в payload
Любая серьёзная платформа — OneSignal, Braze, CleverTap, Firebase + собственный бэкенд — поддерживает шаблоны с переменными. Серверная сторона рендерит финальный текст перед отправкой.
В OneSignal это выглядит так на уровне API:
{
"app_id": "YOUR_APP_ID",
"include_aliases": { "external_id": ["user_88234"] },
"headings": { "ru": "{{first_name}}, ваш избранный товар подешевел" },
"contents": { "ru": "{{product_name}} теперь стоит {{new_price}} ₴ — на {{discount_percent}}% меньше" },
"data": { "product_id": "{{product_id}}", "screen": "product_detail" }
}
Значения переменных берутся из тегов пользователя в OneSignal или передаются в substitutions при отправке через API. Тег first_name должен быть установлен заранее на клиенте:
OneSignal.User.addTag("first_name", user.firstName)
OneSignal.User.addTag("preferred_category", user.topCategory)
Персонализация на основе поведения
Это сложнее — требует аналитического слоя на бэкенде. Типичная схема:
- Клиент логирует события (просмотр товара, добавление в вишлист, категория).
- Бэкенд или ML-сервис формирует рекомендации по пользователю.
- При отправке уведомления payload обогащается рекомендованным контентом.
Если нет собственного рекомендательного движка — можно использовать Firebase Personalization (ML-based оптимизация контента A/B тестов) или Braze Recommendations, которые строят модель на основе истории событий SDK.
// Логируем поведение через Firebase Analytics
firebaseAnalytics.logEvent(FirebaseAnalytics.Event.VIEW_ITEM) {
param(FirebaseAnalytics.Param.ITEM_ID, product.id)
param(FirebaseAnalytics.Param.ITEM_CATEGORY, product.category)
param(FirebaseAnalytics.Param.PRICE, product.price)
}
Оптимальное время отправки (Intelligent Delivery)
OneSignal Intelligent Delivery и Braze Optimal Time отслеживают паттерны активности каждого пользователя и откладывают доставку до периода наибольшей вероятности открытия. Для одного пользователя это 8 утра, для другого — 23:00.
Включается одним параметром при отправке:
{
"delayed_option": "last-active",
"delivery_time_of_day": "9:00AM"
}
last-active — доставить в то же время суток, когда пользователь последний раз был активен. Это не ML, но уже лучше batch-рассылки в одно время для всех.
Более точный вариант в OneSignal — intelligent_delivery: true. Платформа сама выбирает окно по истории open rate конкретного пользователя.
A/B тестирование
Без A/B нельзя утверждать, что персонализация работает. OneSignal поддерживает A/B тесты нативно:
{
"name": "price_drop_ab_test",
"messages": [
{
"variant_id": "A",
"contents": { "ru": "{{product_name}} подешевел на {{discount}}%" },
"weight": 50
},
{
"variant_id": "B",
"contents": { "ru": "Скидка {{discount}}% на товар из вашего вишлиста" },
"weight": 50
}
]
}
После завершения теста OneSignal показывает CTR по каждому варианту. Победивший вариант внедряем в шаблон.
Отслеживание конверсий
CTR уведомления — промежуточная метрика. Важнее — did the user actually complete the action? Для этого нужны outcome events:
// В обработчике открытия уведомления
OneSignal.Notifications.addClickListener { event ->
val productId = event.notification.additionalData?.getString("product_id")
// Пользователь перешёл к товару
OneSignal.Session.addOutcome("notification_click_to_product")
}
// После завершения покупки (в другом месте кода)
OneSignal.Session.addOutcomeWithValue("purchase_from_notification", orderValue.toFloat())
Это связывает конверсию с конкретным уведомлением даже если между кликом и покупкой прошло несколько минут.
Сроки
Реализация динамических переменных и шаблонов, настройка Intelligent Delivery, интеграция outcome events и базового A/B тестирования — 6–10 рабочих дней. Если требуется собственный рекомендательный слой на бэкенде или интеграция с внешней ML-системой — сроки обсуждаются отдельно.







