Уведомления
Minishop отправляет уведомления в Telegram и на email. Telegram-канал означает личные сообщения пользователю с подтверждённой Telegram-привязкой, администраторам с ролью аккаунта или сообщения в LOG_CHAT_ID — зависит от события. Email работает при настроенном SMTP и наличии адреса у получателя.
Для автоматических пользовательских строк каналы настраиваются в Система -> Настройки -> Уведомления -> Доставка пользователям. У каждой категории есть отдельные флажки Telegram и email. Два выключенных флажка полностью запрещают уведомления этой категории.
Переключатель резервного канала разрешает доставку через единственный привязанный канал, когда выбранный канал пользователю недоступен. Например, email-only пользователь получит письмо при выбранном только Telegram. Если выбранный канал доступен, выключенный канал не используется. Временный сбой отправки также не включает резервный канал.
Заблокированным пользователям автоматические уведомления не отправляются ни в Telegram, ни по email, в том числе через резервный канал. Пропуск не записывается как успешная доставка.
Все HTML-письма используют общий email-шаблон с брендом из Web App: заголовком, accent-цветом и логотипом. Логотип, загруженный через раздел Внешний вид, отправляется как inline image, а публичный HTTPS-логотип остается внешней картинкой.
Сводная таблица
Заголовок раздела «Сводная таблица»| Событие | Получатель | Telegram | Условия и ограничения | |
|---|---|---|---|---|
| Код входа по email и magic link | Пользователь | - | ✓ | Нужны SMTP_* и EMAIL_* настройки. Magic link также требует корректный SUBSCRIPTION_MINI_APP_URL. |
| Код установки или смены пароля | Пользователь | - | ✓ | Нужны SMTP_* и EMAIL_* настройки. |
| Успешная оплата подписки | Пользователь | ✓ | ✓ | Для subscription; email отправляется, если SMTP настроен и у пользователя есть email. |
| Покупка подарочной подписки | Покупатель / админский лог-чат | ✓ | - | Покупателю передаётся ссылка, в LOG_CHAT_ID — пометка подарка и номер платежа. Ссылка также сохраняется в «Бонусах». |
| Доставка подарка | Указанный покупателем email | - | ✓ | По выбору покупателя, через SMTP worker с ограниченными повторами. Ошибка доставки не отменяет подарок. Подробнее: подарочные подписки. |
| Успешная покупка отдельного пакета трафика | Пользователь | ✓ | ✓ | Для traffic / traffic_package; email отправляется, если SMTP настроен и у пользователя есть email. |
| Успешная докупка обычного трафика к тарифу | Пользователь | ✓ | ✓ | Для topup; email отправляется, если SMTP настроен и у пользователя есть email. |
| Успешная покупка premium-трафика | Пользователь | ✓ | ✓ | Для premium_topup; email отправляется, если SMTP настроен и у пользователя есть email. |
| Успешная покупка HWID-устройств | Пользователь | ✓ | ✓ | Отправляется после отдельной оплаты hwid_devices; при продлении устройств вместе с подпиской добавляется примечание к уведомлению об успешной оплате подписки. Email отправляется, если SMTP настроен и у пользователя есть email. |
| Подключено новое HWID-устройство | Пользователь | ✓ | ✓ | Требует подписанный webhook user_hwid_devices.added из Remnawave 2.8.1+; исходный HWID, IP и User-Agent не сохраняются и не показываются. |
| Исчерпан лимит HWID-устройств | Пользователь | ✓ | ✓ | Отправляется вместе с событием нового устройства, когда число устройств достигло конечного лимита. Предложение докупить места показывается только для активного тарифа с доступными HWID-пакетами. |
| Платное повышение тарифа | Пользователь | ✓ | ✓ | Для tariff_upgrade; email отправляется, если SMTP настроен и у пользователя есть email. |
| Способ оплаты YooKassa привязан | Пользователь | ✓ | ✓ | Отправляется после успешного сохранения платежного метода через webhook YooKassa; email отправляется, если SMTP настроен и у пользователя есть email. |
| Ошибка оплаты по webhook провайдера | Пользователь | ✓ | ✓ | Отправляется, когда платежный провайдер сообщает о неуспешном платеже; email отправляется, если SMTP настроен и у пользователя есть email. |
| Реферальный бонус приглашателю: активная подписка продлена | Пользователь-пригласивший | ✓ | ✓ | Отправляется после оплаты приглашенным пользователем, если бонус продлил активную подписку приглашателя. |
| Реферальный бонус приглашателю: создана бонусная подписка | Пользователь-пригласивший | ✓ | ✓ | Отправляется после оплаты приглашенным пользователем, если у приглашателя не было активной подписки для продления. |
| Напоминание за 3 дня до окончания подписки | Пользователь | ✓ | ✓ | Работает, если SUBSCRIPTION_NOTIFY_DAYS_BEFORE >= 3; email требует SUBSCRIPTION_EMAIL_NOTIFICATIONS_ENABLED=True. |
| Напоминание за 2 дня до окончания подписки | Пользователь | ✓ | ✓ | Работает, если SUBSCRIPTION_NOTIFY_DAYS_BEFORE >= 2; email требует SUBSCRIPTION_EMAIL_NOTIFICATIONS_ENABLED=True. |
| Предупреждение о списании автопродления за 48 часов | Пользователь | ✓ | ✓ | Отправляется вместо обычного 48-часового напоминания для YooKassa-подписок с включенным автопродлением; email требует SUBSCRIPTION_EMAIL_NOTIFICATIONS_ENABLED=True. |
| Напоминание за 1 день до окончания подписки | Пользователь | ✓ | ✓ | Работает, если SUBSCRIPTION_NOTIFY_DAYS_BEFORE >= 1; email требует SUBSCRIPTION_EMAIL_NOTIFICATIONS_ENABLED=True. Для YooKassa auto-renew 24-часовой webhook сначала пытается списать продление и может не отправить напоминание. |
| Напоминание за несколько часов до окончания подписки | Пользователь | ✓ | ✓ | Отправляется локальным worker, если SUBSCRIPTION_NOTIFY_HOURS_BEFORE задан от 1 до 23; email требует SUBSCRIPTION_EMAIL_NOTIFICATIONS_ENABLED=True. |
| Уведомление в день окончания подписки | Пользователь | ✓ | ✓ | Управляется SUBSCRIPTION_NOTIFY_ON_EXPIRE; email требует SUBSCRIPTION_EMAIL_NOTIFICATIONS_ENABLED=True. |
| Уведомление через сутки после окончания подписки | Пользователь | ✓ | ✓ | Управляется SUBSCRIPTION_NOTIFY_AFTER_EXPIRE; email требует SUBSCRIPTION_EMAIL_NOTIFICATIONS_ENABLED=True. |
| Исчерпан трафик пробного периода | Пользователь | ✓ | ✓ | Отправляется локальным worker для trial-подписок; email отправляется, если SMTP настроен и у пользователя есть email. |
| Обычный трафик тарифа почти исчерпан | Пользователь | ✓ | ✓ | Отправляется TariffTrafficWorker по уровням из TARIFF_TRAFFIC_WARNING_LEVELS; email отправляется, если SMTP настроен и у пользователя есть email. |
| Обычный трафик тарифа исчерпан | Пользователь | ✓ | ✓ | Отправляется TariffTrafficWorker, когда регулярный лимит трафика достигнут; email отправляется, если SMTP настроен и у пользователя есть email. |
| Premium-трафик тарифа почти исчерпан | Пользователь | ✓ | ✓ | Отправляется TariffTrafficWorker по уровням из TARIFF_TRAFFIC_WARNING_LEVELS для premium-квоты; email отправляется, если SMTP настроен и у пользователя есть email. |
| Premium-трафик тарифа исчерпан | Пользователь | ✓ | ✓ | Отправляется TariffTrafficWorker, когда premium-квота достигнута; email отправляется, если SMTP настроен и у пользователя есть email. |
| IP временно заблокирован Torrent Blocker | Пользователь | ✓ | ✓ | Требует Remnawave Panel 2.7+ и подписанный webhook torrent_blocker.report. Включается через TORRENT_BLOCKER_NOTIFICATIONS_ENABLED; каналы, cooldown и показ IP настраиваются отдельно. |
| Ответ администратора в тикете поддержки | Пользователь | ✓ | ✓ | Telegram отправляется пользователям с Telegram-аккаунтом, email - пользователям с привязанным email. |
| Закрытие тикета поддержки | Пользователь | ✓ | ✓ | Telegram отправляется пользователям с Telegram-аккаунтом, email - пользователям с привязанным email. |
| Слияние email- и Telegram-аккаунтов | Пользователь | - | ✓ | Email отправляется на итоговый email при merge из Web App-формы привязки; Telegram OAuth-link merge логируется для админов без пользовательского email-письма. |
| Решение по партнёрской заявке | Пользователь-партнёр | ✓ | - | Для approved или rejected; одобрение дополнительно фиксируется в лог-чате. Повторное получение существующей pending-заявки не создаёт дубль. |
| Изменение статуса партнёрского профиля | Пользователь-партнёр | ✓ | - | Отправляется при активации, возобновлении, приостановке или закрытии профиля. |
| Изменение статуса партнёрской выплаты | Пользователь-партнёр | ✓ | - | Отправляется для processing, paid, rejected, failed и canceled; сообщение поясняет, возвращены ли зарезервированные средства. |
| Рассылка администратора пользователям | Пользователи выбранной аудитории | ✓ | ✓ | Отправляется через очередь из Telegram-админки или Web Admin выбранной аудитории: all, active, inactive; каждый канал учитывает глобальные настройки и предпочтения получателя. |
| Прямое сообщение администратора пользователю | Пользователь с Telegram | ✓ | - | Отправляется из карточки пользователя в Telegram-админке или Web Admin; email-канала нет. |
| Новый тикет поддержки | Администраторы | ✓ | ✓ | Telegram/log уведомления зависят от LOG_SUPPORT и SUPPORT_ADMIN_TELEGRAM_NOTIFICATIONS_ENABLED; email включается через SUPPORT_ADMIN_EMAIL_NOTIFICATIONS_ENABLED. |
| Ответ пользователя в тикете поддержки | Администраторы | ✓ | ✓ | Telegram/log уведомления зависят от LOG_SUPPORT и SUPPORT_ADMIN_TELEGRAM_NOTIFICATIONS_ENABLED; email включается через SUPPORT_ADMIN_EMAIL_NOTIFICATIONS_ENABLED. |
| Новая регистрация через Telegram | Администраторы / лог-чат | ✓ | - | Управляется LOG_NEW_USERS. |
| Новая регистрация по email | Администраторы / лог-чат | ✓ | - | Управляется LOG_NEW_USERS. |
| Email привязан к Telegram-аккаунту | Администраторы / лог-чат | ✓ | - | Управляется LOG_NEW_USERS. |
| Telegram привязан к email-аккаунту | Администраторы / лог-чат | ✓ | - | Управляется LOG_NEW_USERS. |
| Email- и Telegram-аккаунты объединены | Администраторы / лог-чат | ✓ | - | Управляется LOG_NEW_USERS. |
| Успешная оплата | Администраторы / лог-чат | ✓ | - | Управляется LOG_PAYMENTS. |
| Активация trial | Администраторы / лог-чат | ✓ | - | Управляется LOG_TRIAL_ACTIVATIONS. |
| Активация промокода | Администраторы / лог-чат | ✓ | - | Управляется LOG_PROMO_ACTIVATIONS. |
| Подозрительная попытка промокода | Администраторы / лог-чат | ✓ | - | Управляется LOG_SUSPICIOUS_ACTIVITY. |
| Новая партнёрская заявка | Администраторы / лог-чат | ✓ | - | Отправляется в LOG_CHAT_ID/LOG_THREAD_ID; сообщение содержит переход к пользователю. |
| Новый запрос партнёрской выплаты | Администраторы / лог-чат | ✓ | - | Отправляется при создании заявки на вывод и содержит сумму, валюту и внутренний номер без полных реквизитов. |
| Результат ручной синхронизации с Remnawave Panel | Администратор, запустивший синхронизацию | ✓ | - | Worker отправляет короткий результат в target_chat_id, если синхронизация запускалась через очередь. |
| Ошибка создания пользователя в Remnawave Panel | Администраторы | ✓ | ✓ | Получатели определяются по действующим ролям аккаунтов и доступным каналам. |
| Архив бэкапа создан | Администраторы / backup-чат | ✓ | - | Архив отправляется в BACKUP_CHAT_ID, а если он пустой - в LOG_CHAT_ID. |
| Ошибка бэкапа | Администраторы / backup-чат | ✓ | - | Ошибка отправляется в BACKUP_CHAT_ID, а если он пустой - в LOG_CHAT_ID. |
Важно про окончание подписки
Заголовок раздела «Важно про окончание подписки»Если у категории включены оба канала, пользователь с привязанными Telegram и подтверждённым адресом уведомлений получает оба сообщения. Если доступен один канал, сообщение уходит только в него. При выключенных обоих каналах сообщение не отправляется независимо от настройки резервного канала.
Кнопка в email-уведомлениях об окончании подписки открывает Web App через вход по email-коду: код отправляется сразу, после подтверждения пользователь попадает к продлению подписки. Для бывшей платной подписки выбирается тот же тариф, для trial - стандартный, тариф по умолчанию или первый доступный тариф.
Остальные полезные пользовательские события - успешные и неуспешные оплаты, докупки трафика/HWID, платное повышение тарифа, реферальные бонусы, предупреждения по трафику и привязка способа оплаты - тоже отправляются на выбранный email для уведомлений, если SMTP настроен. Админские email-рассылки используют тот же выбранный адрес; прямые Telegram-сообщения остаются отдельным каналом.
Пользовательские предпочтения
Заголовок раздела «Пользовательские предпочтения»В Личном кабинете → Настройки → Уведомления пользователь независимо управляет четырьмя переключателями: рекламные и системные уведомления по email и в Telegram. Для новых и уже существующих пользователей все четыре значения включены по умолчанию. Глобальные настройки администратора остаются верхней границей: пользовательский opt-in не может включить канал, отключённый для всей установки.
К рекламным относятся ручные рассылки администратора и автоматические кампании, использующие публичный Core DAL получателей рассылки. К системным относятся платежи, окончание и продление подписки, трафик, устройства, лимиты и реферальные начисления. Личные сообщения из карточки пользователя, вход и безопасность аккаунта, а также переписка с поддержкой не считаются рассылкой и продолжают работать.
В карточке пользователя администратор видит состояние всех четырёх переключателей и может менять их вручную. Выключенный или физически недоступный канал считается штатным пропуском, а не ошибкой рассылки: worker продолжает обработку остальных получателей. Автоматические кампании должны получать аудиторию через публичный Core DAL рассылок, который уже исключает пользователей, отключивших соответствующий рекламный канал.
Внизу рекламных и системных писем есть подписанная ссылка управления email-уведомлениями. Страница открывается без входа, но ссылка привязана к пользователю и текущему адресу для уведомлений. После смены адреса старая ссылка перестаёт действовать, а выбранные значения сохраняются и применяются к новому адресу. При объединении аккаунтов выключенное значение имеет приоритет над включённым, поэтому объединение никогда не включает ранее отключённый канал.
Кнопка перехода к настройкам
Заголовок раздела «Кнопка перехода к настройкам»В редакторе кнопок рассылки или личного сообщения выберите тип Экран веб-приложения и экран
Настройки уведомлений. Получатель увидит локализованную кнопку, которая откроет Mini App сразу
на /settings/notifications; для Telegram deep link используется безопасный параметр
startapp=notifications. Та же цель доступна в редакторе пользовательских кнопок меню в
Система → Настройки → Кнопки меню. Для каждой пользовательской кнопки отдельно задаётся
видимость в меню Telegram-бота, Telegram Mini App и обычном браузере.
Для пользовательских email-уведомлений нужен настроенный SMTP-контур и выбранный подтверждённый
адрес. Он настраивается в Настройки → Безопасность → Почта для уведомлений и не меняется от
способа последнего входа. Уведомления жизненного цикла подписки дополнительно требуют
SUBSCRIPTION_EMAIL_NOTIFICATIONS_ENABLED=True; support-уведомления администраторам дополнительно
управляются SUPPORT_ADMIN_EMAIL_NOTIFICATIONS_ENABLED. Подробнее: способы входа и адреса.
Администратор может полностью скрыть пользовательские настройки уведомлений через
USER_NOTIFICATION_PREFERENCES_ENABLED=False. В этом режиме раздел пропадает из ЛК, ссылки
управления уведомлениями не добавляются в новые письма, а публичные endpoint’ы предпочтений
возвращают 404.
HWID-устройства
Заголовок раздела «HWID-устройства»Уведомления о новых устройствах используют отдельное событие Remnawave
user_hwid_devices.added, поэтому MiniShop не опрашивает список устройств всех пользователей в
фоне. Повтор одного webhook дедуплицируется по непрозрачному HMAC-отпечатку устройства; исходный
HWID, request IP и User-Agent не попадают в очередь, логи, доменные события или текст сообщения.
Категории «Новые устройства» и «Лимит устройств» имеют независимые флажки Telegram/email. Если добавление устройства одновременно занимает последнее место и обе категории разрешены в одном канале, пользователь получает одно объединённое сообщение. При недоступности списка устройств отправляется только безопасное уведомление о новом устройстве без предположения, что лимит исчерпан. Для безлимитного или неизвестного лимита предупреждение о лимите не формируется.
Кнопка ведёт в раздел «Мои устройства». Предложение докупить места появляется только когда подписка активна, текущий тариф поддерживает периодическую оплату и для него настроен хотя бы один платный пакет HWID-устройств. Для trial, безлимитного тарифа, отключённого раздела устройств или отсутствующих пакетов предлагается только освободить место. Событие удаления устройства отдельно не рассылается: оно обычно инициируется самим пользователем в этом же разделе и иначе создавало бы дублирующее уведомление.
Синхронизация каналов
Заголовок раздела «Синхронизация каналов»Remnawave webhook и локальный SubscriptionNotificationWorker используют общий сервис отправки и общую таблицу дедупликации subscription_notifications.
Дедупликация ведется отдельно по каналам: например, before_3d:telegram и before_3d:email. Благодаря этому сбой одного канала не блокирует второй, а повторное событие из webhook или worker не отправляет уже доставленное уведомление повторно.
Старые записи без канала, например before_3d, считаются Telegram-историей. Они блокируют повторное Telegram-сообщение, но не мешают отправить email после обновления.
Если webhook от Remnawave приходит по пользователю без локальной подписки, используется legacy fallback: отправляется только Telegram по telegram_id из payload, без email и без канальной дедупликации.
Блокировка торрентов (Torrent Blocker)
Заголовок раздела «Блокировка торрентов (Torrent Blocker)»MiniShop обрабатывает подписанный webhook torrent_blocker.report из Remnawave Panel 2.7+.
Уведомление отправляется только когда actionReport.blocked=true: отчёты без фактической
блокировки игнорируются. Пользователю показывается причина ограничения и время автоматической
разблокировки. Имя ноды, адрес назначения, inbound/outbound и остальные технические поля
xrayReport не сохраняются и не показываются.
Перед включением уведомлений проверьте весь контур Torrent Blocker:
- Remnawave Panel и Remnawave Node имеют версию 2.7.0 или новее, Xray-Core — 26.3.27 или новее;
- контейнер Node запущен с
NET_ADMIN, на хосте доступны nftables и Linux kernel 5.7+; - в inbound включён sniffing с требуемыми
destOverride, а Torrent Blocker включён в Node Plugin; WEBHOOK_URLпанели указывает наWEBHOOK_BASE_URL+/webhook/panel, аPANEL_WEBHOOK_SECRETсовпадает с секретом панели;- webhook-канал события
torrent_blocker.reportне отключён в notifications config панели.
Полный список требований и схема события приведены в официальной документации Remnawave Node Plugins.
Настройки находятся в Система -> Настройки -> Уведомления -> Torrent Blocker:
TORRENT_BLOCKER_NOTIFICATIONS_ENABLED— общий opt-in переключатель;TORRENT_BLOCKER_TELEGRAM_NOTIFICATIONS_ENABLED— отправка в Telegram;TORRENT_BLOCKER_EMAIL_NOTIFICATIONS_ENABLED— дублирование на email при настроенном SMTP;TORRENT_BLOCKER_NOTIFICATION_COOLDOWN_SECONDS— минимальная пауза между уведомлениями одному пользователю в одном канале;0отключает cooldown, но не защиту от точных дублей;TORRENT_BLOCKER_NOTIFICATION_INCLUDE_IP— добавлять заблокированный IP в текст. По умолчанию выключено для приватности.
Шаблоны Telegram и email доступны в Система -> Переводы -> Уведомления Torrent Blocker.
MiniShop не вызывает DELETE /api/node-plugins/torrent-blocker/truncate: отчёты остаются в
Remnawave для админской статистики и других интеграций.
Webhook валидируется по официальному scope=torrent_blocker и типизированной схеме. События,
доставленные после willUnblockAt, считаются устаревшими и не отправляются пользователю.
Успешная доставка фиксируется отдельно для каждого канала: если Telegram уже отправлен, а SMTP
временно недоступен, retry очереди повторит только email. В логах worker публикуется метрика
torrent_blocker_notification_total с каналом и результатом без исходного IP-адреса.