Сервис push-уведомлений PushService для веб- и PWA-приложений - двукратная экономия на СМС
Реализован собственный сервис доставки push-уведомлений пользователям веб- и PWA-приложений. Сервис даёт бесплатный по трафику канал информирования как альтернативу платным SMS, обеспечивает централизованное управление подписками и статусами доставки, а также асинхронную обработку с обратной связью о результате. Ожидаемый эффект — сокращение затрат на SMS-информирование и ускорение доставки сообщений пользователям.
Поставленная задача
Компания использует платные каналы (в первую очередь SMS) для оперативного информирования пользователей цифровых сервисов. SMS-информирование тарифицируется за каждое сообщение и формирует постоянную статью расходов, которая растёт вместе с активной базой пользователей.
Перед командой поставлена задача снизить зависимость от платных каналов и реализовать собственный механизм доставки уведомлений, отвечающий следующим целям:
- Сокращение затрат на SMS — перевести часть оперативных уведомлений на бесплатный по трафику канал.
- Скорость информирования — доставлять сообщения пользователю практически мгновенно, без задержек операторских шлюзов.
- Контроль и наблюдаемость — иметь единый инструмент управления подписками и отслеживания статусов доставки.
- Технологическая основа — создать платформу, на которой в дальнейшем можно наращивать новые типы уведомлений.
Предложенное решение
В качестве решения выбрана доставка уведомлений по технологии Web Push для веб- и PWA-приложений. Это стандартный механизм, поддерживаемый современными браузерами, который позволяет отправлять сообщения пользователю даже когда вкладка приложения закрыта.
Что такое PWA и Web Push
PWA (Progressive Web App) — это веб-приложение, которое пользователь может установить на устройство как обычное приложение. Web Push — механизм, по которому такое приложение (или браузер) получает уведомления от сервиса. Ключевая особенность: доставка идёт через инфраструктуру браузерных вендоров и не тарифицируется пооператорно, в отличие от SMS.
Принцип работы в трёх шагах:
- Пользователь заходит в приложение и разрешает получение уведомлений.
- Приложение оформляет «подписку» — уникальный адрес доставки для этого устройства — и передаёт её в сервис.
- Когда возникает событие, сервис отправляет уведомление по сохранённой подписке, и оно появляется у пользователя.
Что оборачивается в PWA
В PWA оборачивается личный кабинет клиента (ЛК) — существующее веб-приложение, которым пользователи уже пользуются в браузере. Отдельное нативное приложение под каждую платформу при этом не требуется: тот же ЛК становится устанавливаемым и получает возможность принимать push-уведомления.
Технически превращение веб-приложения в PWA выполняется добавлением двух стандартных компонентов, без переписывания самого личного кабинета:
- Манифест приложения. Файл с описанием приложения (имя, иконки, стартовый экран), благодаря которому браузер предлагает «установить» ЛК на устройство как отдельное приложение.
- Service worker. — Фоновый обработчик в браузере, который принимает push-уведомления и показывает их пользователю, даже когда вкладка ЛК закрыта.
После установки ЛК как PWA пользователь разрешает уведомления, приложение оформляет push-подписку и передаёт её в PushService. Дальнейшая доставка идёт по механизму, описанному в разделе 3.
ПРИМЕЧАНИЕ: Минимум изменений в ЛК
Оборачивание в PWA не затрагивает бизнес-логику личного кабинета — добавляются только манифест и service worker, а также клиентский код подписки на push. Существующий функционал ЛК продолжает работать как прежде, в том числе в обычном браузере без установки.
Почему это выгоднее SMS
| Критерий | SMS | Web Push (PushService) |
|---|---|---|
| Стоимость доставки | Плата за каждое сообщение | Бесплатно по трафику |
| Скорость | Зависит от оператора | Практически мгновенно |
| Богатство сообщения | Только текст | Заголовок, текст, иконка, изображение, ссылка |
| Обратная связь | Ограниченная | Статус доставки по каждому уведомлению |
| Управление базой | Внешние списки | Централизованный реестр подписок |
ВНИМАНИЕ · Важное ограничение охвата
Web Push доставляется только тем пользователям, кто установил приложение и разрешил уведомления. Push замещает не весь SMS-трафик, а его часть — по подписанным пользователям. SMS сохраняется как канал для неохваченной аудитории и критичных сообщений.
Как реализовано
Сервис PushService принимает уведомления от внешних систем, ставит их в очередь и асинхронно доставляет по активным подпискам получателя, фиксируя статус и при необходимости возвращая результат во внешнюю систему. Ниже приведена принципиальная схема работы.
Механизм доставки
- Приём. Внешняя система отправляет уведомление; сервис проверяет права и обязательные поля, ставит его в очередь и сразу подтверждает приём.
- Очередь. Принятые уведомления накапливаются в очереди доставки — это сглаживает пиковые нагрузки.
- Воркер. Фоновый обработчик забирает уведомления из очереди и доставляет их по активным подпискам пользователя.
- Фиксация статуса. По каждому уведомлению сохраняется результат: доставлено, ошибка, истёк срок или исчерпаны попытки.
ПРИМЕЧАНИЕ: Принято ≠ доставлено
Подтверждение приёма означает лишь, что уведомление поставлено в очередь. Итоговый результат становится известен после обработки воркером. Такое разделение — норма для систем массовой доставки: оно позволяет принимать большой поток запросов, не блокируя отправителя на время фактической доставки.
Виды рассылок
Сервис поддерживает три способа отправки, покрывающих разные сценарии:
| Вид рассылки | Назначение | Как инициируется |
|---|---|---|
| Одиночная отправка | Реакция на событие для одного пользователя (например, статус заявки) | Внешняя система через Integration API |
| Пакетная отправка | Группа уведомлений за один запрос (до 500 за раз) | Практически мгновенно |
| Массовая отправка | Разовая рассылка из файла Excel (до 1000 строк) | Администратор через административный интерфейс |
Все виды рассылок проходят единый конвейер обработки (проверка → очередь → доставка → статус), что обеспечивает предсказуемое поведение независимо от способа отправки. Защита от дублей реализована через ключ идемпотентности: повторная отправка того же уведомления не создаёт дубликат.
Обратная связь: callbacks
Для интеграций, которым важно знать судьбу сообщения, предусмотрен механизм callback — передача результата доставки обратно во внешнюю систему по настроенному адресу. При временной недоступности приёмника выполняются повторные попытки по заданной политике (несколько попыток с нарастающими интервалами и таймаутом ответа).
СОВЕТ: Что это даёт бизнесу
Callback превращает push из «отправил и забыл» в контролируемый канал: система-источник получает подтверждение доставки и может строить на нём свою логику и отчётность (например, эскалировать в SMS, если push не доставлен).
Фоновая доставка и поведение на платформах
Возможность получать уведомления, когда приложение закрыто (в фоновом режиме), зависит от платформы устройства. Это следствие политик самих платформ, а не ограничение сервиса PushService — сервис одинаково формирует и отправляет уведомление во всех случаях, но конечное поведение определяется операционной системой и способом установки приложения.
Текущая картина по платформам:
- Android. Уведомления доставляются полноценно, в том числе в фоновом режиме — когда приложение личного кабинета закрыто. Это основной сценарий, работающий штатно.
- iOS (PWA). Уведомления доставляются полноценно, в том числе в фоновом режиме — когда PWA личного кабинета закрыта. Это основной сценарий, работающий штатно.
Безопасность и управление
- Секретные данные подписок хранятся в зашифрованном виде и никогда не возвращаются в ответах и выгрузках.
- Доступ разграничен по ролям и токенам: отдельные права на чтение реестра и на управляющие операции.
- Административный интерфейс даёт единую точку контроля: состояние сервиса, реестр подписок, диагностика доставки, массовая отправка.
- Отзыв подписки выполняется логически, без удаления записи — история сохраняется для аудита.
Детальная схема взаимодействия
Ниже приведена диаграмма последовательности, детализирующая внутреннюю работу сервиса при отправке уведомления: от приёма запроса и постановки задачи в очередь до отправки через шлюз, обработки успеха и ошибок с повторными попытками, приёма итогового статуса доставки (callback) и фиксации событий в системе логирования и мониторинга.
Ключевые моменты, которые иллюстрирует диаграмма:
- Разделение приёма и доставки. После проверки и сохранения уведомления API сразу отвечает «принято в работу» (202), а фактическая отправка выполняется обработчиком задач асинхронно.
- Обработка ошибок и повторы. При ошибке отправки статус фиксируется, и при наличии попыток задача ставится на повторную отправку; когда попытки исчерпаны — уведомление помечается как недоставленное.
- Обратная связь по доставке. Итоговый статус доставки принимается через callback и обновляет запись уведомления (доставлено / не доставлено).
- Наблюдаемость. На каждом значимом шаге событие фиксируется в подсистеме истории и мониторинга для последующего анализа.
Бизнес-результат
Внедрение PushService даёт прямой финансовый и несколько сопутствующих эффектов.
Экономия на SMS
Прямая экономия рассчитывается как объём SMS-трафика, замещённого push-уведомлениями, умноженный на стоимость SMS. Ниже — шаблон расчёта; итоговые цифры подставляются после получения базовых показателей.
| Показатель | Значение |
|---|---|
| Объём SMS-информирования | 500 000 сообщений/мес |
| Средняя стоимость SMS | 4 ₽ |
| Текущий бюджет SMS-канала | 2 000 000 ₽/мес |
| Доля трафика, замещаемая push | 50% (по подписанным пользователям) |
| Ожидаемая экономия | 1 000 000 ₽/мес · 12 000 000 ₽/год |
ПРИМЕЧАНИЕ: Методика оценки
Реалистичная оценка строится «снизу»: берётся не весь SMS-трафик, а только та его доля, которая приходится на пользователей с активной push-подпиской. По мере роста числа подписок доля замещения — а значит и экономия — увеличивается. Для чистой экономии из валовой вычитается стоимость владения сервисом.
Сопутствующие эффекты
| Эффект | В чём выражается |
|---|---|
| Скорость информирования | Мгновенная доставка без задержек операторских шлюзов |
| Независимость от операторов | Снижение зависимости от тарифов и доступности SMS-провайдеров |
| Богатый формат | Иконка, изображение, ссылка — выше вовлечённость по сравнению с текстом SMS |
| Контроль доставки | Статус по каждому уведомлению и обратная связь во внешние системы |
| Поддержка PWA-сценариев | Единый канал для веб- и установленных PWA-приложений |
| Основа для развития | Платформа для новых типов уведомлений без смены канала |