What a player produced, what that production is worth in dollars, and what he is actually paid — for this season and for every guaranteed year that remains.
A max deal on a superstar can be a bargain and a minimum deal on a bench player can be an overpay, so the question is never “is he good” or “is he expensive” — it is the gap between the two. The chain from one to the other is short and every link is priced from the season being scored:
Step 1
The input is Simul RAPM on the two-year window ending in that season, which is in points per 100 possessions. Turning that into wins takes three things.
A minutes share.One roster slot for a full season is 3,936 minutes (48 × 82), so a player’s share of his team’s net rating is his rating scaled by the minutes he actually played.
A wins-per-point slope. Rather than asserting the familiar 2.7, the slope is fitted each runby regressing team wins on team net rating. If it lands outside the usual 2.4–2.9 band the build warns, because that almost always means the net-rating units are wrong rather than that the league changed.
A replacement level.A minimum contract is not being paid for zero wins — it is being paid for wins above what a freely available player would produce. That anchor sits at −2.0 points per 100.
Step 2
This is the part the model is most opinionated about. A player below the games-played floor is not scored at all. He keeps his row and receives a stated reason instead of a number.
A fifteen-game season is not evidence of a bad contract, it is absence of evidence, and scoring it anyway produces confident nonsense like “Tatum, terrible contract.” Three reasons take a player out of the scored pool: no salary on file, no rating, or an insufficient sample.
Above the floor, durability is handled separately from ability. A player is scored on his rate, projected onto expected minutes, rather than on the minutes he happened to play:
| Availability setting | What it charges for missed time |
|---|---|
| Ignore | Everyone scored at a full workload. Durability is free. |
| Partial (default) | Credits half the gap to a full season. |
| Full | Actual minutes. Every missed game is a lost win. |
Partial is the honest middle. Missing time genuinely reduces what a team got for its money, but a forty-game season should not read like a forty-game talent level.
Step 3
The exchange rate is derived from the league itself, one season at a time: total salary paid to the scored population, divided by total wins that population produced.
Step 4
One season’s surplus is a different question from whether the contract is good. For every guaranteed year remaining, the projection ages the player, grows the cap, and discounts the result back to today:
The curve is asserted rather than fitted, and it is the single biggest lever on any multi-year score — a 33-year-old is carried at 73% of peak, a 22-year-old at 88% and rising. Worth knowing when a long deal for an older player grades badly: some of that verdict is this table, not the data.
The headline score ranks surplus per year, not total surplus over the deal. Summing makes the score mostly a measurement of how many years are left: a genuinely good contract with six years of future max money stacked up lands near zero, and a bad two-year deal outranks a mildly bad six-year one. Length still appears in the total-surplus column — it just no longer dominates the ranking.
The 0–10 score is then a percentile within that season. A 9.0 means top ten percent of contracts that year, not an absolute dollar threshold — which keeps scores comparable across seasons with very different cap levels.
Step 5
Team numbers are sums of the player rows, not a separate model: payroll, wins, surplus now, surplus per year and surplus over the deal, plus average age.
Two columns exist so the team totals cannot quietly mislead. Dead cap is money paid to players no longer on the roster. Unscored salary is money paid to players who did not clear the games-played floor. Both are real payroll that produced no scored wins, and both are shown rather than folded silently into the surplus.
| Column | Meaning |
|---|---|
| Wins | Wins above replacement from the rating and minutes actually played. |
| Wins scored | The same rate projected onto expected minutes — the number the score is built on. |
| Value | Wins scored converted at that season’s dollars per win. |
| Surplus now | Value minus this season’s salary, in millions. |
| Surplus per year | The remaining deal’s discounted surplus, divided by guaranteed years left. What the score ranks. |
| Contract score | Percentile of surplus per year within the season, on a 0–10 scale. |
| Flag | Why a player has no score. An empty score with a flag is not a zero. |
Coverage starts at 2016-17 — the first season the RAPM prior fully covers on a two-year window. Earlier ratings have no prior or a partial one and are not comparable, so they are not scored at all.
Limitations
The rating is partly asserted. At the shipping penalty strengths a 20,000-possession player is roughly 40% prior, and that prior is built from box-score features with several hand-set constants. This is not a pure measurement of what happened on the floor, and a contract score turns that into a dollar claim about a specific person.
Teammate collinearity is unresolved. A player who rarely appears without his usual lineup inherits its value. A contract score amplifies this more than any other output here, because it converts a rating error into a statement about what someone is worth.
The aging curve, the replacement level, the discount rate and the cap-growth assumption are all choices. Reasonable people would pick differently, and a long deal’s score moves noticeably when they do.
A rating window is not a season. The two-year window ending in a season partly reflects the season before it, so a player who just took a leap is scored partly on the player he used to be.
Strengths
Everything is in real units the whole way through — points, wins, dollars — so a score can be taken apart and argued with at any step, rather than being a black-box index.
Dollars per win and the wins slope are both derived per season from the data, so contracts from different cap eras are comparable without an inflation adjustment being invented.
It refuses to score what it cannot measure. Injured players, missing salaries and missing ratings produce a stated reason rather than a confident bad grade.