New Features
Schools & billing
- School membership: Schools resolve roster access via the dedicated membership table with administrator flags instead of legacy junction-only helpers
π· [SCREENSHOT] β School roster showing consistent admin signals tied to membership rows
- School-wide studio pools: Image Studio and Video Studio budgets consolidate into one pooled allowance while preserving analytics splits by role
- School studio packs: Pool purchases settle once thanks to verification guards that detect repeat intents
School administration UI
- Bulk student import: A standalone bulk-import page sits beside Invite Student so large spreadsheets stay out of the main roster
- Loading polish: Skeleton loaders plus staged enter motion ship across School Management tabs including roster infinite scroll
Personal billing clarity
- Cleaner histories: School-funded studio purchases no longer surface inside individual transaction or billing timelines
Enhancements
- Administrator-funded studio caps stay distinct from optional personal top-ups; stored totals reconcile with backend pooling logic
- Nullable teacher roster caps unlock unlimited staffing parity with student seating semantics
- Monthly resets apply pooled allowances together with tracked personal purchases
- Auxiliary lookups respect membership-aware joins for classrooms and tags
- API safeguards: Rate limiting plus OAuth route hygiene help institutional deployments withstand abusive bursts
- Studio authorization: Media tooling endpoints inherit tighter ownership checks that close residual studio IDOR gaps
Bug Fixes
- Stopped duplicate studio balances triggered when verification replayed the same payment intent for packs or personal top-ups
- Repaired overstated school totals caused by legacy formulas double-counting bonus pools versus assigned caps
- Removed conflicting scroll containers on School Management filters and tightened roster limit editors