Центр уведомлений в приложении: события, чтение и действия
Как спроектировать центр уведомлений продукта: история, счётчик, несколько устройств, права, устаревшие действия и отдельные каналы доставки.
Автор: Александр Поркулевич, CEO и основатель, 404gen.
Центр уведомлений в приложении хранит сообщения о событиях, которые важны пользователю: ответ на обращение, изменение заказа, приглашение в проект или необходимость согласовать документ. Его задача — помочь понять, что произошло и требуется ли действие. Значок с числом непрочитанного сам по себе эту задачу не решает: он только сообщает, что где-то накопились записи.
Материал предназначен продуктовой команде SaaS, личного кабинета или корпоративного приложения. Речь идёт о собственной ленте внутри продукта, а не о системном центре уведомлений телефона. Push, письмо и сообщение в мессенджере рассматриваются как отдельные каналы доставки. Учебные примеры помогают определить требования к разработке, без обещаний повысить вовлечённость на выдуманный процент.
Чем центр уведомлений отличается от push
Лента существует в продукте и может хранить историю независимо от внешнего транспорта. Push — способ привлечь внимание за пределами текущего экрана. Пользователь способен запретить системные уведомления и при этом продолжать получать сообщения внутри кабинета. Поэтому отказ от одного канала не должен автоматически стирать запись о важном изменении продукта.
Документация MDN по Notifications API описывает системные уведомления браузера и необходимость разрешения пользователя. Это отдельный механизм по отношению к собственному списку записей в базе приложения. Не следует строить историю кабинета на предположении, что внешний баннер всегда был показан и прочитан.
Сначала определите, какие события заслуживают постоянной карточки, а какие достаточно показать кратким сообщением на текущем экране. Подтверждение сохранения формы обычно связано с только что выполненным действием. Изменение чужим сотрудником важного документа может потребовать истории. Если сохранять всё подряд, действительно нужные сообщения утонут в технических подтверждениях.
Событие, уведомление и действие пользователя
Бизнес-событие описывает факт: документ изменился или заявка получила ответ. Уведомление — представление этого факта для конкретного получателя. Действие пользователя — результат работы с предметом: открыть, ответить, подтвердить или отклонить. Эти объекты не стоит объединять в один статус, иначе «прочитано» начнёт ошибочно означать «согласовано».
У события может быть несколько получателей с разными правами. Один видит подробности, другому разрешено только знание о необходимости действия. Текст составляется с учётом получателя и текущего доступа. Массовая отправка одинаковой карточки всем участникам организации способна раскрыть сведения, которых они не должны видеть.
Сохраняйте связь уведомления с предметом события. Переход ведёт к актуальной карточке и объясняет изменение. Если документ удалён или доступ отозван, пользователь получает понятный результат вместо бесконечной ошибки. Знание старой ссылки не должно восстанавливать прежние полномочия. Текст истории тоже проверяется на допустимость раскрытия после изменения роли.
Минимальная модель данных
| Объект | Содержание | Почему нужен отдельно |
|---|---|---|
| Событие | Тип, предмет, автор, время и версия бизнес-факта | Позволяет связать разные представления с одним основанием |
| Получатель | Пользователь, организация, применённые условия видимости | Не смешивает историю разных людей и компаний |
| Карточка | Заголовок, краткое объяснение, переход и тип действия | Делает событие понятным в контексте продукта |
| Состояние чтения | Открытие или явная отметка с согласованным смыслом | Не подменяет выполнение бизнес-задачи |
| Попытка доставки | Канал, результат отправки, внешний идентификатор | Отделяет техническую доставку от пользовательского результата |
| Настройка | Выбранные типы, каналы и разрешённые исключения | Позволяет управлять шумом без скрытого изменения событий |
Для времени сохраняйте момент события и момент доставки. Внешнее сообщение может прийти позднее, а серия событий — обработаться не по порядку. Лента должна использовать определённое правило сортировки и устойчивый идентификатор. При подгрузке страниц новые записи не должны заставлять пользователя пропускать старые или видеть одни и те же карточки несколько раз.
Как спроектировать содержание карточки
Хорошая карточка отвечает на три вопроса: что произошло, с чем это связано и что можно сделать. Заголовок «Уведомление» не даёт ориентира, а технический код статуса понятен только разработчику. Укажите предмет и изменение человеческими словами. Детали можно открыть по переходу, не копируя весь документ в список.
Если нужно действие, назовите его явно: посмотреть ответ, выбрать вариант или открыть документ для решения. Не помещайте критическое подтверждение в крошечную иконку рядом с отметкой прочтения. Для необратимого шага пользователь должен увидеть актуальный предмет и последствия. Уведомление является входом в рабочий процесс, а не обходом его проверок.
Состояния «нет новых сообщений», «список ещё загружается» и «не удалось получить данные» различаются. Пустой экран при сетевой ошибке выглядит как отсутствие событий. Сохранённая старая лента может быть полезна, если явно обозначено время обновления. Для доступности динамических сообщений используйте подходящие механизмы; W3C о status messages объясняет требования к сообщению об изменениях без обязательного переноса фокуса.
Сценарии, которые обнаруживают слабую модель
Человек открыл кабинет на двух устройствах
Уведомление прочитано в браузере, а приложение на телефоне ещё показывает прежний счётчик. Состояние чтения должно иметь ведущий серверный источник, если продукт обещает синхронизацию. Локальная отметка нужна для отзывчивости, но после обмена устройства сходятся к одному согласованному результату.
Откройте две сессии, отметьте карточку в первой и обновите список во второй. Проверьте отдельно саму запись, фильтр непрочитанных и общий счётчик. Повтор команды не должен уменьшать счётчик ещё раз. Если устройство было без сети, после восстановления оно отправляет допустимое изменение и получает актуальную историю.
Новое сообщение появилось во время отметки «прочитать всё»
Команда должна иметь определённую границу: например, набор уже показанных записей или момент последней известной позиции. Иначе новое важное сообщение может незаметно стать прочитанным до первого показа. Пользователь ожидает работу с тем списком, который видел, а не с любым будущим событием.
Запустите команду и одновременно создайте новую запись. Новое событие должно сохранить ожидаемое состояние согласно выбранному правилу. Повторите тест при подгруженной только части списка. Надпись на кнопке должна соответствовать реальному охвату: видимые сообщения и весь архив пользователя — разные действия.
Документ уже согласовал другой сотрудник
Карточка ещё приглашает принять решение, но предмет уже изменился. При переходе показывайте актуальный результат и объясняйте, почему прежнее действие больше не требуется. Сервер не должен выполнять устаревшую команду только потому, что уведомление было отправлено в момент, когда действие допускалось.
Создайте запрос на согласование, завершите его другой ролью и откройте старую карточку. Ожидается переход к текущему состоянию с историей, а не второе согласование. При действии прямо из списка также выполняется проверка версии и прав. Устаревший текст можно дополнить состоянием, сохранив исходный факт события.
Доступ к организации отозвали
История уведомлений может содержать названия документов и участников. Решите, какие сведения допустимо оставлять после отзыва членства. Ссылка на объект в любом случае проверяет действующие права. Скрытие рабочего пространства в меню не закрывает старую карточку, внешний deep link или вложение в письме.
Отзовите доступ и проверьте список, поиск, прямой запрос к записи и переход по ранее сохранённой ссылке. Если продукт показывает обезличенную историческую отметку, она не должна раскрывать содержимое закрытого документа. Текущая сессия получает новое состояние полномочий без необходимости надеяться на ручной выход пользователя.
Одно событие доставлено несколько раз
Обработчик очереди может повторить событие после потери ответа. Уведомление для конкретного получателя связывается с устойчивым ключом. Транспортный повтор не должен создавать несколько одинаковых карточек и новые непрочитанные элементы. При этом два реальных изменения одного документа могут заслуживать разные записи.
Передайте один идентификатор события повторно и сравните число карточек. Затем создайте новое изменение того же предмета. Оно проходит независимо или объединяется по согласованному правилу группировки. Проверяйте не только текст: совпадающая формулировка не доказывает, что это один бизнес-факт.
За короткое время пришла серия изменений
Несколько событий можно сгруппировать, если при этом сохраняется понятный смысл и доступ к деталям. Например, показывать одну сводку изменений обсуждения, а не десятки почти одинаковых строк. Но объединение не должно скрывать отдельные требующие решения задачи. Группировка по одному предмету подходит не каждому типу события.
Подготовьте серию комментариев и отдельное изменение, требующее подтверждения. В итоговой ленте должно быть ясно, где сводка, а где самостоятельное действие. Проверьте счётчик: он считает карточки, непрочитанные события или задачи — нужно выбрать одно определение и последовательно использовать его во всём продукте.
Пользователь отключил письма, но оставил ленту
Настройки применяются по типу события и каналу. Отказ от электронной почты не должен выключать внутреннюю запись, если пользователь этого не выбирал. Обязательные по вашему процессу сообщения выделяются отдельной понятной категорией, а не прячутся за неработающим переключателем. Правила коммуникаций согласовываются с владельцем продукта.
Выключите один канал, создайте несколько типов событий и проверьте фактические попытки доставки. Лента остаётся доступной по выбранным условиям. Сохранение настройки должно иметь подтверждённый результат, а последующее открытие показывать действующее значение. Нельзя обещать отключение, если фоновый обработчик продолжает использовать старую копию.
Ссылка открылась после долгого перерыва
Пользователь нажал письмо, когда сессия уже завершилась. После входа продукт должен вернуть его к разрешённому предмету, а не отправить на главную с потерянным контекстом. Сам адрес перехода проверяется, чтобы не позволять перенаправление на произвольный внешний ресурс. Отсутствующий объект получает объяснение и доступный следующий шаг.
Пройдите путь с активной сессией, после выхода и под другим пользователем. Чужой аккаунт не должен видеть содержимое по знанию ссылки. Если действие просрочено, интерфейс сообщает об этом, а не выполняет его повторно. Переход на мобильном устройстве также проверяется отдельно для браузера и установленного приложения.
Внешний канал временно недоступен
Сохранённая карточка продолжает существовать, даже если письмо не отправлено. Попытки доставки имеют собственные состояния и управляемые повторы. При восстановлении канала нужно решить, какие старые сообщения всё ещё полезны. Автоматически отправить накопившуюся устаревшую просьбу о давно выполненном действии — плохой результат восстановления.
Остановите тестовый транспорт, создайте событие, завершите связанное действие и включите доставку. Ожидаемый вариант определяется типом: отменить устаревшую отправку, заменить сводкой или сообщить актуальное состояние. Внутренний журнал хранит причину такого решения. Число попыток не должно попадать в продуктовый отчёт как число пользовательских контактов.
В ленте накопился большой архив
Список требует пагинации, фильтров и устойчивого порядка. Полная загрузка истории при каждом открытии замедлит первый экран и затруднит работу на телефоне. Счётчик новых записей не должен вычисляться путём скачивания всего архива. Область поиска и политика хранения определяются отдельно для типов событий.
Проверьте перелистывание при появлении новых событий, удаление разрешённой части архива и возврат к прежнему месту. Пользователь не теряет записи между страницами и не получает бесконечные повторы. Для важных деловых фактов лента не должна быть единственным архивом: история предмета хранится в его рабочем контуре.
Приоритет, шум и рабочие привычки
Приоритет определяется последствиями и требуемым действием. Не назначайте всем сообщениям красный цвет только ради открытия. Если каждый комментарий выглядит срочным, пользователь перестаёт различать действительно важное. Можно отделить действия, информационные обновления и служебные предупреждения, сохраняя понятные фильтры и доступ к общей истории.
Обсудите с представителями каждой роли, какие события им нужны и в какой момент. Менеджеру важен ответ клиента, исполнителю — изменение задачи, администратору — проблема доступа. Рассылка всем участникам «на всякий случай» повышает шум и риск ненужного раскрытия. Настройки по умолчанию должны соответствовать роли, оставаясь объяснимыми и управляемыми.
Тихие часы и пакетная сводка могут быть полезны для внешних каналов, но не должны откладывать сохранение факта в продукте. Требующее срочного действия сообщение нуждается в отдельной политике. Не стоит обещать одинаковую мгновенную доставку независимо от устройства, канала и пользовательских разрешений.
Какие показатели проверять
Отделяйте созданное событие, сформированную карточку, попытку внешней отправки, переход и выполненное действие. Это последовательность разных наблюдений. Высокое число открытий может означать как полезную коммуникацию, так и непонятный текст, заставляющий лишний раз заходить в карточку. Продуктовый результат измеряется по задаче, ради которой уведомление появилось.
Для требующих решения сообщений смотрите долю выполненных действий и время до результата в сопоставимых условиях. Для информационных — обратную связь о полезности и объём отключений. Отдельно анализируйте дубли, устаревшие ссылки, ошибки доступа и расхождение счётчиков. Не превращайте непрочитанное в оценку качества работы сотрудника без учёта его реальных задач.
План первой реализации
Отдельная проверка — входящий текст пользователя. Имя документа и комментарий могут содержать неожиданные символы или слишком длинные фразы. Лента должна безопасно выводить их как содержание, не исполняя разметку. Проверяйте обрезку, переносы и доступное полное название: визуально одинаковые сокращения не должны заставлять человека выбирать действие наугад.
Выберите несколько типов событий, которые имеют понятный предмет и следующий шаг. Сделайте серверную историю, состояния чтения и надёжный переход. Затем добавьте один внешний канал и проверьте его независимо. Конструктор сложных правил, рекомендательные приоритеты и несколько транспортов можно отложить до наблюдения за реальным шумом.
Подготовьте карту «событие — получатель — текст — действие — срок актуальности». Для каждого типа укажите, что делать после изменения предмета и отзыва доступа. Эта карта становится контрактом между продуктом, дизайном и разработкой. Она также помогает заранее найти случаи, где вместо уведомления нужна полноценная задача с ответственным.
Частые вопросы
Прочитанное уведомление означает выполненную задачу?
Нет. Чтение говорит о взаимодействии с сообщением по определённому правилу продукта. Выполнение подтверждается действием над предметом: ответом, решением или другим бизнес-событием. Эти состояния нужно хранить раздельно. Иначе пользователь, который просто открыл карточку, может ошибочно считаться завершившим обязательную работу.
Нужны ли одинаковые сообщения во всех каналах?
Не обязательно. Внешнему баннеру подходит короткий безопасный текст, а внутри кабинета можно показать больше разрешённых подробностей. Все представления должны ссылаться на один понятный предмет. При этом доставка в одном канале не доказывает чтение в другом, а запрет push не должен стирать внутреннюю историю.
Можно ли показывать только счётчик без списка?
Для узкой задачи это возможно, но человеку всё равно нужен способ понять, что изменилось. Счётчик без расшифровки быстро теряет полезность, особенно если его нельзя привести к нулю понятным действием. Определите, что именно он считает и где находятся соответствующие предметы или сообщения.
Как избежать повторных карточек?
Свяжите событие и получателя с устойчивым идентификатором, а повторы обработки делайте безопасными. Не используйте совпадение текста как единственный критерий. Для серии похожих событий можно согласовать группировку, но она должна сохранять отдельные требующие решения действия и понятный доступ к деталям истории.
Что передать разработчику?
Нужны реальные типы событий без персональных данных, роли получателей, требуемые действия, каналы и политика актуальности. Добавьте сценарии нескольких устройств, отзыва доступа и задержки доставки. Такая спецификация позволяет оценить продуктовый модуль точнее, чем просьба «сделать колокольчик как в известном приложении».
Связать уведомления с задачами продукта
Центр уведомлений приносит пользу, когда каждое сообщение объясняет событие и ведёт к допустимому действию. Начните с карты событий и проверки самых важных переходов. После этого проектируйте внешний вид, группировку и дополнительные каналы, сохраняя отдельные подтверждения доставки и результата.
404gen разрабатывает веб-приложения и SaaS с собственными пользовательскими сценариями. Вопрос внешнего транспорта подробнее разобран в статье о push-уведомлениях, а переход в нужное место — в материале про deep link. Эти механизмы дополняют ленту, но не заменяют её модель данных.
404gen — креативное digital-агентство полного цикла, работаем удалённо по всей России.
Телефон: +7 993 729-59-59 (пн–пт, 10:00–19:00 МСК). WhatsApp: +7 913 141-20-96. Telegram: @aporkulevich. Почта: ap@404gen.ru.