Перейти к основному содержанию
Мобильные приложения4 мин чтения

Push-уведомления, которые не приводят к отписке

Разрешение на уведомления пользователь даёт один раз. Разбираем, когда его просить, что отправлять и как не потерять канал за первую неделю.

Экран телефона с несколькими push-уведомлениями от приложения

Push-уведомления — единственный бесплатный канал, который достаёт пользователя без его запроса. Именно поэтому его так легко сжечь: разрешение выдаётся один раз, отзывается в два касания, и вернуть его почти невозможно. По нашему опыту приложение теряет от четверти до половины подписчиков на уведомления в первый месяц, и почти всегда — не из-за текста, а из-за частоты и бессмысленности сообщений.

Разберём канал с технической и продуктовой стороны: как получить разрешение, чем отличаются платформы, что отправлять и как понять по цифрам, что рассылка вредит.

Момент запроса разрешения

Самая частая ошибка — системный запрос на первом экране, до того как человек понял, зачем ему приложение. Соглашаются в этом случае единицы, а второго шанса система не даёт: на iOS повторно показать диалог нельзя, остаётся только вести пользователя в настройки, куда никто не ходит.

Рабочая схема — двухшаговый запрос. Сначала свой экран, который объясняет пользу конкретными словами: «пришлём, когда заказ передадут курьеру». Если человек согласился на своём экране, показываем системный диалог. Если отказался — не показываем и спрашиваем позже, после действия, где уведомления явно полезны.

Запрос разрешения после осмысленного действия, а не на старте
import * as Notifications from "expo-notifications"

export async function askForPush(reason: "order_placed" | "price_alert") {
  const current = await Notifications.getPermissionsAsync()

  // Уже решили — второй раз системный диалог не показываем:
  // на iOS он просто не появится, а счётчик попытки сгорит
  if (current.status !== "undetermined") return current.status

  // Свой экран с объяснением показываем до системного запроса
  const agreed = await showPrePermissionSheet(reason)
  if (!agreed) return "deferred"

  const { status } = await Notifications.requestPermissionsAsync()
  return status
}

Чем различаются платформы

Что учитывать при работе с уведомлениями на двух платформах
АспектiOSAndroid
РазрешениеОбязательное, запрос один разОбязательное с Android 13, раньше выдавалось само
ДоставкаЧерез APNs, без гарантии времениЧерез FCM, влияет режим экономии батареи
Тихие уведомленияЕсть, с ограничением частотыЕсть, приоритет задаётся каналом
ГруппировкаПо thread-idПо каналам, пользователь отключает их по отдельности
ОтпискаПолностью или по типам, если настроеноПо каналам: часть уведомлений можно оставить

Каналы на Android — недооценённая возможность. Если развести уведомления по каналам «статус заказа», «скидки», «новости», пользователь отключит только раздражающий канал, а не приложение целиком. На iOS похожего механизма нет, поэтому типы уведомлений придётся заводить в своих настройках и уважать их на сервере.

Что отправлять

  • Событие, которое пользователь ждёт: заказ собран, задача назначена, документ подписан
  • Изменение по объекту, за которым он сам попросил следить: цена, статус, ответ в переписке
  • Напоминание о незавершённом действии — не чаще одного раза на действие
  • Регулярную сводку, если пользователь сам выбрал частоту

Всё остальное — рекламные рассылки «мы вас потеряли», акции без привязки к интересу, новости компании — работает против канала. Кратковременный подъём открытий такие уведомления дают, но за ними идёт волна отписок, после которой полезные сообщения о заказах доходят до меньшей аудитории.

Как считать эффект

Одного показателя открытий недостаточно: он растёт от агрессивных формулировок и ничего не говорит о вреде. Мы смотрим на четыре цифры в связке.

Показатели канала уведомлений
ПоказательЧто показываетТревожный сигнал
Доля разрешенийКачество запроса и объясненияМеньше 40% на пользователей после первого действия
ОткрытияУместность конкретной рассылкиНиже 3% при массовой отправке
Отписки за неделюВред от частотыБольше 2% подписчиков в неделю
Удаления приложенияКрайняя реакция на рассылкуРост после запуска новой серии уведомлений
Ограничение частоты на стороне сервера — до постановки в очередь
const LIMITS = {
  order: { perDay: 10 },     // транзакционные — почти без ограничений
  reminder: { perDay: 1 },
  marketing: { perWeek: 2 },
}

export async function canSend(userId: string, kind: keyof typeof LIMITS) {
  const prefs = await getPrefs(userId)
  if (!prefs.enabled[kind]) return false

  const limit = LIMITS[kind]
  const since = limit.perDay ? hoursAgo(24) : daysAgo(7)
  const sent = await countSent({ userId, kind, since })

  return sent < (limit.perDay ?? limit.perWeek)
}

Ограничение частоты должно жить на сервере, а не в интерфейсе рассылок. Иначе рано или поздно кто-то запустит кампанию в обход правил — и канал придётся восстанавливать месяцами.

Что мы делаем на проектах

  1. Разделяем уведомления на транзакционные и маркетинговые с раздельными настройками
  2. Просим разрешение после первого значимого действия, со своим экраном-объяснением
  3. Заводим лимиты частоты на сервере и логируем каждую отправку
  4. Складываем в аналитику отправку, доставку, открытие и отписку одним событием
  5. Раз в месяц смотрим отписки по типам и отключаем то, что не окупается

Частые вопросы

Сколько стоит подключить push-уведомления
Базовая интеграция с APNs и FCM, настройки в приложении и серверная отправка — это обычно 20–40 часов работы. Сложность добавляют сегментация, расписания и админка для рассылок: с ними объём вырастает вдвое.
Можно ли обойтись без своего сервера
Для простых рассылок хватает готовых сервисов вроде Firebase или OneSignal. Своя логика нужна, когда уведомления зависят от данных в вашей системе: статуса заказа, остатка на складе, назначения задачи.
Что делать, если пользователь отказался от уведомлений
Не показывать системный диалог повторно — он не появится. Оставьте в настройках приложения понятный переключатель со ссылкой в системные настройки и предложите альтернативу: письмо или сообщение в мессенджер.
мобильные приложенияpushудержаниеаналитика

Похожая задача в вашем проекте?

Разберём вашу ситуацию и пришлём оценку по этапам — без обязательств и общих слов.

Обсудить задачу

Вопрос по статье
или по своему проекту

Отвечаем на заявки в течение одного рабочего дня. Если задача не наша — скажем прямо и подскажем, к кому обратиться.

Написать нам

Поля со звёздочкой обязательны для заполнения.