From skill, to salary, to a 1-10 grade, to a team-building outlook
Skill alone doesn't tell you if a contract is good — a max deal on a superstar can be a steal, and a minimum deal on a bench piece can still be overpriced. What matters is the gap between what a player is paid and what their skill level should be paid league-wide. Everything below builds outward from a single composite Skill rating (a blend of LEBRON, RAPM, and BPM): predicted salary, a dollar value gap, a 1–10 contract score, a team grade, and a forward-looking Team Future Score.
Skill and pay aren't linearly related — there's a floor (minimum deals), a ceiling (the supermax), and a steep middle where a small skill jump buys a much bigger raise. A sigmoid curve captures that shape, so a regression fits Skill to actual salary with the floor pinned at $2M, the ceiling pinned at $61M (this year's supermax), and the steepness fixed. Only the inflection point — where the curve bends from "paid like a bench piece" to "paid like a star" — is solved for.
Rookie-scale players and anyone under $5M are excluded from the fit, since those salaries follow CBA rules rather than market value.
Green dots are real salaries plotted against skill; the red line is the fitted curve. Dots above the line are overpaid relative to skill, dots below are underpaid — that gap is the value score.
Once every player has a predicted salary, the gap to their real salary — in millions, positive means overpaid, negative means underpaid — is the value score.
A raw dollar gap is too blunt. A star who's $10M overpaid because they're still great is different from a bench player $10M overpaid for doing little — and great numbers over 20 games count less than the same numbers over a full season. So the gap runs through two adjustments: skill forgives some of an overpay, and availability (games played, with minutes as a gentler factor) scales the result on both sides. Players under 30 games played are excluded entirely.
If a player is overpaid, their skill forgives part of the gap first, then full availability cuts whatever penalty remains by up to 70%. If a player is underpaid, availability amplifies the credit — a $15M bargain who plays 25 games matters less than one who plays 75. The result is mapped onto a 1–10 scale anchored so 0 lands at 5, a strong underpay lands near 10, and a bad overpay lands near 1.
Click a bar to see who's in it
Best Contracts in the League
| Player | Team | Skill | Salary | Value | Score |
|---|
Worst Contracts in the League
| Player | Team | Skill | Salary | Value | Score |
|---|
A team's contract grade is simply the sum of its 10 best individual contract scores — using only the top 10 (rather than the full roster) means deep, well-run benches aren't punished relative to top-heavy rosters, and stars on bad deals can't be hidden by a pile of minimum-salary throw-ins. That raw sum is then min-max normalized across all 30 teams to a 0–100 percentile, so it's always relative to the rest of the league in that season.
Contract value is about the present. The Future Score asks a different question: which rosters are set up to win going forward? It starts from a per-player talent score — skill weighted up for young players and down for aging ones, scaled by games played so injury-prone seasons don't inflate the outlook.
A team's top 10 talent scores are summed, then adjusted: a bonus for already having a foundational star locked in for their prime years, a penalty for aging, overpaid "dead money" that crowds out flexibility, and a blend with the team's own contract score so cheap, well-run cores get extra credit over equally talented but expensive ones. The result is normalized 0–100 across the league.
League-wide Team Future Score ranking:
→ Explore every team & contract in the full Contracts HubLimitations
The sigmoid fit reflects how the market currently pays skill, not how it should — if the league as a whole over- or under-pays a certain archetype, that bias gets baked into the curve rather than corrected.
Rookie-scale deals are excluded from the regression but rookies still receive a Predicted_Salary and ValueScore_M — those numbers reflect what they'd be paid as a veteran, not a judgment on their rookie deal itself.
Both the contract score anchors (+30/0/−25) and the future score weights (age multipliers, franchise bonus, dead money penalty) are fixed, hand-picked constants rather than fit to any external "winning" outcome — they encode a basketball-informed prior, not a statistically optimal one.
Strengths
Because the baseline is the market itself (a sigmoid fit to actual salaries vs. skill), the value gap is always relative to how the league is paying right now — it self-corrects every season rather than relying on a fixed external benchmark.
Separating the Contract Score (present-day value) from the Future Score (talent-weighted outlook) avoids conflating "this team has great value deals today" with "this team is built to win for years" — a veteran-laden, cap-efficient roster and a young, cheap, ascending core can both score well on contracts while landing very differently on future outlook.
Using top-10 sums rather than full-roster sums for both team metrics keeps the focus on the players who actually decide outcomes, without penalizing teams for carrying minimum-salary depth.