3.21.0 (2026-03-02)
New Features
- add admin campaign chart data endpoint with deposits/spending split (fa7de58)
- add admin sales statistics API with 6 analytics endpoints (58faf9e)
- add daily deposits by payment method breakdown (d33c5d6)
- add daily device purchases chart to addons stats (2449a5c)
- add desired commission percent to partner application (7ea8fbd)
- add RESET_TRAFFIC_ON_TARIFF_SWITCH admin setting (4eaedd3)
- enhance sales stats with device purchases, per-tariff daily breakdown, and registration tracking (31c7e2e)
Bug Fixes
- add exc_info traceback to sync user error log (efdf2a3)
- add local traffic_used_gb reset in all tariff switch handlers (2cdbbc0)
- add min_length to state field, use exc_info for referral warning (062c486)
- add missing subscription columns migration (b96e819)
- address review findings from agent verification (cc5be70)
- correct cart notification after balance top-up (2fab50c)
- correct referral withdrawal balance formula and commission transaction type (83c6db4)
- count sales from completed payment transactions instead of subscription created_at (06c3996)
- eliminate double panel API call on tariff change, harden cart notification (b2cf4aa)
- eliminate referral system inconsistencies (60c97f7)
- email verification bypass, ban-notifications size limit, referral balance API (256cbfc)
- enforce user restrictions in cabinet API and fix poll history crash (faba3a8)
- freekassa OP-SP-7 error and missing telegram notification (200f91e)
- generate missing crypto link on the fly and skip unresolved templates (4c72058)
- handle expired callback queries and harden middleware error handling (f52e6ae)
- handle expired ORM attributes in sync UUID mutation (9ae5d7b)
- handle NULL used_promocodes for migrated users (cdcabee)
- hide traffic topup button when tariff doesn't support it (399ca86)
- improve campaign routes, schemas, and add database indexes (ded5c89)
- include desired_commission_percent in admin notification (dc3d22f)
- migrate VK OAuth to VK ID OAuth 2.1 with PKCE (1dfa780)
- partner system — CRUD nullable fields, per-campaign stats, atomic unassign, diagnostic logging (ed3ae14)
- prevent squad drop on admin subscription type change, require subscription for wheel spins (59f0e42)
- prevent sync from overwriting subscription URLs with empty strings (9c00479)
- reject promo codes for days when user has no subscription or trial (e32e2f7)
- remove premature tariff_id assignment in _apply_extension_updates (b47678c)
- renewals stats empty on all-time filter (e25fcfc)
- resolve GROUP BY mismatch for daily_by_tariff query (e5f29eb)
- restore panel user discovery on admin tariff change, localize cart reminder (1256ddc)
- separate base and purchased traffic in renewal pricing (739ba29)
- sync traffic reset across all tariff switch code paths (d708365)
- use .is_(True) and add or 0 guards per code review (69b5ca0)
- use direct is_trial access, add missing error codes to promo APIs (69a9899)
- use float instead of int | float (PYI041) (310edae)
- use SAVEPOINT instead of full rollback in sync user creation (2a90f87)