Horizon League Budget Dashboard
Internal athletics budget dashboard for the Horizon League, built with Next.js and Azure Static Web Apps, replacing a Power BI solution at 75% cost reduction.
01.Project Overview
Overview
An internal analytics dashboard built for the Horizon League to replace a Power BI solution. The platform visualizes athletics budget data across member institutions, enabling league administrators to compare spending, track salary trends, and analyze NIL/COA allocations — all behind Azure Active Directory (Entra ID) single sign-on.
The migration from Power BI to Next.js + Azure Static Web Apps reduced monthly hosting costs from ~$255 to ~$59 (a 75% reduction) by eliminating per-user licensing.
Dashboard Pages
The application includes seven analytical views:
- League Overview — Total budget rankings, YoY change KPIs, enrollment vs. budget scatter
- Basketball Deep Dive — MBB/WBB budget composition, expense waterfall, operations breakdown
- Sport-by-Sport — Per-sport budgets, scholarship equivalencies heatmap, recruiting spend
- Staff Salaries — Salary dot plots, role-filtered matrices, head coach trend lines
- NIL, COA & Alston — Collective presence, organizer type breakdown, Alston payment tables
- Department Operations — Departmental spend, outsourcing indicators, MBB/WBB sponsorship ratios
- Year-over-Year Trends — Multi-line trends across budgets, salaries, and department costs
Architecture
- Frontend: Next.js (App Router) with Server-Side Rendering, Recharts for visualization, Tailwind CSS for styling
- API Layer: Next.js Route Handlers deployed as Azure Functions within SWA, parameterized SQL queries
- Database: Azure SQL Server with Managed Identity (credential-free, read-only access)
- Authentication: Azure SWA built-in auth with Entra ID, supporting internal staff and B2B guest accounts
- ETL: Python-based survey data import pipeline, loading Excel submissions into Azure SQL
Key Design Decisions
- SSR over SPA — Semi-static annual survey data benefits from fast initial loads via server-side rendering
- Managed Identity — Zero credentials stored in the application; SWA's system-assigned identity authenticates directly to Azure SQL
- URL-based state — Filters passed as URL search params eliminate the need for client-side state management
Tech Stack
- Next.js 14, TypeScript, React, Tailwind CSS
- Recharts, @tanstack/react-table
- Azure Static Web Apps, Azure SQL, Azure Functions
- Entra ID (Azure AD) authentication
- Python (ETL pipeline)
Technologies
Role
Full Stack Developer & Solutions Architect
Timeline
Feb 2026 - Present
Category
Full Stack / Cloud Architecture