Після реалізації нотифікацій дуже легко перейти до наступної ідеї: "давайте додамо аналітику".
Проблема починається тоді, коли під словом "аналітика" зберігають один загальний статус і намагаються зробити з нього висновок про поведінку користувача.
Насправді доставка, прочитання і реакція відповідають на три різні питання:
- чи дійшла нотифікація до користувача;
- чи побачив він її;
- чи зробив щось після цього.
Доставка відповідає лише на питання, чи нотифікація була доставлена
Сигнал доставки належить до технічного рівня.
Він може означати, що повідомлення:
- успішно записане в базу;
- передане через WebSocket;
- відправлене через push-провайдера;
- прийняте зовнішнім транспортом.
Але навіть успішна доставка нічого не доводить про те, чи користувач звернув на нотифікацію увагу.
Прочитання - це окремий сигнал фактичного перегляду
Прочитання вже ближче до поведінки користувача, але й тут важливо правильно визначити момент.
Чи вважаємо нотифікацію прочитаною, коли відкрилася панель? Коли елемент потрапив у видиму частину списку? Коли користувач натиснув на конкретну нотифікацію?
Це продуктове рішення, і його треба визначити до того, як починати рахувати частку прочитаних нотифікацій.
delivered_atread_atРеакція - це вже відповідь на зміст нотифікації
Третій рівень - дія після прочитання.
Це може бути:
- перехід за посиланням;
- відкриття сутності, про яку повідомляла нотифікація;
- підтвердження або відхилення;
- відповідь;
- інша бізнесова дія.
Саме тут починається відповідь на питання, чи була нотифікація корисною для користувача або для процесу.
Один статус notification_status швидко стає слабкою моделлю
sentdeliveredreadclickedactedТакий перелік статусів припускає, що нотифікація проходить одну лінійну послідовність.
Але в реальності події можуть бути незалежними. Наприклад, користувач може перейти до потрібної сторінки іншим шляхом, не відкриваючи панель нотифікацій. Або нотифікація може бути прочитана без жодної реакції.
Тому часові мітки або окремі події часто краще описують реальність, ніж один "найвищий" статус.
Що справді варто зберігати
notification_iduser_idcreated_atdelivered_atread_at optional:action_typeaction_atchannelsource_contextБазові часові мітки дають достатньо інформації для більшості корисних питань:
- скільки нотифікацій реально доставляється;
- скільки з них читають;
- скільки часу проходить до прочитання;
- які типи нотифікацій частіше ігнорують.
Дії після нотифікації варто зберігати лише тоді, коли для них є чітке продуктове значення.
Які показники легко стають красивими, але малокорисними цифрами
Велика кількість delivered notifications сама по собі майже нічого не говорить про якість системи.
Так само "90% read" може виглядати чудово, але бути мало корисним, якщо всі нотифікації автоматично позначаються прочитаними при відкритті панелі.
Показник стає малокорисним, коли він:
- гарно росте;
- легко показується на панелі аналітики;
- але не допомагає прийняти рішення або покращити продукт.
Краще починати не з метрик, а з питань
Замість "що ще можна порахувати?" корисніше спочатку визначити, яке рішення має підтримати аналітика.
Наприклад:
- чи користувачі взагалі помічають критичні нотифікації;
- які типи повідомлень читають занадто пізно;
- чи певна нотифікація реально приводить до потрібної дії;
- чи система надсилає забагато шуму.
Після цього значно простіше зрозуміти, які події треба зберігати.
Частка прочитаних нотифікацій має сенс тільки після чіткого визначення прочитання
read_rate = notifications_with_read_at / delivered_notificationsЯкщо поняття "прочитано" зміниться між версіями продукту, історичні дані перестануть бути прямо порівнюваними.
Тому визначення події - це частина аналітичного контракту, а не просто деталь реалізації.
Реакцію краще не робити універсальним полем
Слово "reaction" звучить зручно, але різні нотифікації мають різну ціль.
Для однієї це перехід до повідомлення. Для іншої - підтвердження операції. Для третьої - відкриття документа.
Тому краще зберігати конкретну дію або пов’язувати нотифікацію з бізнесовою подією, ніж просто ставити reacted = true.
Не дублюйте бізнесову подію тільки заради аналітики нотифікацій
Якщо в системі вже є достовірна подія "order_approved" або "message_replied", не обов’язково створювати ще одну копію тієї самої дії лише в таблиці аналітики нотифікацій.
Краще мати зв’язок між нотифікацією і реальною бізнесовою дією, якщо такий зв’язок потрібен для аналізу.
Так аналітика не стає другим джерелом правди про те, що відбулося в продукті.
Канал варто зберігати тільки якщо він впливає на рішення
Якщо одна нотифікація може прийти у застосунку, через email або push-сповіщення, канал іноді корисно зберігати окремо.
Але лише тоді, коли команда реально порівнюватиме ефективність каналів або налаштовуватиме їхню поведінку.
Якщо поле існує тільки тому, що "може колись знадобитися", воно швидко перетворюється на зайвий вимір без продуктового використання.
Практична модель подій
notification.creatednotification.deliverednotification.read business action:order.approvedmessage.replieddocument.openedТака модель дає змогу аналізувати нотифікації без того, щоб перетворювати їх на центр усієї продуктової аналітики.
Нотифікаційна система відповідає за власні факти, а бізнесовий модуль - за реальну дію користувача.
Що варто перевірити тестами
1. Delivery does not set read_at.2. Read does not require a business action.3. Repeated read events are idempotent.4. delivered_at is not rewritten on duplicate delivery.5. Business action is stored by its own domain.6. Analytics can join notification and business action when needed.7. Read-rate calculation uses delivered notifications as denominator.8. Historical events keep stable semantics.Хороша аналітика нотифікацій починається з чітких меж
Доставка показує, що спрацював транспорт. Прочитання показує, що користувач побачив нотифікацію. Реакція або бізнесова дія показує, що сталося після цього.
Ці сигнали пов’язані, але не взаємозамінні.
Зберігати варто не все, що можна порахувати, а те, що допомагає відповісти на конкретне продуктове питання або прийняти рішення.
Найкорисніша метрика нотифікації - не та, яку легко порахувати, а та, після якої зрозуміло, що саме потрібно змінити в продукті.



