Настройка сегментации push-уведомлений в мобильном приложении
Отправлять одно и то же уведомление всей базе — это не сегментация, это спам. CTR падает, отписки растут, iOS начинает ограничивать доставку через Apple's notification throttling для приложений с низким engagement rate. Грамотная сегментация — техническая задача, а не маркетинговая.
Как работает сегментация на уровне SDK
Любая платформа рассылок (OneSignal, Firebase, Braze, Airship) строит сегменты на основе двух источников: атрибуты пользователя (теги, properties) и поведенческие данные (события, сессии, покупки).
На клиенте задача одна — корректно передавать данные:
// Android — после каждого значимого действия
OneSignal.User.addTag("subscription_tier", "premium")
OneSignal.User.addTag("last_active_days", "0")
OneSignal.User.addTag("preferred_category", "electronics")
// При изменении локации (с разрешения пользователя)
OneSignal.User.addTag("region", "UA-30") // ISO 3166-2
// iOS — то же самое
OneSignal.User.addTag("onboarding_completed", "true")
OneSignal.User.addTag("cart_items_count", "\(cart.items.count)")
Теги — строки. Всё сравнение серверное. Важно: не отправляйте тег при каждом запуске приложения — это лишний трафик. Отправляйте только при изменении значения.
Поведенческие сегменты и триггеры
Самый частый кейс — триггерная отправка по событию: пользователь бросил корзину, не открывал приложение 7 дней, прошёл онбординг но не совершил первое действие.
Для этого нужна серверная логика. Мобильный клиент только фиксирует events:
// Firebase Analytics — события автоматически доступны в Audience Builder
FirebaseAnalytics.getInstance(context).logEvent("checkout_started") {
param("cart_value", 1250.0)
param("items_count", 3L)
}
В Firebase Audiences можно построить сегмент: «пользователи, которые запустили checkout_started но не запустили purchase_complete за последние 24 часа» — и отправить им уведомление через FCM напрямую или через Firebase In-App Messaging.
Если используется Braze — там сегменты строятся через Canvas с условными ветвями. Клиентская интеграция через Braze SDK:
// iOS
Appboy.sharedInstance()?.logCustomEvent("item_viewed", withProperties: [
"item_id": "SKU-4892",
"category": "shoes"
])
Геосегментация
Геосегментация в push — не «находится в Киеве прямо сейчас», а «регион пользователя из профиля» или геозоны (geofences).
OneSignal поддерживает автоматическое определение локации при включённом setLocationShared(true). Но Apple и Google всё жёстче относятся к фоновой геолокации. Надёжнее — передавать регион из профиля пользователя как тег.
Для реальных геозон (уведомление при входе в зону) — CoreLocation на iOS с CLLocationManager.startMonitoring(for:) или Geofencing API на Android через GeofencingClient. Это работает через local notifications или silent push для обновления данных.
Сегменты по устройствам и платформам
// Отправка только iOS-пользователям с версией приложения >= 3.0
{
"filters": [
{ "field": "device_type", "relation": "=", "value": "iOS" },
{ "operator": "AND" },
{ "field": "app_version", "relation": ">=", "value": "3.0" }
]
}
Это полезно при релизе feature, доступной только в новой версии — не отправлять deep link на экран, которого нет в старом приложении.
Типичные ошибки при настройке сегментации
Теги пишутся непоследовательно: одни разработчики пишут "true"/"false", другие "1"/"0", третьи просто добавляют или удаляют тег. В результате сегмент «пользователи с тегом notifications_enabled = true» не захватывает тех, у кого просто есть этот тег без значения.
Лучше зафиксировать схему тегов в отдельном enum:
object UserTags {
const val SUBSCRIPTION = "subscription_tier"
const val REGION = "region_iso"
const val LAST_ORDER_DAYS = "last_order_days_ago"
fun updateLastOrderDays(daysSince: Int) {
OneSignal.User.addTag(LAST_ORDER_DAYS, daysSince.toString())
}
}
Сроки
Проектирование схемы тегов и поведенческих событий, реализация SDK-интеграции на iOS + Android (или Flutter), настройка автоматических сегментов на стороне платформы — 5–8 рабочих дней. Сложные триггерные цепочки с серверной логикой (например, Braze Canvas или собственный cron-воркер) — от 2 недель.







