3.43.0 (2026-03-29)
New Features
- add Remnawave panel 2.7.0 API support (565c083)
- add SeverPay support to cabinet balance top-up (092b9f6)
- add subscription_id to admin sync endpoints for multi-tariff (54a19a9)
- add tariff identification to all notifications for multi-tariff mode (7dd67e3)
- add tariff_id to promo codes for trial subscription type (63e4296)
- api: expose email field in UserResponse (23d1830)
- DELETE /subscriptions/:id for expired/disabled subscriptions (c27f144)
- expose MULTI_TARIFF_ENABLED and MAX_ACTIVE_SUBSCRIPTIONS in admin settings (2628012)
- expose per-inbound traffic breakdown in nodes realtime API (5d173c8)
- include countryEmoji and providerName in realtime metrics (b59c581)
- multi-subscription support (1099c52)
- multi-subscription support (1 user = N subscriptions) (335be66)
- return is_daily and is_daily_paused in subscription list API (4dd8170)
- support email/OAuth users in referral editing and add remove endpoints (7f60196)
- trial lifecycle + purchase-options filter for multi-tariff (048d208)
- wheel subscription picker for multi-tariff mode (24edfb6)
Bug Fixes
- accept subscription_id from query param in renew endpoint (consistent with other endpoints) (824d54b)
- account linking broken in multi-tariff mode (MULTI_TARIFF_ENABLED=true) (2c12a47)
- account merge no longer nulls transferred subscriptions' remnawave_uuid (b0273dc)
- add missing ADMIN_PAYMENTS localization keys for ru and en (4f76f53)
- add period_days validation and zero-price guard to tariff purchase (cefdfc5)
- add redirect_slashes=False to prevent HTTP 307 redirects on subscription endpoints (f7f8ea8)
- add selectinload for GuestPurchase.user/tariff in gift activation (84357a1)
- add tariff identification to remaining notification gaps (cddb8d6)
- add_traffic handler passes FSM state to resolve_subscription for multi-tariff context (684f286)
- address remaining review issues in device limit patch (9726145)
- address review issues in device limit patch (34aec03)
- admin handlers use _resolve_admin_subscription + per-subscription UUID (147ef6b)
- admin panel per-subscription UUID in multi-tariff mode (56fffc2)
- admin server/devices/traffic buttons pass subscription_id in multi-tariff (9a27e6d)
- admin tariff purchase now creates separate RemnaWave user per tariff (95ba739)
- assign promo group from tariff on guest purchase (da11ec6)
- async tariff loading in promocode serialization (3bec662)
- auto-purchase processes each autopay subscription independently (f89e326)
- back button in subscriptions list uses correct callback (382e29d)
- back buttons in devices/traffic return to subscription detail in multi-tariff (319941d)
- block classic subscription renewal/autopay when tariff mode enabled (cd6913c)
- block legacy subscription renewal bypass in tariff mode (78209c8)
- cabinet admin create subscription now creates new RemnaWave user in multi-tariff mode (31c67d1)
- cabinet purchase_tariff — handle IntegrityError with compensating refund (1bc2581)
- cabinet routes use smart subscription fallback + per-subscription UUID (f83ff26)
- centralize trial cleanup in CRUD + shared subscription resolver for bot (355fef8)
- comprehensive multi-subscription audit fixes across routes, handlers, and services (d071269)
- comprehensive tariff switch/extend/back button fixes for multi-tariff (e42bddb)
- contest prize applies to best non-daily subscription in multi-tariff (d2bbeb8)
- daily tariff switch uses _resolve_subscription instead of searching by new tariff_id (4e12ab3)
- delete subscription from RemnaWave panel + prevent phantom webhook notifications (a12ffb1)
- device limit decrease, HWID pagination, tariff max enforcement (931eeb3)
- devices button shows menu with buy + manage options in multi-tariff (f925efb)
- disable redirect_slashes globally to prevent HTTP 307 on subscription endpoints (06feb3f)
- distinguish cabinet gift notifications from landing page (48eaa6b)
- eligibility and display use best non-daily subscription in multi-tariff (76ba19d)
- fix MiniApp renewal options 500 error for legacy subscriptions (aa36549)
- gift code activation and multi-tariff subscription sync (f93c51a)
- harden node info display against injection and type errors (6d167d2)
- harden webhook signature verification across all payment providers (8295880)
- import Subscription in wheel_service to fix NameError (34bb87c)
- improve UX for legacy users migrating to tariff mode (f6f330d)
- load buyer relationship before gift notification, clean up recipient logic (adb39c6)
- multi-subscription support for promocodes, contests, phantom merge (6d468e9)
- multi-subscription UUID resolution and ownership validation (d87fb47)
- multi-tariff code review — 13 critical/high bugs fixed across 14 files (5724906)
- multi-tariff MEDIUM/LOW batch — 20 issues across 17 files (94ed282)
- multi-tariff Stage 2 critical fixes — panel sync, guest purchase, cart isolation (4259ba1)
- multi-tariff Stage 2 HIGH fixes — 18 issues across 12 files (c6bedc6)
- multi-tariff Stage 3 critical fixes — panel sync UUID, admin grant, wheel (49db5f5)
- multi-tariff Stage 3 HIGH fixes — phantom, cart, yookassa, auto-extend (aa7e461)
- multi-tariff Stage 4 critical fixes — keyboards, guest purchase, monitoring, tariff deletion (a49e52c)
- multi-tariff Stage 5 fixes — auth sync, notifications, cart, race guard (948e479)
- multi-tariff sync auto-links legacy user-level UUIDs to subscriptions (dbe247b)
- notifications include tariff name for multi-subscription clarity (05d1ae0)
- parse_bytes now handles IEC units (GiB, MiB, KiB) from API (1471320)
- pass FSM state to _resolve_subscription across all subscription handlers (90fb0a2)
- pass sub_id to show_devices_page to fix NameError in multi-tariff (59d4b35)
- persist referral to Redis on /start to prevent loss when user opens miniapp (6d9bd99)
- post-payment keyboard checks all subscriptions instead of LIMIT 1 (25b853d)
- prevent sync from overwriting wrong subscription traffic in multi-tariff mode (78a7eaf)
- prevent sync/from-panel cross-subscription data mismatch (960aa44)
- promocode system broken in multi-tariff mode (3cbe09d)
- re-fetch subscription after lock_user_for_pricing to prevent selectinload reset (71082f4)
- remnawave service uses per-subscription UUID throughout multi-tariff (afd7b6d)
- RemnaWave sync finds user by Subscription.remnawave_uuid in multi-tariff (c3c2b81)
- remove unused imports and variables after rebase (b6cf361)
- remove user.subscription setter - use local variable instead (2f88b07)
- remove UUID fallback override in admin_tariffs + restore promo on IntegrityError (a232d21)
- rename refresh('subscription') to refresh('subscriptions') in all files (e99f3d9)
- renewal handlers use _resolve_subscription + store subscription_id in FSM (87bf65c)
- renewal status check, int() safety, daily charge atomicity (58d899a)
- renumber multi-subscription migrations to avoid conflicts with dev (5a7b3d5)
- resolve MissingGreenlet error on article detail view (004dac5)
- services use smart subscription selection + per-subscription UUID (0866c2e)
- set is_daily_paused=True when admin cancels/disables daily subscription to prevent auto-resume (d04f2fc)
- show all subscriptions in main menu for multi-tariff mode (e39c358)
- show subscription picker for traffic/connect buttons with multiple subs (a39e355)
- suppress empty reward alerts and clean up referral notifications (e3d8d21)
- tariff purchase shows purchased tariffs and blocks re-buying in multi-tariff (9644135)
- tariff_purchase next() fallbacks use None instead of active_subs[0] in multi-tariff (72d5bae)
- test access promo applies to all active subscriptions in multi-tariff (181ef15)
- transliterate Cyrillic slugs instead of stripping to 'untitled' (c805cfd)
- trial promo extends existing subscription with same tariff (b8662b8)
- trial reset in multi-tariff only deletes trial subscriptions, keeps paid (424fff4)
- trial subscription lifecycle — autopay, cleanup on purchase, bonus days (344852b)
- use '/' instead of empty path in subscription sub-routers (07ebc43)
- use empty path instead of '/' for multi-tariff list endpoint to avoid 404 (c8ecec4)
- UUID check in servers/tariff_switch, start.py refresh, delegation state passing (bd46b4c)
- UUID warnings, phantom merge, yookassa validation, contest prize notification (fe03b58)
- validate_and_clean_subscription uses per-subscription UUID in multi-tariff mode, not user-level UUID (18f31c5)
- web API routes use multi-subscription resolution for operations (a1623d9)
Refactoring
- remove dead multi-tariff check in guest purchase activation (34b5a9a)
- update remnawave API integration for v2.7.0 (173cc37)