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

Next.jsTypeScriptAzure SQLAzure SWARechartsTailwind CSSEntra ID

Role

Full Stack Developer & Solutions Architect

Timeline

Feb 2026 - Present

Category

Full Stack / Cloud Architecture