Уведомления
Minishop отправляет уведомления в Telegram и на email. Telegram-канал означает личные сообщения пользователю, сообщения администраторам из ADMIN_IDS или сообщения в LOG_CHAT_ID - зависит от события. Email работает только при настроенном SMTP и наличии email у получателя.
Для автоматических пользовательских строк каналы настраиваются в Система -> Настройки -> Уведомления -> Доставка пользователям. У каждой категории есть отдельные флажки Telegram и email. Два выключенных флажка полностью запрещают уведомления этой категории.
Переключатель резервного канала разрешает доставку через единственный привязанный канал, когда выбранный канал пользователю недоступен. Например, email-only пользователь получит письмо при выбранном только Telegram. Если выбранный канал доступен, выключенный канал не используется. Временный сбой отправки также не включает резервный канал.
Все 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 | Администраторы | ✓ | - | Отправляется администраторам из ADMIN_IDS. |
| Архив бэкапа создан | Администраторы / 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-адреса.