Releases: BEDOLAGA-DEV/remnawave-bedolaga-telegram-bot
Releases · BEDOLAGA-DEV/remnawave-bedolaga-telegram-bot
Release list
v4.1.0
4.1.0 (2026-08-20)
New Features
- add typed ban notification templates (30878b1)
- cabinet: удаление конкретной подписки из карточки пользователя (56a9959)
- email: заголовок Reply-To (SMTP_REPLY_TO) (6a26e39)
- email: отписка от маркетинговых писем (one-click, RFC 8058) (4825527)
- landing: засчитывать гостевую покупку в рекламную кампанию (1c46702)
- landing: засчитывать гостевые покупки в рекламные кампании (7203ca9)
- landing: сохранять слаг рекламной кампании в гостевой покупке (4a81705)
- promocodes: трафик в наборе бонусов промокода (93f5bff)
- remnawave: проксировать GeoCheck ноды из панели 3.3.0 в кабинет (134d8e4)
- show payment methods directly on extend insufficient-balance screen (45f81a8)
- skip tariff selection screen when only one tariff is available (5c74099)
- sort user list by soonest subscription expiry (e3713ce)
Bug Fixes
- align BanHammer notification contract (e84a9b0)
- bans: уважать общий выключатель уведомлений в типизированных банах (927790f)
- cabinet: id админа снимаем до цикла массового действия (9fba46f)
- cabinet: не отдавать пустую строку вместо null в /info/service (1707660)
- cabinet: отдавать в /info/service реальные настройки (0ba8fa5)
- cabinet: отдавать в /info/service реальные настройки (3329ec3)
- cabinet: удаление подписки адресует панельный аккаунт по режиму (1feef2c)
- cabinet: удаление подписки в массовых действиях падало MissingGreenlet (c99fd54)
- channel: не слать админам traceback на заблокировавших бота (d91caee)
- email: отписку применяет только POST + границы токена (091e2ee)
- grace: сессия без панельного id чинится при чтении, а не живёт вечно (5116848)
- make BroadcastResponse.message_text Optional[str] (9a23bc3), closes #3151
- migrations: перенумеровать миграцию кампании в 0105 (79b17f0)
- migrations: развести номер миграции гостевых покупок с 0105 (d4f529b)
- notifications: не отправлять отключённые уведомления пользователям (22370a8)
- oauth: per-origin redirect_uri so OAuth login works on mirror domains (1f873f9)
- oauth: привязка провайдера тоже возвращается на домен запроса (d99ab15)
- payments: дренаж фоновой обработки вебхуков при остановке (531060e)
- payments: не терять вебхуки платёжек, выключенных на момент старта (67532db)
- platega: распознавать camelCase-коллбеки рекуррентной СБП-подписки (4123ee8)
- promocodes: код с одним трафиком не сгорает на безлимитной подписке (7254930)
- promocodes: трафик доезжает до строки, а начисление возвращает доступ (0d70155)
- remnawave: не подставлять None вместо класса ошибки при провале импорта (775e507)
- rich: make usernames clickable (42ff65a)
- rich: ссылку на профиль ставим только настоящему Telegram-логину (accda9a)
- tickets: длинные сообщения обрезались и не показывались целиком (064e067)
- tickets: длинные сообщения обрезались и не показывались целиком (3be6da7)
- tickets: экранировать превью ответа в уведомлении пользователю (f898414)
- traffic: не читать даты периода вне ветки, которая их задаёт (993ea75)
Performance
- etoplatezhi: ack webhook instantly, process callback in background (2acea3f)
Refactoring
- campaigns: вынести привязку к кампании в сервис (a813083)
v4.0.0
4.0.0 (2026-08-03)
⚠ BREAKING CHANGES
- config: меняется не только имя переменной, но и формат значений — вместо UUID панельных пользователей нужны числовые id. Автоматически сконвертировать нельзя: uuid из 3.0.0 исчез, и панель их больше не знает.
New Features
- admin: add Bedolaga-first User Detail contracts (57e2794)
- cabinet: панельная идентичность и контракты под 3.0.0 (2b97440)
- config: TRAFFIC_EXCLUDED_USER_UUIDS переименован в _USER_IDS (88a92f7)
- db: числовая панельная идентичность remnawave_id (898bcf4)
- remnawave: бэкфил панельной идентичности (b97e5f6)
- remnawave: клиент API под 3.0.0 (c763514)
- remnawave: сервисный слой на числовую идентичность (6da10bc)
- remnawave: хендлеры, миддлвари и Web API под 3.0.0 (c897d38)
Bug Fixes
- admin: лог при пропуске синка панели у подписки без UUID (3d77bc2)
- admin: отмена рекуррента Lava при сбросе выбранной подписки (2f2006a)
- notifications: MissingGreenlet при уведомлении о регистрации по кампании (0f1beff)
- remnawave: grace-сессия строки-донора не теряет идентичность (dc09e78)
- remnawave: бэкфил не блокируется одной парой и отдаёт id живой строке (5cd3adb)
- remnawave: бэкфил не откатывался целиком на single-tariff (d461784)
- remnawave: бэкфилл падал на старте и брал не тот режим (deeb24f)
- remnawave: бэкфилл привязывал чужой аккаунт, создание падало на индексе (98e63b0)
- remnawave: вебхук не проверял соседей, и подписи тестов врали (70d35c1)
- remnawave: защита от противоречивых uuid не работала на первом прогоне (928ce20)
- remnawave: карта uuid не праймилась, холостой прогон писал в БД (e9445ee)
- remnawave: ложный успех при удалении устройств, окно суток и happ-ссылка (b007de8)
- remnawave: не терять и не подсовывать протухшую идентичность подписки (bef6e6d)
- remnawave: несовпадение владельца снова вело к очистке, а не к перепривязке (ea4db92)
- remnawave: повторный прогон бэкфила и выбор живой подписки (b515c3d)
- remnawave: поля, которых нет в контракте 3.0.0, и след прогона бэкфила (babf846)
- remnawave: порядок UPDATE'ов при переносе панельного id (28b01f1)
- remnawave: протухший id больше не решает за пользователя (83c6415)
- remnawave: след прогона врал, а защита индекса не мешала записи в панель (fe3dc5b)
- remnawave: суточная проверка снова не сработала бы, а граница id ослабла (3c31285)
- remnawave: точный ключ не должен проигрывать догадке и ронять синк (d2fd3d5)
- remnawave: холостой прогон бэкфила называл свой отчёт «conflicts» (6b7204b)
- settings: осмысленные категории для настроек, начинающихся с глагола (e6f1505)
Documentation
- remnawave: точное обоснование раздельных flush при переносе id (6eb80c6)
v3.67.0
3.67.0 (2026-07-29)
New Features
- cabinet: согласие с офертой и политикой при первой авторизации (3b0306f)
- coupons: лимит активаций на пользователя и удаление партий (8260944)
- devices: запрет уменьшать лимит устройств ниже включённого в тариф (8aafb64)
- lava: кабинет-эндпоинты автопродления Lava (0dea218)
- lava: паритет покупки привязкой, уведомления, сверка суммы (de3518b)
- lava: рекуррентные подписки Lava по образцу Platega (9d1772b)
- menu: кнопка «Меню» Telegram открывает веб-кабинет (WebApp) (c7e2087)
- promo-offers: охват сегментов и прогресс доставки промопредложений (5e4548b)
- quick-amounts: возможность отключить кнопки быстрых сумм пополнения (b1f9be6)
- start: видео в стартовом меню бота, загрузка из кабинета (524960c)
- tariff: expose custom traffic settings in Telegram admin (d75cbfe)
- tariff: прямая оплата тарифа без отдельного шага пополнения баланса (a060575)
- webapi: эндпоинт ручного пополнения баланса с идемпотентностью (cd9811c)
Bug Fixes
- i18n: исправление ошибок перевода в fa/ua/zh локалях (2cc0f36)
- lava: взаимоисключение с Platega + сдвиг списания при ручном продлении (da84ed1)
- lava: закрыты находки адверсариального ревью рекуррента (94e3fcd)
- lava: имя провайдера в правой части «через …» вместо имени метода (df92f68)
- pricing: корректная цена за месяц для коротких и некратных периодов (9b172b2)
- promo-offers: счётчик сегмента expired — живая ветка вместо мёртвой (d93762f)
- promocode: MissingGreenlet при отказе активации — rollback экспирировал db_user хендлера (d0c1d5d)
- recurrent: цена автопродления учитывает докупки устройств и трафика (85344c6)
- remnawave: клэмп size в 1..1000 для /api/users/stream (7bf8047)
- rich-menu: RICH_MESSAGE_DATE_INVALID на подписках дальше ~3 лет (9ee31d3)
- search: регистронезависимый поиск по юзерам для кириллицы (5323803)
- startup: однозначно широкие статус-значки в резюме запуска (3dae638)
- start: видео не доходило до самой команды /start (1f61e0b)
- subscription: не показывать неоплаченный черновик триала как подписку (fe992c6)
- tariff: превью покупки считает цену тем же PricingEngine, что и confirm (baef285)
- tariff: СБП-оформление доступно с экрана «недостаточно средств» (a5a13ae)
- tribute: per-событийный ключ идемпотентности вместо donation_request_id (e9515ad)
- устранить замечания CodeQL из PR #3123 (c7cc8b4)
v3.66.0
3.66.0 (2026-07-24)
New Features
- grace: упростить квоту трафика и правила доступности (2e40235)
- nalogo: доставка чека на почту, когда Telegram недоступен (3c047ed)
- platega: CRUD рекуррентных подписок (9cf2aa3)
- platega: WS-события sbp_recurring.* для кабинета (f34431a)
- platega: админка кабинета — статус и отмена СБП-автооплаты (135771e)
- platega: бот-флоу автопродления через СБП (a69d233)
- platega: ветка подписочных коллбеков в /platega-webhook (9d13c4e)
- platega: гейт PLATEGA_RECURRENT_ENABLED (23ba645)
- platega: кабинетные эндпоинты СБП-автопродления (юзер) (19862a2)
- platega: методы подписок в PlategaService (create/get/list/cancel) (27c8fac)
- platega: модель platega_subscriptions + миграция (5c9580a)
- platega: обработчик коллбеков подписки (продление, идемпотентность, статусы) (5a33a9e)
- platega: отмена СБП-автооплаты при удалении/отзыве подписки (2593424)
- platega: отмена СБП-подписки + best-effort хелпер по подписке (4763cbe)
- platega: реконсилятор СБП-подписок в monitoring-цикле (1cf5212)
- platega: СБП-оформление подписки — альтернатива оплате с баланса (43d81c8)
- platega: создание СБП-подписки + выключение balance-autopay (e701cad)
- platega: чистая логика каденса рекуррентных СБП-подписок (8200847)
- remnawave: транслитерация кириллицы в username пользователя (35383c2), closes #1659
- support-ws: bridge core + message.created from ticket.message_added (e54e1e3)
- support-ws: bridge ticket.created and ticket.status_changed mappings (2ff76f3)
- support-ws: emit ticket events from cabinet/mini-app routes for bridge (d65d9fb)
- support-ws: register event bridge at app startup (8d80230)
Bug Fixes
- admin: device_limit = 0 в админке тоже показывать безлимитом (8e1b2cc)
- auto-purchase silently skipped after top-up due to updated_at race guard (ad3e9cf)
- ci: lowercase-референс образа для Trivy-скана (795c7be)
- nalogo: доставлять чек покупателю после ручной пересылки из админки (fa25d70)
- nalogo: дочитывать печатную форму чека до конца (7dcd18e)
- nalogo: чек по подарочной покупке — адресат покупатель, а не одаряемый (3a0a157)
- platega: actionable-ошибка при отказе создания СБП-подписки (0864a95)
- platega: side-effects после СБП-списания + защита от пустого charge Id и пропавшей подписки (ee295c6)
- platega: аудит-фиксы СБП-автопродления — money-safety и полнота отмен (ccc2049)
- platega: гонка конкурентного enable (D5) и outage-vs-404 в reconciler (D4) (8243d39)
- platega: идемпотентность создания СБП-подписки (не плодить дубли и двойные списания) (132ef4e)
- platega: санитайзить description подписки под 64-байтный лимит Platega (f7a6f5b)
- platega: СБП-автопродление доступно для суточных тарифов + гард на триал (9fe42e7)
- platega: синк панели после списания + обратное взаимоисключение + отмена на пропущенных путях удаления (57ad9b7)
- platega: три P2 из ревью релизного PR #3111 (64feac0)
- rich-menu: дать включить rich-меню без логотипа (add7327)
- rich-menu: премиум-эмодзи из текстов меню уходили клиенту сырым тегом (1feab43)
- settings: отображать DEVICES_SELECTION_DISABLED_AMOUNT как число, а не цену (0f1968e), closes #1658
- subscription: device_limit = 0 — это безлимит, а не ноль устройств (51688fc)
- support: дефолты SLA в коде развести с .env.example не в пользу спама (38110e5)
- support: отдавать внешний URL поддержки в конфиге кабинета (b270349)
- support: проверять бан поддержки и режим тикетов в веб-сокете (f3acc69)
- support: синхронизировать persisted-режим поддержки в settings при старте (2184e58)
- tickets: передавать db в новые event_emitter-эмиссии кабинета (8eaef7f)
- tickets: проверять блокировку поддержки и лимит тикетов в кабинете (2887ef7)
- tickets: режим поддержки в кабинете читать у сервиса, а не из settings (bd93d7e)
Documentation
- platega: отмена автооплаты, хук при удалении подписки, ...
v3.65.1
3.65.1 (2026-07-19)
New Features
Bug Fixes
- nalogo: не терять чек, если Telegram отверг файл, и не слать HTML как чек (abde46c)
- subscription: NameError при продлении тарифа после списания денег (82b7131)
Запись о фиче добавлена вручную: коммит PR #3087 был создан до нарезки v3.65.0, а влит после,
поэтому release-please не увидел его при обходе истории и не учёл ни в версии, ни в changelog.
v3.65.0
3.65.0 (2026-07-19)
New Features
- add crash-safe restricted grace access for expired and limited subscriptions (67d45b6)
- admin: rich-вид сообщений админ-чата — уведомления, логи, статистика, старт (3dbdc8e)
- cabinet: отправка прямого сообщения юзеру из карточки в кабинете (c4130c1)
- email: deliver winback + lifecycle notifications to email-only users (491f61f)
- email: email templates for all Remnawave WEBHOOK_* notifications (a14389f)
- email: recurrent autopay success/failure to email-only users (ba9555c)
- l10n: локализовать флоу покупки/продления/смены тарифа (0951c70)
- nalogo: имя и почта копируются по тапу + HTML-экранирование (078493a)
- nalogo: отправка чека пользователю + дублирование в админ-топик (3229b5a)
- nalogo: подробный блок получателя в админ-уведомлении о чеке (0490ffb)
- nalogo: порядок полей в блоке получателя (ID, имя, username, почта) (2ef6963)
- payments: интеграция платёжной системы cisPay (392722f)
- payments: флаг YOOKASSA_SKIP_IP_CHECK с fail-closed проверкой платежа через API (2ac5299)
- promo-offers: доставка промопредложений на email для юзеров без Telegram (8913546)
- promocodes: комбинированные промокоды — баланс и дни подписки одним кодом (d8f4b54)
- WEBHOOK_SUB_EXPIRING + переводы zh/ua для webhook-писем + тесты (38771d3)
- zh/ua для winback-писем, честный PAYMENT_RECEIVED для автосписания, тесты (a37fad2)
Bug Fixes
- admin: не разрывать <pre>-блоки при конвертации уведомлений в rich (bf00eda)
- admin: переносы строк в rich-уведомлениях + админ-уведомление о триале из диплинка (53eda3e)
- admin: платёжные провайдеры в разделе «Платежные системы» (a53f9ad)
- campaign: MissingGreenlet при начислении бонуса кампании на регистрации (6ec45f6)
- email: use notify_autopay_success wrapper so email shows the new expiry date (973cc90)
- l10n: добавить недостающие ключи t() во все локали и защитить тестом (3a0e54b)
- menu: не строить tg-time для дат вне 32-битного unix-диапазона Telegram (e3dfcf7)
- menu: не строить tg-time для дат вне 32-битного unix-диапазона Telegram (c0b932e)
- nalogo: print_url строил ссылку на чек без /v1 (a472d11)
- nalogo: ссылка на чек — добавлен /v1 (баг библиотечного print_url) (a547f5c)
- remnawave: пересоздавать удалённого из панели юзера при живой подписке (9f31282)
- subscription: конверсия живого триала при покупке тарифа в мульти-режиме (76aa67c)
- webhooks: bound payment-callback concurrency to prevent DB pool exhaustion (f72effc)
- восстановление затёртых dev-фич и фиксы grace-подсистемы (PR #3075) (35206d7)
Documentation
v3.64.0
3.64.0 (2026-07-13)
New Features
- broadcasts: поддержать icon_custom_emoji_id у кастомных кнопок рассылки (ff029c7)
- broadcasts: поддержать icon_custom_emoji_id у кастомных кнопок рассылки (c690351)
- cabinet: команды бота (/start и др.) в логе действий пользователя (fd3efd7)
- cabinet: нажатия кнопок бота и действия в кабинете в таймлайне активности (2ceb615)
- cabinet: таймлайн активности пользователя в карточке юзера (be1f67a)
- menu: rich-главное меню на Bot API 10.1 с фоллбеком на классику (20c129e)
- menu: rich-меню v2 — продление из кабинета, расход, логотип, эффект 🎉 (242ed40)
- menu: rich-меню v3 — кнопки «Подключить» и «Активировать триал» в таблице (734773f)
- menu: сворачиваемый блок подписок в rich-меню при нескольких подписках (cfdce75)
Bug Fixes
- admin: честное сообщение при сохранении настройки, прибитой переменной окружения (f9dc3d4)
- admin: честное сообщение при сохранении настройки, прибитой переменной окружения (f63bee0)
- maintenance: не разворачивать traceback для ожидаемых отказов Telegram (27b02e4)
- menu: кнопки таблицы в видимую строку + эфемерное подтверждение триала (f7809b7)
- menu: не разворачивать traceback для ожидаемых ошибок rich-меню (1ca972d)
- monitoring: поддержать плейсхолдер {days} в SUBSCRIPTION_EXPIRING_PAID (d445dfa)
- monitoring: поддержать плейсхолдер {days} в SUBSCRIPTION_EXPIRING_PAID (bc51a06)
- subscription: block prorated instant switch from free tariffs (6aca902)
- subscription: block prorated instant switch from free tariffs (6ef7d0e)
v3.63.0
3.63.0 (2026-07-12)
New Features
- add mobile support websocket v1 (2eb3769)
- bot: подсказка про права на каталоги в креш-репорте (PermissionError) (01db943)
- cabinet: add recurrent-payments legal document (8f4ecf2)
- coupons: cabinet API для купонов — партии, экспорт ссылок, погашение (605c024)
- coupons: партии одноразовых купонов на подписку для оптовой продажи (8a5cfaf)
- infra: Valkey 9 вместо Redis 7 для кэша и очередей (b0709ea)
- remnawave: локальная генерация happ crypt4 ссылок (d9042c2)
- remnawave: локальная генерация happ crypt4 ссылок (без внешнего API) (2ad0d57)
Bug Fixes
- audit support websocket mutations (3836a5b)
- backup: одиночный scheduler-цикл и BACKUP_TIME в локальной таймзоне (#3030) (e2bad81)
- backup: одиночный scheduler-цикл и BACKUP_TIME в локальной таймзоне (#3030) (b4ad4e6)
- bot: тексты длиннее лимита Telegram роняли показ правил и политики (197e096)
- cabinet: close refund-guard gaps — silent refund failure + extend double-benefit (f6395a6)
- cabinet: stop admin user search crashing on out-of-range numeric input (a95b7bc)
- cabinet: возврат средств при сбое покупки тарифа после списания баланса (#3031) (12f6e35)
- cabinet: возврат средств при сбое покупки тарифа после списания баланса (#3031) (c5ac200)
- coupons: закрыть double-tap на подтверждении партии и двойной answer в экспорте (8947a73)
- db: add migration for recurrent_payments table (missing on existing installs) (1ce9430)
- email: не тащить CSS/JS в text/plain версию письма (#2974) (7b9b7f1)
- email: не тащить CSS/JS в text/plain версию письма (#2974) (e4af7f2)
- harden mobile support websocket session guards (1dc4e9e)
- notifications: email-юзерам уведомления в flow "пополнение -> автопокупка" (#2952) (d527ce5)
- notifications: email-юзерам уведомления в flow «пополнение → автопокупка» (#2952) (083289d)
- notifications: label trial→paid auto-purchase as activation, not renewal; test real templates (551236e)
- platega: поддержка v2 API - поле url и настраиваемая версия эндпоинта (#2934) (681a1d2)
- platega: поддержка v2 API — поле url и настраиваемая версия эндпоинта (#2934) (7ff3b40)
- refresh admin user-messages list without a hand-built callback (3323b7f)
- reload daily subscription with user+tariff after commit (MissingGreenlet) (c0bfea7)
- remnawave: кэш локальных happ crypt4 ссылок (стабильность между вызовами) (0b54d59)
- restore happ crypto links on Remnawave 2.8.0 via official Happ API (31711d4)
- subscription: make TARIFF_SWITCH_RESET_FREE_DAYS actually reset the free/trial period (73050c3)
- support-ws: dedup idempotent retries, canonical reply status, telegram parity, send lock (0c58a49)
- tickets: писать id реального админа в ticket_messages.user_id (#3029) (eb326db)
- tickets: писать id реального админа в ticket_messages.user_id (#3029) (fc92019)
Refactoring
- coupons: единый build_coupon_deeplink вместо трёх копий формата ссылки (bc5dfcf)
Documentation
v3.62.0
3.62.0 (2026-06-30)
New Features
- cabinet: add /branding/footer-enabled GET+PATCH endpoint (#3011) (fee15cb)
- per-method payment description override (white-label) (#3014) (500259e)
- pre-warm logo file_id at startup to kill broadcast re-upload (b93db73)
- subscription: reuse expired trial of same tariff on paid purchase (bot/guest) (ac9268b), closes #3004
- surface 2.8.0 service.api_token_created/deleted webhook events (499dfb8)
- surface payment decline reason in the admin panel (#3015) (c378431)
- update Remnawave API integration for panel 2.8.0 (db39b69)
Bug Fixes
- bound MonitoringService notification sends with a per-send timeout (9046bee)
- cabinet: reuse expired trial of same tariff on purchase instead of duplicating (#3004) (c95aec0)
- carry subscription_id through tariff renewal callbacks (#3012) (348491e)
- clarify balance-related notification texts (autopay hint + INSUFFICIENT_BALANCE) (#3013) (baf6782)
- email: build From header with formataddr to avoid duplicated address (e66c526)
- handle 2.8.0 user.expiration webhook event (7ce455f)
- read webhook envelope meta from data['_meta'] in user.expiration (1e1a309)
- resolve the correct subscription in tariff-switch flows (#3012) (08c08dd)
- respect RESET_DEVICES_ON_RENEWAL in Remnawave user sync (#3006) (#3008) (0f608a7)
- security: block stored XSS via ticket media (HTML/SVG served inline) (0cbf624)
- security: harden admin logo serving against SVG script execution (2e512fc)
- show Lava payment methods in the bot when enabled (#3016) (591b154)
- stop multi-tariff HWID device limit bleeding across tariffs (7463ec0)
- sync used traffic from nested userTraffic in user.modified webhook (7fd397e)
Refactoring
- close low-pri 2.8.0 follow-ups (trafficLimitBytes coerce, api-token name) (dc4eaad)
- harden HWID byApp aggregation (2.8.0) + test coverage (a82614c)
Documentation
v3.61.0
3.61.0 (2026-06-19)
New Features
- add cabinet admin api for legal pages (5dc9f63)
- add display mode cycle button to bot admin page editors (f3a1dd7)
- add display mode settings for built-in info sections (575ce2b)
- add display_mode column to info pages (9c5c79f)
- add overpay payment option selection in bot (68657ce)
- add overpay terminal, direct qr and eur settings (31e7ce6)
- add telegram html renderer and splitter for info pages (6b8a522)
- admin: overpay certificate upload in bot (3a71ad3)
- admin: quick amounts management section in bot admin (3321a92)
- autopay: add AUTOPAY_FAIL_* notification antispam settings (5dff8d8)
- autopay: per-cycle Redis+memory state helpers, replace cooldown methods (10769ee)
- autopay: pure decision fn + per-cycle state, drop 6h cooldown constant (8df8db4)
- autopay: route failure notifications through per-cycle policy + final reminder text (d3e8eea)
- bot: quick amounts keyboard in top-up prompts for inline providers (2537fbb)
- bot: quick amounts keyboard in top-up prompts for legacy providers (6e37578)
- bot: quick top-up amounts keyboard (6b0ed74)
- cabinet: allow new animated background types in animation-config validation (0ed3b4e)
- cabinet: expose quick_amounts in payment methods API (b339c3a)
- cabinet: overpay certificate admin endpoint (c03bd3a)
- email-templates: common placeholders available in every template (4fd82a7)
- email-templates: expand common placeholders to recipient-level vars (76cd71c)
- expose overpay int sub-option and cabinet payment option (b9f2ec0)
- filter cabinet info endpoints by display mode (af5fef2)
- gate bot info sections by display mode and render custom info pages (3150ac2)
- make DB connection pool params configurable via env (#3000) (610add5)
- notification: add user ID coercion for Telegram profile links (4ded56b)
- notification: enhance ticket notification buttons based on user role (fdfda9e)
- notification: handle TelegramBadRequest for unchanged message content (a766ccc)
- notification: implement safe editing/resending of messages for photo notifications (0ab57d2)
- overpay terminals and direct qr, per-method quick top-up amounts, page display modes (ac53fa0)
- overpay: certificate upload service (de0514b)
- payments: add quick_amounts column to payment method configs (fda59ef)
- payments: quick amounts validation and effective values in config service (d1c0960)
- route overpay payments by option with eur conversion and direct qr (de2fc34)
- subscription: free-tariff switch fixes — reset tool, day-reset, expired menu (3b3633c)
- support overpay s2s order init and redirect link polling (3703710)
- tickets: improve ticket reply handling for admin notifications (9920b93)
- tickets: let moderators use ticket-notification action buttons (016a79a), closes #2988
- tickets: open admin ticket in cabinet from notification buttons (1bdf8f2), closes #2988
- tickets: show reliable (non-FSM) buttons in group/channel admin chat (de66f07), closes #2988
- tickets: update ticket status handling for notification buttons (b091aa3)
- yclid-keyed Yandex offline conversions for repeat-purchase attribution (cde4baa)
Bug Fixes
- address review feedback on overpay and cabinet admin (a09b57b)
- admin-sync: repair UUID-wiped subscriptions from panel + fix squad extraction (440de7d)
- autopay: never starve the final reminder; keep email cause text (db76789)
- backup: free table locks before restore TRUNCATE to avoid LockNotAvailableError (712d502)
- backup: skip missed schedule slots so auto-backup can't fire a burst (f947fed)
- bot: derive BOT_USERNAME from live get_me() so links survive a bot swap (be0d7c9)
- cabinet: time-bound inline RemnaWave sync on pay endpoints (a2913d3)
- email-templates: editor baked sample values into saved overrides ([#667043](https://github.com/B...