Skip to content

Модуль Notifications

Обзор

Модуль Notifications обрабатывает все исходящие коммуникации платформы IWM с пользователями. Он управляет множеством каналов доставки (email, SMS, push, in-app), пользовательскими настройками, рендерингом шаблонов, отслеживанием доставки и логикой повторных попыток. Модуль потребляет доменные события от других модулей и преобразует их в соответствующие уведомления.

Зоны ответственности

  • Многоканальная доставка уведомлений (email, SMS, push, in-app)
  • Управление пользовательскими настройками уведомлений
  • Динамический рендеринг шаблонов
  • Отслеживание доставки и логика повторных попыток
  • Триггеры уведомлений на основе событий
  • Ограничение частоты и троттлинг
  • История уведомлений и аудит

Обзор архитектуры


Каналы уведомлений

Email (SendGrid)

Основной канал для транзакционных и маркетинговых коммуникаций.

КонфигурацияЗначение
ПровайдерSendGrid
Адрес отправителяНастраивается для каждого типа уведомления
Лимит частоты100 писем/секунду
Попыток повтора3
Задержка повтораЭкспоненциальный откат

Поддерживаемые функции:

  • HTML и текстовые шаблоны
  • Динамическая персонализация контента
  • Вложения (PDF, изображения)
  • Отслеживание кликов и открытий
  • Ссылки отписки

SMS (Twilio)

Для срочных уведомлений и 2FA.

КонфигурацияЗначение
ПровайдерTwilio
Sender IDНастраивается
Лимит частоты10 SMS/секунду
Попыток повтора2
Макс. длина160 символов (или конкатенация)

Поддерживаемые функции:

  • Доставка внутри страны и международная
  • Подтверждения доставки
  • Коды 2FA
  • Короткие URL для ссылок

Push уведомления (Firebase FCM)

Push уведомления для мобильных и веб.

КонфигурацияЗначение
ПровайдерFirebase Cloud Messaging
ПлатформыiOS, Android, Web
TTL4 недели
ПриоритетHigh/Normal

Поддерживаемые функции:

  • Богатые уведомления (изображения, действия)
  • Рассылка по темам
  • Управление токенами устройств
  • Тихие уведомления

In-App уведомления

Уведомления в реальном времени внутри платформы.

КонфигурацияЗначение
ДоставкаWebSocket
ХранениеБаза данных
Срок хранения90 дней

Поддерживаемые функции:

  • Доставка в реальном времени
  • Статус прочитано/непрочитано
  • Кнопки действий
  • UI центра уведомлений

Триггеры событий

Какие события вызывают какие уведомления

Соответствие событий и уведомлений

СобытиеТип уведомленияКаналыПриоритет
UserRegisteredwelcome_emailEmailNormal
UserVerifiedaccount_activatedEmail, In-AppNormal
PasswordResetRequestedpassword_resetEmailHigh
TwoFactorEnabledsecurity_alertEmail, SMSHigh
LoginFromNewDevicesecurity_alertEmail, PushHigh
KycApprovedkyc_approvedEmail, In-AppNormal
KycRejectedkyc_rejectedEmail, In-AppNormal
PartnerRegisteredpartner_welcomeEmailNormal
NewReferralnew_referralEmail, Push, In-AppNormal
CommissionCalculatedcommission_pendingIn-AppLow
CommissionPaidcommission_paidEmail, In-AppNormal
PayoutRequestedpayout_requestedEmailNormal
PayoutCompletedpayout_completedEmail, SMS, In-AppHigh
PayoutRejectedpayout_rejectedEmail, In-AppHigh
RankChangedrank_changeEmail, Push, In-AppNormal
OrderCreatedorder_confirmationEmailHigh
OrderConfirmedorder_confirmedEmail, In-AppNormal
OrderShippedorder_shippedEmail, SMS, PushHigh
OrderDeliveredorder_deliveredEmail, PushNormal
PaymentFailedpayment_failedEmail, SMSHigh
RefundCompletedrefund_completedEmail, In-AppNormal
ParticipationActivatedinvestment_activatedEmail, In-AppHigh
ReturnsDistributedreturns_creditedEmail, In-AppNormal
InvestmentMaturedinvestment_maturedEmail, Push, In-AppHigh
CartAbandonedcart_abandonedEmailLow

Пользовательские настройки

Структура настроек

Пользователи могут настраивать предпочтения для каждого типа уведомления и канала:

json
{
  "user_id": "uuid",
  "preferences": {
    "order_confirmation": {
      "email": true,
      "sms": false,
      "push": true,
      "in_app": true
    },
    "commission_paid": {
      "email": true,
      "sms": false,
      "push": true,
      "in_app": true
    },
    "marketing": {
      "email": false,
      "sms": false,
      "push": false,
      "in_app": false
    }
  },
  "global_settings": {
    "quiet_hours": {
      "enabled": true,
      "start": "22:00",
      "end": "08:00",
      "timezone": "Europe/Moscow"
    },
    "language": "ru",
    "email_frequency": "immediate"
  }
}

Категории настроек

КатегорияУведомленияМожно отключить
Security2FA, сброс пароля, предупреждения безопасностиНет
TransactionalЗаказы, платежи, инвестицииНет (но можно выбрать каналы)
AccountKYC, обновления профиляНет (но можно выбрать каналы)
MLMКомиссии, выплаты, рангиДа
MarketingАкции, рассылкиДа

Процесс управления настройками


Система шаблонов

Структура шаблонов

Шаблоны определяются с переменными для динамического контента:

templates/
├── email/
│   ├── welcome_email/
│   │   ├── subject.txt
│   │   ├── body.html
│   │   └── body.txt
│   ├── order_confirmation/
│   │   ├── subject.txt
│   │   ├── body.html
│   │   └── body.txt
│   └── ...
├── sms/
│   ├── 2fa_code.txt
│   ├── order_shipped.txt
│   └── ...
├── push/
│   ├── new_referral.json
│   ├── commission_paid.json
│   └── ...
└── in_app/
    ├── commission_pending.json
    └── ...

Переменные шаблонов

Общие переменные, доступные во всех шаблонах:

ПеременнаяОписание
user.firstNameИмя пользователя
user.lastNameФамилия пользователя
user.emailEmail пользователя
platform.nameНазвание платформы
platform.supportEmailEmail поддержки
platform.baseUrlURL платформы

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

Примеры шаблонов

Email шаблон (order_confirmation/body.html):

html
<!DOCTYPE html>
<html>
<head>
    <title>Order Confirmation</title>
</head>
<body>
    <h1>Thank you for your order, {{user.firstName}}!</h1>

    <p>Your order <strong>#{{order.number}}</strong> has been received.</p>

    <h2>Order Details</h2>
    <table>
        {{#each order.items}}
        <tr>
            <td>{{this.name}}</td>
            <td>x{{this.quantity}}</td>
            <td>{{this.price}} {{../order.currency}}</td>
        </tr>
        {{/each}}
    </table>

    <p><strong>Total: {{order.total}} {{order.currency}}</strong></p>

    <p>
        <a href="{{platform.baseUrl}}/orders/{{order.id}}">
            View Order
        </a>
    </p>
</body>
</html>

SMS шаблон (order_shipped.txt):

Your order #{{order.number}} has been shipped!
Tracking: {{shipment.trackingNumber}}
Track: {{shipment.trackingUrl}}

Push шаблон (commission_paid.json):

json
{
  "title": "Commission Received!",
  "body": "You earned {{commission.amount}} {{commission.currency}} from {{commission.source}}",
  "icon": "commission_icon",
  "action_url": "/mlm/commissions/{{commission.id}}",
  "data": {
    "type": "commission_paid",
    "commission_id": "{{commission.id}}"
  }
}

Процесс рендеринга шаблонов


Отслеживание доставки

Поток статусов доставки

Запись лога уведомлений

ПолеТипОписание
idUUIDID записи лога
user_idUUIDЦелевой пользователь
notification_typeVARCHARИдентификатор типа
channelENUMEMAIL, SMS, PUSH, IN_APP
statusENUMСтатус доставки
provider_referenceVARCHARВнешний ID сообщения
sent_atTIMESTAMPВремя отправки
delivered_atTIMESTAMPПодтверждение доставки
failed_atTIMESTAMPВремя неудачи
failure_reasonTEXTДетали ошибки
retry_countINTКоличество попыток
payloadJSONBОтрендеренный контент

Логика повторных попыток

Расписание повторов:

ПопыткаЗадержка
1-й повтор1 минута
2-й повтор5 минут
3-й повтор15 минут
После 3-гоПомечается как неудачное

Типы уведомлений по модулям

Уведомления аутентификации

ТипОписаниеКаналы
welcome_emailРегистрация нового пользователяEmail
email_verificationСсылка подтверждения emailEmail
password_resetСсылка сброса пароляEmail
password_changedПодтверждение смены пароляEmail
2fa_codeКод двухфакторной аутентификацииSMS, Email
2fa_enabledПодтверждение активации 2FAEmail
2fa_disabledПредупреждение о деактивации 2FAEmail
login_new_deviceВход с нового устройстваEmail, Push
account_lockedПредупреждение о блокировке аккаунтаEmail
account_unlockedАккаунт разблокированEmail

Уведомления KYC

ТипОписаниеКаналы
kyc_submittedПодтверждение подачи KYCEmail, In-App
kyc_under_reviewKYC на проверкеEmail, In-App
kyc_approvedKYC одобренEmail, In-App
kyc_rejectedKYC отклонен с причинойEmail, In-App
kyc_needs_infoЗапрошена дополнительная информацияEmail, In-App
kyc_expiringПредупреждение об истечении KYCEmail

Уведомления заказов

ТипОписаниеКаналы
order_confirmationЗаказ размещенEmail
order_confirmedПлатеж подтвержденEmail, In-App
order_processingЗаказ готовитсяIn-App
order_shippedЗаказ отправлен с трекингомEmail, SMS, Push
order_out_for_deliveryНа доставкеPush
order_deliveredЗаказ доставленEmail, Push
order_cancelledЗаказ отмененEmail, In-App
payment_failedПлатеж не прошелEmail, SMS
payment_retryНапоминание о повторном платежеEmail
refund_initiatedРефанд начатEmail, In-App
refund_completedРефанд обработанEmail, In-App

Уведомления MLM комиссий

ТипОписаниеКаналы
commission_pendingКомиссия рассчитанаIn-App
commission_approvedКомиссия одобренаEmail, In-App
commission_paidКомиссия зачисленаEmail, Push, In-App
commission_reversedКомиссия отмененаEmail, In-App
weekly_earningsЕженедельная сводка заработкаEmail
monthly_earningsЕжемесячный отчет о доходахEmail

Уведомления MLM выплат

ТипОписаниеКаналы
payout_requestedЗапрос на выплату поданEmail
payout_approvedВыплата одобренаEmail, In-App
payout_processingВыплата обрабатываетсяIn-App
payout_completedВыплата отправленаEmail, SMS, In-App
payout_rejectedВыплата отклоненаEmail, In-App

Уведомления MLM рангов

ТипОписаниеКаналы
rank_promotionРанг повышенEmail, Push, In-App
rank_demotion_warningПредупреждение о пониженииEmail, In-App
rank_demotedРанг пониженEmail, In-App
rank_qualification_progressОбновление прогрессаIn-App

Уведомления MLM рефералов

ТипОписаниеКаналы
new_referralРегистрация нового рефералаEmail, Push, In-App
referral_activatedРеферал сделал первую покупкуPush, In-App
team_member_achievementДостижение члена командыIn-App

Уведомления инвестиций

ТипОписаниеКаналы
investment_submittedУчастие поданоEmail
investment_approvedИнвестиция одобренаEmail, In-App
investment_activatedИнвестиция активнаEmail, Push, In-App
investment_rejectedИнвестиция отклоненаEmail, In-App
returns_distributedДоходность зачисленаEmail, In-App
investment_maturedИнвестиция погашенаEmail, Push, In-App
withdrawal_requestedВывод запрошенEmail
withdrawal_completedВывод обработанEmail, SMS, In-App
portfolio_updateЕжемесячная сводка портфеляEmail

Ограничение частоты и троттлинг

Лимиты по каналам

КаналЛимит на пользователяГлобальный лимит
Email20/час100/секунду
SMS5/час10/секунду
Push50/час1000/секунду
In-AppБез лимитаN/A

Тихие часы

Пользователи могут настроить тихие часы:

  • Уведомления откладываются во время тихих часов
  • Доставляются по окончании тихих часов
  • Уведомления безопасности игнорируют тихие часы

Группировка уведомлений

Низкоприоритетные уведомления могут группироваться:

  • Уведомления об ожидающих комиссиях
  • Обновления активности in-app
  • Маркетинговые коммуникации

Бизнес-правила и инварианты

Правила доставки

  1. Уведомления безопасности нельзя отключить
  2. У пользователя должен быть верифицированный канал для получения уведомлений
  3. Неудачные доставки повторяются до 3 раз
  4. Тихие часы соблюдаются, кроме предупреждений безопасности
  5. Лимиты частоты применяются на пользователя и глобально

Правила настроек

  1. Новые пользователи получают все уведомления включенными по умолчанию
  2. Маркетинг отключен по умолчанию (opt-in)
  3. Хотя бы один канал должен быть включен для транзакционных
  4. Настройки хранятся для каждого типа уведомления

Правила шаблонов

  1. Все шаблоны должны иметь резервную локаль
  2. Переменные должны быть санитизированы перед рендерингом
  3. URL должны быть абсолютными и использовать HTTPS
  4. Чувствительные данные не логируются в записях доставки

Точки интеграции

Потребляет от других модулей

СобытиеИсточникТип уведомления
UserRegisteredCorewelcome_email
UserVerifiedCoreaccount_activated
PasswordResetRequestedCorepassword_reset
TwoFactorEnabledCore2fa_enabled
KycStatusChangedCorekyc_*
OrderCreatedCommerceorder_confirmation
OrderShippedCommerceorder_shipped
PaymentReceivedCommerceorder_confirmed
PaymentFailedCommercepayment_failed
CommissionPaidMLMcommission_paid
PayoutCompletedMLMpayout_completed
RankChangedMLMrank_*
NewReferralMLMnew_referral
ParticipationActivatedInvestmentinvestment_activated
ReturnsDistributedInvestmentreturns_distributed
InvestmentMaturedInvestmentinvestment_matured

Предоставляет другим модулям

ИнтерфейсНазначение
INotificationServiceОтправка произвольных уведомлений
IPreferenceServiceПроверка/обновление настроек пользователя

Связанные документы