The short version
A player's score is his 2025 statistics multiplied by your scoring rates and added up. Nothing is fetched from a fantasy provider, nothing is cached from a previous season's settings, and no number is rounded before the end.
That matters because the obvious alternative, asking ESPN for a points total, does
not work. Without a league attached, ESPN returns appliedTotal: 0
for every player. The raw counting stats are there; the points are not. So the
arithmetic happens here, which has the useful side effect that it happens under
your rules rather than a default someone else chose.
Change a rate in Scoring & Roster and every board, ranking and recommendation moves with it on the next query. There is no stored per-player total to go stale.
How a score is made
Most rules are worth a fixed amount per unit, so scoring is a multiplication and a sum. Below is the PPR preset in full: every rate the app ships with. Negative rates are shown in red, as a ledger would.
| Stat | Points | Stat | Points |
|---|---|---|---|
| pass_yds | 0.04 | fg_0_19 | 3 |
| pass_td | 4 | fg_20_29 | 3 |
| pass_int | -2 | fg_30_39 | 3 |
| rush_yds | 0.1 | fg_40_49 | 4 |
| rush_td | 6 | fg_50_59 | 5 |
| rec | 1.0 | fg_60 | 5 |
| rec_yds | 0.1 | fg_missed | -1 |
| rec_td | 6 | pat_made | 1 |
| fumbles_lost | -2 | def_sacks | 1 |
| two_pt_pass | 2 | def_int | 2 |
| two_pt_rush | 2 | def_fum_rec | 2 |
| def_td | 6 | def_safeties | 2 |
| def_blocks | 2 |
Worked example
The best PPR receiver of 2025, scored line by line. This is the whole calculation. There is no adjustment underneath it.
| Receptions | 129 | × 1.0 | 129.00 |
| Receiving yards | 1,715 | × 0.1 | 171.50 |
| Receiving touchdowns | 10 | × 6 | 60.00 |
| Rushing yards | 105 | × 0.1 | 10.50 |
| Rushing touchdowns | 1 | × 6 | 6.00 |
| Fumbles lost | 1 | × -2 | -2.00 |
| Total | 375.00 |
Reconciles. The stored reference column reads 375.00. Half-PPR 310.50, standard 246.00.
Banded scoring
Two stats cannot be scored at a rate per unit. A shutout is worth far more than twice as much as allowing seven points, and no single multiplier can say that. So points and yards allowed are scored in bands instead: the defence lands in one band and collects its value.
| Allowed | Points | Allowed | Points |
|---|---|---|---|
| 0 | 10 | 28-34 | -1 |
| 1-6 | 7 | 35+ | -4 |
| 7-13 | 4 | ||
| 14-20 | 1 | ||
| 21-27 | 0 |
| Allowed | Points | Allowed | Points |
|---|---|---|---|
| under 100 | 5 | 350-399 | -1 |
| 100-199 | 3 | 400-449 | -3 |
| 200-299 | 2 | 450-499 | -5 |
| 300-349 | 0 | 500+ | -6 |
Two rules the bands obey
- Defences only
- A band applies to a defence and to nothing else. Every offensive row in the database carries points allowed of zero (zero, not blank), so without this rule a quarterback lands in the shutout band and is paid for it.
- Once per game
- A defence collects its band every week, so across a season it is paid seventeen times. The season row therefore holds a per-game average for these two columns and season totals for everything else. Fed a season total of 300-plus points allowed, every defence in the league lands in the bottom band and the category that most separates them stops separating them.
The band had no position gate and was paid once for the whole season. Every non-defence scored 15 points too high and every defence roughly seventeen times too low on its biggest category. Two errors pushing the same way, so defences ranked far below where they belonged. Both are fixed, and the test suite now scores every player with the bands set and again with them cleared to prove it stays fixed. If you drafted using this app before that date, the defence rankings you saw were wrong.
Worked example
| Sacks | 68 | × 1 | 68.00 |
| Interceptions | 10 | × 2 | 20.00 |
| Fumble recoveries | 3 | × 2 | 6.00 |
| Defensive touchdowns | 1 | × 6 | 6.00 |
| Blocked kicks | 2 | × 2 | 4.00 |
| Points allowed | 18.3/g | band 1 × 17 | 17.00 |
| Yards allowed | 303.2/g | band 0 × 17 | 0.00 |
| Total | 121.00 |
Reconciles. 303.2 yards a game falls in the 300-349 band, which is worth nothing, so the yards line contributes zero here even though it is scored.
The stat line
Thirty-nine columns are available to score. The app reads them from the database schema rather than a hard-coded list, so a column added to the database appears in the rules form by itself.
- Passing
- pass_att · pass_cmp · pass_yds · pass_td · pass_int · pass_1d · two_pt_pass
- Rushing
- rush_att · rush_yds · rush_td · rush_1d · two_pt_rush
- Receiving
- targets · rec · rec_yds · rec_td · rec_1d
- Loose ball & misc
- fumbles · fumbles_lost · sacks
- Kicking
- fg_made · fg_att · fg_missed · fg_0_19 · fg_20_29 · fg_30_39 · fg_40_49 · fg_50_59 · fg_60 · pat_made · pat_missed
- Defence
- def_sacks · def_int · def_fum_rec · def_safeties · def_td · def_blocks · points_allowed · yards_allowed
Carried but not scored by default
Twelve of the thirty-nine have no rate in any preset. They are stored, shown in the full-stats view, and available to score if your league does. They simply default to nothing so that nobody is quietly awarded points for a pass attempt.
fg_att · fg_made · fumbles · pass_1d · pass_att · pass_cmp · pat_missed · rec_1d · rush_1d · rush_att · sacks · targets
Note that fg_made and fg_att are deliberately
unscored: field goals are already paid by distance band, and scoring both would pay
every kick twice.
Season and week
Each player has one row per week plus a week 0 row holding the season. Everything the draft board shows reads the season row. Of 44,515 rows, 1,879 are actual season lines and 22,243 actual weekly; the remainder are ESPN's own projections, kept for reference and never mixed into a score.
Presets
Five scoring presets and seven roster shapes, all editable after you load one.
| Preset | Differs from PPR by |
|---|---|
| ppr | the baseline |
| half_ppr | a reception is 0.5 rather than 1.0 |
| standard | a reception is 0 |
| ppr_6pt_pass | a passing touchdown is 6 rather than 4 |
| superflex | a passing touchdown is 6 rather than 4 |
| Shape | Starters | Bench |
|---|---|---|
| standard | QB RB×2 WR×3 TE FLEX K DST | 6 |
| superflex | standard + SUPERFLEX | 6 |
| two_qb | QB×2 RB×2 WR×3 TE FLEX K DST | 6 |
| flex_heavy | QB RB WR×2 TE FLEX×3 K DST | 6 |
| best_ball | QB RB×2 WR×3 TE FLEX | 12 |
| dynasty | superflex + 3 IR | 12 |
| small | QB RB×2 WR×2 TE FLEX | 3 |
A tight-end premium is deliberately absent. It would need its own mechanism to be right, and an approximation that is wrong for every league is worse than its absence.
The 2026 score
Separate from scoring, and read it differently. The 2026 column is a percentile rank within position, 1 to 100. It starts from a player's own points per game over recent seasons and adjusts for the circumstances he is walking into: strength of schedule, playing environment, and how available he has been.
Every component is stored beside the score, so it is never a black box. What is worth knowing is how little the circumstances are actually worth. Measured across four seasons and 27,218 player-games:
| Factor | Real size |
|---|---|
| Home vs away | +1.6% to +2.4%, consistent direction |
| Indoors vs outdoors | WR +5.3% (n=2,970); other positions about 2% |
| Grass vs turf | ±0.5-2.4%, and the direction flips by position: tight ends better on grass, receivers on turf. That inconsistency is the signature of noise. |
| Strength of schedule | One matchup swings a lot (Arizona allowed running backs +18.6%, Kansas City -11.4%), but over 17 games it converges to a season spread of just 3.9 to 7.0%. |
| Baseline points per game | Varies more than 300% between the best and worst startable players. |
That last row is why circumstances are applied as multipliers on production rather than scored as separate weighted components. An earlier version weighted schedule at 50% and percentile-scaled it, which inflated a 5% real difference into the same range as a 3× production difference, promoting noise to the headline number. The widest circumstance swing in 2026 is about 11%: Dallas receivers with ten indoor games sit at 1.057, Pittsburgh receivers with none at 0.951.
Why environment is measured per position, never per player
One season gives a player a median of 3.5 indoor games and 6 on grass, and weekly fantasy scores swing from 3 to 30 points for the same man. A player-level "plays well indoors" split from that sample is noise wearing a suit. Worse, 67% of a team's games on its home surface are home games, so surface and home advantage are badly confounded. Pooling every player-game by position across four seasons gives thousands of observations instead of a handful.
Two numbers that differ, on purpose
The scouting table shows a PTS column and, once a draft is selected, a league points figure. They are not the same number and are not meant to be.
- PTS
- A fixed reference computed when the database was built, under standard PPR. It never changes and lets you compare against the rest of the world.
- League points
- Your rules, applied live. This is what the board ranks by and what the recommendations use.
For offensive players under the PPR preset the two agree to the penny. Two places they legitimately part company:
- Defences, because the reference column scores points allowed but not yards allowed, while the preset scores both. Houston's defence reads 114 as a reference and 148 under the preset. The difference is 2 points a game for holding opponents under 299 yards, seventeen times over.
- Kickers who touch the ball. Brandon Aubrey ran once for six yards on a trick play. The reference column only sums kicking; your league scores the rush, so he reads 0.6 higher. The league figure is the correct one.
What to distrust
Listed plainly, because a number you cannot calibrate is worse than one you can.
- Mid-season trades
- ESPN reports one team per player per season, so a traded player's pre-trade opponents are attributed to the wrong team. His schedule adjustment is wrong.
- Rookies
- No history, so no 2026 score at all. They are flagged as rookies in the scouting table and you are on your own for them.
- Kickers and defences
- Scored properly for 2025, but not projected forward. The 2026 column is blank and the ranking is last season's production under your rules.
- Injury status
- Preseason-noisy. Half the league carries no status at all and only 4.4% are questionable, so that flag costs just 3% here. Injured reserve, out and suspension carry real penalties.
- Target share
- An estimate. Team totals are reconstructed from ESPN's weekly rows, which reach 26.7 carries per team-game against a real 26, but only 30.2 targets against a real 33, because ESPN's player universe omits fringe pass-catchers. The shortfall spreads across backups so the leaders barely move, but it is an estimate.
- Weekly advanced figures
- Wild, and deliberately not surfaced. Only season aggregates are shown. A receiver with one carry can read 45 yards after contact per attempt, which is true and useless.
- Average draft position
- ESPN resets it after a completed season. It comes back as a constant 170.0 with an auction value of 0. The draft rank and auction value columns are used instead.
- Yards per route run
- Absent, not missing. No free source publishes routes run per receiver, and deriving it from who was on the field would flatter receivers and punish tight ends and backs who stay in to block.
The scoring is exact. It reconciles to the penny and you can check any player by hand from the tables above. The 2026 score is a ranking of how favourable a player's circumstances look, not a prediction of what he will do. An 81 against a 76 is well inside the noise.