Route
/benchmarks — BenchmarksPage.vue
Access
- Summary cards — available to all tiers
- Benchmark grid — Premium only (standard users see upgrade prompt)
- Position chart — available to all tiers
Filter Sidebar (all functional)
All filters are reactive — changing any value immediately refetches data via TanStack Query computed keys.
Summary Cards (4)
Each card shows “Yours” vs “Conference Avg” with a delta percentage pill.- Avg NIL / Athlete —
total_value / athletes_with_dealsfor school vs conference - Avg Agreement Value —
AVG(total_value_usd)across filtered deals - % Athletes with Agreement — athletes with deals / total athletes
- Total NIL Value —
SUM(total_value_usd)for school vs conference
Benchmark Grid (Premium)
Three-way comparison table: Your School vs Conference vs Peer Group. Each group shows Avg / Guaranteed / Performance sub-columns. Delta columns show percentage difference vs Conference and vs Peer Group. How it’s computed (GET /benchmarks/grid):
- School:
_agg()withuniversity_id == user's - Conference:
_agg()withuniversity_id IN (same conference) - Peer Group:
_agg()withuniversity_id IN (universities in peer group conferences) - Percentiles: PostgreSQL
percentile_cont(0.25/0.50/0.75)on per-athlete totals
Position Bar Chart
Vertical bar chart showing Avg NIL per position for the selected sport. Three bars per position (Yours / Conference / Peer) with hover tooltips showing exact values and athlete count. Chart mode toggle (Total / Guaranteed / Performance) changes which value drives the school bars:- Total →
school_avg - Guaranteed →
school_avg_guaranteed - Performance →
school_avg_performance
Backend Engine
All benchmark data is computed from real PostgreSQL aggregation queries — no hardcoded or fake values. The_agg() helper function accepts sport_id, position_id, eligibility_year, and comp_type filters and applies them to every aggregation (school, conference, peer).