Распродажа закончилась в 20:00, а клиент увидел push в 21:30, когда телефон вернулся в сеть. По нажатию открылась страница с обычной ценой. Маркетолог отправил сообщение вовремя, но не ограничил, сколько оно может ждать доставки.

TTL, или time to live, — срок жизни сообщения в очереди доставки. Для промо он должен быть связан с моментом, когда предложение перестаёт действовать. Отдельно существует срок актуальности содержания в приложении: уже доставленное уведомление тоже может быть открыто позднее.

Разделите четыре момента

В цепочке есть создание задания в CRM, передача провайдеру, доставка на устройство и действие человека. Между ними возможны задержки. Успешный ответ провайдера подтверждает приём, но не обязательно доставку и тем более прочтение.

FCM, сервис доставки push от Google, позволяет задавать срок хранения и попыток доставки для Android и Web. Без явного значения сообщения могут сохраняться до четырёх недель; нулевой TTL означает отказ от хранения, если немедленная доставка невозможна. Для iOS используется соответствующая настройка APNs, сервиса push Apple, включая apns-expiration.

Эти параметры управляют доставкой. Они не гарантируют автоматическое исчезновение уже показанного уведомления из центра уведомлений телефона.

Передавайте абсолютный срок предложения

В событии кампании полезно хранить expires_at — конкретный момент окончания предложения с однозначной временной зоной. Перед каждой попыткой отправки система вычисляет оставшийся срок и решает, есть ли ещё смысл передавать сообщение.

Если осталось слишком мало времени для полезного действия, можно отменить отправку раньше формального окончания. Такой запас является бизнес-правилом: например, предложение требует нескольких минут на оформление. Его нужно определить явно, а не прятать внутри интеграции.

УчастокКакая проверка нужнаЧто фиксировать
Очередь CRMПредложение ещё актуальноВремя и причина допуска
Передача провайдеруTTL не длиннее допустимого остаткаПараметры запроса
Повторная попыткаОстаток пересчитан зановоСвязь с исходным заданием
Обработка в приложенииСодержание не устарелоДоступный способ подавления или замены
Открытие ссылкиУсловия ещё действуютПонятный результат для клиента

Условный пример: повтор не должен продлевать акцию

Акция заканчивается в 20:00 UTC. Первая передача происходит в 19:40; максимальный остаток — 20 минут, или 1200 секунд. При повторной попытке в 19:55 остаётся пять минут, то есть 300 секунд.

Если интеграция снова задаст 1200 секунд, срок ожидания выйдет за пределы акции. Поэтому повтор использует исходный expires_at и заново рассчитывает остаток. В 20:00 и позже новое промосообщение уже не передаётся.

Числа условные. Реальная настройка также учитывает возможности канала, допустимый запас на обработку и синхронизацию часов. Значение TTL=0 не означает «показывать только сейчас и затем удалить с экрана» — оно касается хранения до доставки.

Учитывайте тихие часы и повторные очереди

Если сообщение перенесено из-за тихих часов, срок предложения не должен сдвигаться вместе с ним. Сначала выбирается допустимое время, затем проверяется остаточная полезность. Иначе утреннее уведомление будет рекламировать вчерашнюю скидку.

Проверьте все очереди: CRM, интеграционный сервис и провайдера. Ограничение только последнего участка не отменяет задание, которое сутки ждало до обращения к нему. Полезно передавать один исходный срок по всей цепочке.

Механизм объединения ожидающих push, иногда называемый collapse, решает другую задачу — замещение части сообщений. Он не заменяет проверку актуальности предложения и может иметь разные правила на платформах.

Подготовьте правильный экран после открытия

Deep link ведёт сразу к нужному содержимому приложения. Если акция закончилась, ссылка должна открыть понятное состояние: предложение завершено, вот текущие условия или доступная альтернатива. Не показывайте молча другую цену так, будто обещанной скидки не было.

Для сообщений с ограниченным сроком приложение и сервер должны проверять актуальность независимо от текста push. Клиент может сохранить уведомление и открыть его завтра. Права на предложение и цена также проверяются на сервере: параметр ссылки не является разрешением купить по любым условиям.

Испытания перед запуском

Проверьте устройство онлайн, офлайн до окончания, офлайн после окончания, повторную передачу, позднее нажатие и старую версию приложения. Укажите тип сообщения: часть уведомлений отображает сама система, и приложение не всегда может перехватить показ одинаковым способом.

В тестовом отчёте различайте «не передано», «принято провайдером», «не доставлено из-за истечения» и «открыто после окончания». Не все платформы дают полное подтверждение каждого этапа; отсутствие события не следует выдавать за доказанную недоставку.

Рабочая схема защищает два обещания: не доставлять заведомо устаревшую рекламу и корректно обработать позднее действие человека. Одного короткого TTL для этого недостаточно, но без него очередь способна жить дольше самого предложения.

Источники

Google Firebase. Set the lifespan of a message. Firebase Cloud Messaging Documentation. Проверено 22.09.2026.