How the number is made
Everyone in your league has a playoff-odds opinion. Here is ours, with the working shown — what we simulate, what we feed it, what it cannot possibly know, and how to read the number when it comes out.
Engine version 2.1.1 · every stored result carries its version, its seed and its iteration count.
The simulation
We play out the rest of your season, over and over
The model does not guess who wins games. It guesses how much each team scores, and lets the wins fall out of that. One run through the rest of the season looks like this:
- Every remaining regular-season game is played by drawing a score for each team from that team's own scoring distribution — a weekly expectation and a spread, both described below.
- Those scores go into the ledger exactly like real ones: wins, losses, ties, points for, points against, head-to-head and division records all move. Nothing is frozen at today's values.
- The league is ranked using your league's own tiebreakers, in your league's own order — head-to-head, points for, points against, division record — read from your league settings rather than assumed. Multi-way ties are resolved the way the providers do it, on games among the tied teams only.
- Seeds get assigned. If your league seeds division winners first, this simulation does too.
- Then it plays the bracket: same distributions, round by round, byes sitting out the first round, survivors re-seeded each round, a tie going to the better seed — through to a champion.
That happens 10,000 times. Your playoff odds are the share of those seasons in which you made it; your bye odds and championship odds are counted the same way, in the same pass. Every team's numbers come out of one run — there is no separate simulation per team that could quietly disagree with the one next to it.
The random draws come from a seeded generator, and the seed is stored with the result. Same league, same seed, same number — hitting recalculate does not make the odds twitch.
The inputs
What goes in, and where it comes from
All of it is your league's own data, pulled from Sleeper or ESPN: the teams, the full schedule, every final score, and the rules — playoff spots, tiebreaker chain, bracket shape, scoring settings. We re-sync through the week, and re-run the simulation when something actually changed.
- Records and points
- Rebuilt from the game scores we hold rather than copied from the standings page — because some leagues report records that include games against the league median, which do not exist on a schedule and cannot be simulated. Counting those twice would corrupt every win total.
- How much a team is expected to score (the middle)
- The sum of that team's current starters' projections for that week, scored with your league's scoring settings — so a lineup with three players on bye really does project lower. If fewer than 60% of the starting slots have a projection, we don't trust the number and fall back to that team's own history: 60% weight on the last 3 weeks, 40% on the season so far.
- How much a team bounces around (the spread)
- The standard deviation of that team's own weekly scores — pulled toward a league-wide baseline while the sample is still small, with the team's own history taking over as it accumulates (weight n/(n+5) after n games; the baseline starts at 25 points before a league has played anything). Three games in, your three-game sample does not get to pretend it is the truth.
- When there isn't enough to work with
- We refuse to invent a distribution. A team with no projections and no completed games produces no odds at all, and the board says so — an honest empty state instead of a confident number with nothing behind it.
How to read it
12% means it happens sometimes
A probability is not a prediction. It is a count of how often something happened across thousands of simulated seasons — so the model is never "wrong" because the 12% came in, and never "right" because the 88% did. Read them like this:
- >99%
- About as safe as this product will ever say out loud — and deliberately short of certainty. We ran thousands of seasons and none of them ended badly for you, which is not the same as none existing.
- 88%
- Comfortable, not safe. Roughly one season in eight still goes wrong — and one in eight happens all the time.
- 50%
- A coin flip with extra steps. Whatever happens next, the model was not wrong.
- 12%
- It happens sometimes. Line up eight managers sitting exactly where you are and one of them is making the playoffs. That one is allowed to be you.
- <1%
- Long odds, not zero. A season we did not happen to draw is not a season that cannot happen.
Odds print as whole percentages because that is the precision the method supports: 10,000 simulated seasons puts about half a percentage point of sampling noise around a number near a coin flip. A decimal place would be theatre. For the same reason, a one-point move week to week is not news.
We never print full certainty from a simulation. A result that rounds to certain still has counterexamples we did not happen to draw, so it reads >99% or <1% instead.
The words CLINCHED and OUT are a different claim, and they cost more to make. We force the team to lose every remaining game (or win every remaining game), leave the rest of the league simulating, and re-run that branch at 8× the iterations under a different seed — 80,000 seasons. Only if the outcome never once flips do we say the word. Even then the honest sentence is "no counterexample in 80,000 draws, so the chance we're wrong is at most about 3 in 80,000" — not zero. No finite number of simulations can prove a thing is impossible; it can only put a ceiling on how possible it is.
The limits
What this model does not know
Every one of these is a real gap, not a disclaimer. If a number here ever looks wrong to you, it is probably one of them.
- Injuries that haven't reached the projections yet
- A running back who goes down on Sunday afternoon is priced in when projections next refresh, not the moment it happens. Between refreshes, the model is confidently working from a lineup that has changed.
- Trades and waiver moves that haven't happened
- Future weeks are simulated with the starters on your roster today, repeated forward. Every roster in the league gets better or worse between now and the last week of your regular season, and none of that is in here.
- Your lineup decisions
- The model assumes you start your starters. It cannot know you'll leave 30 points on the bench, or that you're about to start a player on bye, and it will not forgive you afterwards either.
- Everything the NFL is about to do
- Weather, game script, a coach benching your workhorse in the fourth quarter — our weekly expectation is a sum of player projections, not a football model. We are downstream of whoever made those projections.
- Human behaviour
- Managers who stop setting lineups, teams that quietly tank, the trade that was definitely fair. A league where half the teams check out in November breaks every model in this category, including this one.
- Weeks where the whole league goes off together
- Each team's weekly score is drawn independently. Real weeks are correlated — everybody scores in a shootout week — and the engine has the machinery for that, switched off, because we haven't calibrated the size of the effect on real seasons yet. Until we do, it slightly understates how often the whole league moves at once.
- The shape of the tail
- Scores are drawn from a normal curve. Real fantasy scoring has a fatter right tail — the 180-point week is more likely than a bell curve believes. A skewed alternative is implemented and stays off until it beats the current one on real backtests.
- Games against the league median
- If your league plays an extra weekly game against the league median, we simulate only your head-to-head schedule, so the records inside our simulation won't line up with your league page's records.
- How lucky you have been so far
- Points already scored are history and are counted exactly. But a team that has been unlucky gets no credit for it in the odds — the model does not believe in regression toward the deserving.
None of that makes the odds useless — it makes them odds. The model is a careful reader of what has already happened and an honest guesser about the rest, and it tells you which is which.
Version history
What changed, and when
The engine is versioned, and every stored result records the version that produced it, so a season-long chart can never quietly mix two methods. Changes to the method move the middle number; performance work moves the last one.
2.1.1
Current2026-08-05Certainty gets an error bar.
- A clinch or an elimination is published together with the residual risk it rests on — the chance the claim is wrong — instead of as a fact.
- Games are simulated in a canonical order, so the same league produces the same odds no matter what order the provider happened to list it in. Before this, order alone moved a number by up to 2.5 points.
2.1.0
2026-08-05Boundaries get challenged, not believed.
- Any branch that lands exactly on nothing-or-everything is re-run at eight times the iterations, under a different seed, before anything is called clinched or eliminated.
- A Wilson confidence interval is attached to every published probability.
- Ties that survive the whole tiebreaker chain break on a seeded coin flip against a canonical order — never on the order teams arrived in.
- A bracket that cannot actually be played is now an error instead of a silent certainty.
2.0.0
2026-08-05Simulate scores, not outcomes.
- Rewrite. Every remaining game draws a score for each team, so points-for, head-to-head and every tiebreaker are live in every iteration instead of frozen at today's values.
- The playoff bracket is played out to a champion, so championship odds come from the same pass as playoff odds.
- Any game in the league can be pinned to a result — that is what the Scenario Explorer flips.
- Seeded generator: the same league and the same seed produce the same number, every time. Recalculating does not jitter.