← NineDraft

How the prices work

How a price is built, what each column says, where the numbers come from, and when they change.

This is a two-part read. I’ll first cover how we calculate the Fair Value for each player. In the second half, I’ll get into the more interesting part — why that Fair Value is not enough once the real draft starts, and how the NineDraft War Room figures out what you should actually pay in that moment.

The ‘Best-estimate’ value — what “Our $” is

Many of you are already aware of how players are valued, but I’ll still summarize it.

From projections to points

We start from projected season-long stats for each player. Gibbs, for example, might be projected to rush for 1,400 yards, score 15 touchdowns, and have other relevant estimates for catches, receiving yards, fumbles, etc. From there, we calculate expected fantasy points based on your league settings. For example, a TD may be worth 6 points, a reception 1 point, and so on. All this gets Gibbs to, say, 300 fantasy points in 2026. This is our starting point. If the projections are good, the rest of our calculations have a good foundation too.

Finding the ‘replacement’ player

Now, depending on other league settings such as how many teams there are, we expect a certain number of RBs to be drafted to fill the RB, FLEX, and bench spots. We have math to estimate this for your specific league — say that comes to around 24 RBs.

In that scenario, the RB projected around 25th — the first one past those 24 — is getting close to someone who will either cost very little or be sitting on waivers — basically a free player. Let’s say that is Bhayshul Tuten, projected for 180 points. He then becomes our approximate ‘replacement’ RB.

To calculate the true value Gibbs gives you, we need to remove those 180 points. The reason is simple: if you don’t draft Gibbs, you don’t get zero points at RB. You can still get roughly those 180 points very cheaply elsewhere.

Gibbs’ value, then, becomes 300 − 180 = 120 points above replacement.

Those 120 points for Gibbs become the basis of Value Based Drafting (VBD) — one of the most common ways to determine the value of a player over the free or very cheap ‘replacement’ player.

This also lets us apply the same math across positions. A top QB, say Josh Allen, might score 375 points, more than Gibbs (who was at 300). But the league will likely draft only 10–12 QBs, compared to perhaps 24 RBs, and hence the 13th QB — say Caleb Williams at around 300 expected points — becomes the replacement. That lowers Allen’s value to 375 − 300 = 75 points above replacement. Compare this to Gibbs’ value of 120, even though Allen is projected to score more total fantasy points than Gibbs.

Turning points into auction dollars

Once we calculate this across the player pool, we look at your total auction budget, roster requirements, minimum salaries, and the total value available above replacement. That lets us translate those VBD points into actual auction dollars.

In summary, we look at your league settings, expected player stats, replacement players, total budget, roster size, etc. to determine a Fair Value for each player. This is what you see in your static Cheat Sheet.

One important note: Fair Value — what does it really mean? Say Gibbs has a Fair Value of $82. That does not mean if you get him for $82, you did great. You did OK. You got what you paid for. No one fleeced you. If you get Gibbs for $72, though, now you created value. And if somehow you get him for $62, that was a steal.

On the other side, if you pay $65 for someone we valued at $52, our pre-draft model would say you overpaid. But — and this becomes important in Part 2 — that does not automatically mean it was the wrong decision. There are situations during the actual draft where paying more than the original Fair Value can make sense.

Now, how should we value BENCH players — players you would not expect to start every week? There are multiple methods to do this. We use one particular approach called Stars & Scrubs. This really means one simple thing for us — we leave roughly a dollar per bench spot. In other words, we allocate almost all our meaningful money toward the tippy-top starters. We go hard after the A-players, and then load up the bench with handcuffs, lottery tickets, backups, rookies, ambiguous backfields — players who have a shot at becoming A-players as the season progresses.

The alternative is to spend real auction dollars on bench strength as well. That gives you a deeper bench, but the money has to come from somewhere. It generally means spending less on your starters and potentially losing out on some of the stars. We intentionally lean the other way. Our philosophy is to Go Big on the starters, keep the bench cheap, and then be willing to pay attention to the waiver wire each week. That is a philosophy choice in our model, not some universal law of fantasy football.

Hopefully, you now have a general understanding of how our Cheat Sheet is created. The sheet itself is free, and you can absolutely take it into an auction draft and use it. The limitation is that all of these prices were calculated before your draft started.

Part 2: The War Room

As you saw, we considered your league settings, player projections, roster structure, historical trends, total budget, etc. to calculate Fair Values. But what we did not consider — could not consider — is how the real draft room would actually unfold.

As you are drafting, we suddenly have much more information. We know:

Going one level further: if you still need a TE, how much money is sitting on the teams that also still need a TE? If there are only two good TEs left and three teams with plenty of money chasing them, that matters.

And then there is an even bigger question: what happens to the rest of your draft if you buy this current player? What happens if you let him go? Who could you get instead? Which path leaves you with the stronger final roster?

You can do some of these things in your head. You notice that only two decent TEs are left. You notice that one manager still has plenty of cash and desperately needs RBs.

But doing all of this together, continuously, while the draft is moving every few seconds, is impossible. This is where the NineDraft brain comes into play.

NineDraft uses a Chrome extension alongside the ESPN draft room because we need to watch the draft actually changing. A player gets nominated, someone wins, money moves, a roster spot gets filled, another player disappears from the available pool. Each of those things changes the state of the draft, and potentially changes what the next player is worth to you.

Buy him, or pass?

The important part is that NineDraft is not just taking the original Fair Value and adjusting it up or down by some percentage. Each time a player gets nominated, we look at the draft in two ways — a. you get the player on your team, and b. you pass. We then compare which path gives you the stronger final roster at different prices.

Say Gibbs has a pre-draft Fair Value of $82. He gets nominated and the bidding reaches $70. A static sheet says keep going — $70 is still below $82. But say you already have Breece Hall and Kenneth Walker, still badly need WR, and Puka Nacua and Ja’Marr Chase are among the top WRs left. Gibbs may no longer be worth $82 to you, right now.

NineDraft looks at the draft two ways: what happens if you get Gibbs at the current price, and what happens if you PASS and keep that money for the players remaining? We keep testing higher prices until passing gives you the better final roster. That tipping point becomes your Max Bid.

Now flip it around. Say Trey McBride is already gone and Brock Bowers is one of the last elite TEs left. Bowers’ Fair Value on our sheet is $37, but your Max Bid might now be $42. Paying above Fair Value can make sense because the draft itself has changed the value of your alternatives.

One thing to be precise about, because the list above is what a manager watches and not all of it is what the engine solves on: the Max Bid itself is worked out from your roster, your remaining budget, your league’s roster rules, and the players on our sheet that nobody has bought yet. What your opponents have left to spend, and which slots they still need, are not inputs to that number.

That is the difference: Fair Value asks what a player should be worth before the draft. Max Bid asks what you should pay for him right now. As players disappear, budgets shrink, and team needs change, so does Max Bid.

That, really, is why NineDraft exists.

The next section goes one level deeper into the engine, for those interested in how we actually do it.

The machinery, a couple levels down

For those interested in the math, here is what is actually happening underneath.

For a nominated player, NineDraft builds two futures from the current draft state:

PASS
Remove the player and find the best team you can still build with your current roster and budget.
ACQUIRE, at a price
Force the player onto your roster at that price, reduce your budget by it, and find the best team you can build from there.

The objective is the projected points of your best legal starting lineup, including FLEX. Bench players are still required to complete a legal roster, but contribute zero to this objective. If two solutions produce the same starter points, we prefer the one that spends less.

So, simplified, Max Bid is:

Max Bid = the highest legal price at which ACQUIRE is at least as good as PASS.

A tie still means BID.

How we solve it

Brute-forcing every possible future roster at every possible bid would get expensive quickly. Instead, NineDraft uses a position-decomposed dynamic program.

The solver first builds efficient spend/value frontiers within each position, explicitly handles the different RB/WR/TE combinations that can fill FLEX, and then combines those frontiers using max-plus convolution. From that it produces two complete budget curves — PASS and forced-ACQUIRE.

That is useful for another reason: we do one solve for the lot, not one solve for every bid. Once the curves exist, $70, $71, $72 … are lookups into the same solution. A bid moving by a dollar does not rerun the optimization.

The solver also enforces the real auction constraints. Position limits have to work. Every roster spot must remain fillable. If you have $40 and five spots open, you cannot spend $40 — enough money has to remain for the other four bodies at the league minimum.

The future player pool is everyone still available, costed at our current Fair Value for that player — except the bench players our Stars & Scrubs split has flattened to a dollar, which are costed instead at what our own bench-inclusive number says they are worth, since that flat dollar is an opening-auction equilibrium and not what the player is worth to you in an endgame. A player we price at zero but who can legally fill a roster spot is floored at the league minimum bid for the solve.

For league shapes where we have the matching historical calibration, the solver can also use measured replacement/streaming assumptions. The match is on your roster shape — the slots you start and how deep your bench runs.

How do we know the fast solver is right?

We built two independent correctness oracles.

One literally enumerates possible rosters — exhaustive brute force. The other expresses the same problem as a mixed-integer program and solves it with CBC.

The production dynamic program is parity-tested against both. On cases small enough for the expensive solvers to run, all three should reach the same answer.

Some statistics before the solve

There is statistical work upstream as well.

Our VBD calculation actually carries both value above the last starter and value above the last rosterable player, and blends those into the value we price from. At QB and Kicker, historical results can also raise the replacement floor to what streaming has actually delivered — at D/ST they do not, because streaming a defense has measured out worse than simply holding the last starter. At all three, history constrains how much of a projected positional edge we are willing to price as real.

Player tiers use a Gaussian Mixture Model (GMM) within each position, looking for clusters in projected points rather than simply declaring every N players a tier.

The replacement and value numbers above are what the live Max Bid optimization then works from. Tiers are for reading the sheet; they are not an input to the solve.

One last problem: the room keeps moving

The solve is happening while ESPN is still running the auction.

Every solve is fingerprinted to the exact roster, budget, player pool and room state that produced it. If the room changes before the answer comes back, that answer is dropped. We would rather publish nothing new than publish the exact answer to a draft state that no longer exists.

The heavy solve is also fingerprinted separately from the current bid. That is what lets all the bids on the same player reuse the already-computed curves.

If ESPN temporarily gives us a roster state we cannot trust for several consecutive reads, NineDraft can switch at the next player to the simpler caps engine until the roster becomes reliable again. A slow solve by itself does not trigger that fallback.

Where the numbers come from

Scoring, roster slots, budget and team count are read from ESPN when you import your league. Player projections and market data come from multiple sources. Your Fair Value is built from the projections and your league math; the vs ESPN column uses ESPN’s national auction value as the market comparison.

During the draft, the NineDraft browser extension streams the live ESPN room state into the War Room.

If one source is unavailable, we build from the remaining sources and tell you which one was missing.

When prices change

Fair Values are rebuilt daily as projections and market data change. Every sheet shows the date it was built.

Once your draft goes live, we freeze that underlying sheet for the room. The baseline stays fixed; your Max Bid continues changing as players, rosters and budgets change.

League settings are read when you import. If you change scoring, roster slots, budget or team count at ESPN, re-import the league.

Reading the sheet — what each column says

Kickers and defenses

What differs at those two slots is the comparison, not the price. On a sheet that prices them at ESPN’s own auction figure, the cell reads market — there is no separate value of ours left to compare it against. On any other sheet they carry no vs ESPN figure at all, whether or not ESPN priced them: the value we compute for those slots is not set against what auctions actually pay for them, so we do not call one a bargain or an overpay.

Keeper leagues

These prices assume a fresh auction. If your league keeps players, the kept players and what they cost their owners are not part of the math — read the sheet as the value of each player in an open room, and adjust for what your keepers take off the board.

Which ESPN prices the comparison uses

The vs ESPN column measures against ESPN’s national auction values for the season — the figures ESPN shows everyone, not values from your league.

Something not adding up? Questions? Comments? Feedback?

Write to us at support@ninedraft.ai. I promise I read all emails and will reply.

— Jaswinder Singh · NineDraft is a ninetalents project.