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) (40f5214)
- enhance campaign payload handling by optimizing database checks (a01ecc2)
- etoplatezhi: use unique user_id as customer_id (telegram-less users got customer_id=None -> anti-fraud declines) (f688b19)
- forward overpay sub-option in guest payments (055e7c1)
- group info pages settings under interface category (b440a3f)
- guard display mode cycling against env overrides (7945628)
- handle database check failures in channel checker and improve Redis logging (6364d75)
- harden telegram html splitter against oversized links and malformed markup (151abbf)
- implement first-touch attribution protection for campaigns (be78179)
- logo: write resized Telegram logo to a writable temp dir (381d123)
- menu: /start renders the same subscription block as menu navigation (ff8b6cd)
- notifications: convert missed /devices/purchase notification to create_bot + sort imports (5cb81d1)
- oauth: backfill email on account link + normalize OAuth email (707a819)
- oauth: backfill email_verified for existing VK/Yandex OAuth users (0092) (7399eae)
- optimize campaign attribution handling by reducing database calls (8d522d0)
- overpay: mask p12 passphrase and harden certificate upload (4063259)
- payments: Lava top-up via cabinet failed with 422 invalid successUrl/failUrl (983f84a)
- persist CID before central purchase fire in tariff_switch + paid-trial (review #2982) (eb35142)
- promo-offers: don't time out the broadcast request on large fan-outs (d24a78c)
- promocode: repair activation across all types, modes and surfaces (dd434d9)
- remnawave: remove_device reports the real result, not just "no error" (c5b51c7)
- security: cabinet/webapi audit fixes + regression tests (8b5b8c2)
- subscription: apply paid tariff traffic limit on autopay trial→paid conversion (703940e)
- subscription: ensure idempotency and handle race conditions in trial subscription creation (27e54cc)
- subscription: optimize status handling by using a precomputed tuple for alive subscription statuses (6fc24c8)
- tidy quick amount prompt deletes and respect eur floor in overpay buttons (1bb98c9)
- timezone: panel returns UTC, stop shifting cabinet sync dates by local offset (7e732a4), closes #2990
- trial: hide trial button/offer when trial is disabled (fffa863)
- update save_pending_campaign to return None on Redis error and improve logging (c459a0f)
- use bot factory for admin notifications (a67ca04)
- user: handle IntegrityError for duplicate telegram_id during user creation (a91355e)
- webhook: don't expire sibling subscriptions on user.deleted unless the panel confirms they're gone (d7341e9)
Refactoring
- drop now-dead get_user_by_id fetch (09a910b)
- email: single source of truth for auth email templates (998f9d7)