Clark desk · DallasThursday, September 24, 2026

The Saturday Slate

FBS board for Saturday betting as entertainment. A transparent rating versus the posted number — not a lock, not “super accurate,” not a promise to beat Vegas.

How the desk works

This is a Saturday board, not a tout sheet. We take a public power rating, turn it into a predicted margin, and set it next to the market number ESPN is already showing. If the gap is large enough, we print a side. If it is not, we say so. The switch at the top moves the same desk to the NFL. College stays the default.

The rating

CFBD enrichment is off. No API key and no ratings cache, so these numbers are ESPN FPI only.

Default fuel is ESPN Football Power Index (FPI), pulled from ESPN's public power-index feed. FPI is already on a points scale: expected margin against an average opponent on a neutral field. We did not invent a neural net and we do not hide a secret sauce.

CollegeFootballData is optional, and it is not called when you open the board. A refresh script writes data/cfbd-ratings.json. The desk reads that file. No key, or no file, and every number stays on ESPN FPI. The note above is that state, right now.

A full refresh makes 6 calls: season PPA, the 247 talent composite, regular-season games (for scoring margin), then one probe each of Elo, SP+, and SRS. SP+, Elo, and SRS are opponent-adjusted. A free key often gets 403 on those probes. The refresh records the status and keeps the free fields. Do not run it on a timer inside the app. Once a week in season is 6 calls, about 24 a month, well under the 1,000-call free tier.

The CFBD number is a weighted average of whatever came back. SP+ and net PPA (offense minus defense, times 65 plays) share weight 4. Elo — converted as (Elo − 1500) / 25 — and SRS share weight 2. Scoring margin and talent are light priors (weight 1). That number is then averaged with ESPN FPI. Same home field, same edge bands, same moneyline rule.

FCS visitors usually have no FPI row. We park them at -12 so the card still has a model number, mark it thin data, and do not print an ATS ticket. A placeholder is not a scouting report, and Week 1 cupcake lines will not be faded on a guess. A real CFBD row does not change that: if either side is FCS, there is still no ATS ticket.

The formula

predicted home margin = home rating − away rating + 2.5 home-field
(home-field drops to 0 on a marked neutral site)
edge = predicted home margin − Vegas home margin
Vegas home margin = −(posted home spread)

Example: home FPI 18, away FPI 8, home favorite −7.5. Predicted margin is 10 + 2.5 = 12.5. Vegas has the home team by 7.5. Edge is 5.0 toward the home side.

When we bet, when we pass

Against the spread is the primary ticket. We only highlight a side when |edge| is at least 1.5 points. Inside that band the card says no bet / too close. Confidence is a short label, not a fake 67.3%:

If a rating is imputed (typical FCS visitor), we still print the model number and mark thin data, but we do not issue an ATS ticket. Confidence labels only appear on full-data sides.

Moneyline: we take the team the model thinks wins by 2 or more points. That can print even when the spread is a no-bet — you can agree with the number and still have a side to win the game.

Totals: we do not have a real offensive/defensive pace model, so we do not guess the over/under. The board will show the posted total when ESPN has one and leave the pick blank.

What we do not claim

Beating a coin flip over a long season is the bar we are aiming at. Beating closing lines for years is a different sport, and this desk does not promise it. Week 1 is mostly preseason ratings. The college number does not use injuries, weather, or rest. Lines move; we snapshot whatever ESPN is publishing when the page loads and keep a copy so we can grade the number we actually showed.

The NFL number

nflverse enrichment is off. There is no ratings cache, so these numbers are ESPN FPI only. Run npm run nfl:refresh.

The NFL board uses the same cards, the same lock, and the same parlay desk. The math is separate, because an NFL closing line is tighter than a college number. Default fuel is still ESPN's public FPI. The extra fuel is a file on disk, data/nflverse.json, written by npm run nfl:refresh. Opening this page does not download it. No file, and every NFL number stays on ESPN FPI. The note above is that state, right now.

A refresh is 23 downloads from the nflverse-data GitHub releases, no API key. The schedule (closing spreads, totals, rest, roof, wind, the quarterback who actually played). One team-week file and one player-week file per season, current year and five back. Depth charts and injury reports for the recent seasons, so a starter change is known before kickoff. The cache keeps quarterbacks only. Play-by-play is about 20 MB a season. We measured success rate, early-down EPA, and a garbage-time filter from that file offline. They did not help, so the refresh does not download it.

The team number is net EPA per game, shrunk toward last season (6 games of prior, so Week 1 is last year and Week 3 is still mostly last year). If the expected starter is someone else, we add the difference in passing EPA before the scale. The expected starter is the first quarterback on that week's depth chart who is not Out or Doubtful. With no chart, we keep last week's starter unless he is Out or Doubtful, and then we use a league-average passer. The same starter changes nothing. Multiply by 0.52 to put it in points. When both that and FPI exist, we average them, so the quarterback term is halved on the live card. The holdout below is the EPA side alone. Historical FPI is not in the free file. Home field is +2.4, or 0 on a neutral site. Rest is 1.2 points per extra week, capped at two weeks. Wind is on the deep dive for outdoor games and stays out of the formula. Domes and closed roofs are skipped.

epa points = (net EPA per game + quarterback adjustment) × 0.52
rating = average of ESPN FPI and epa points, or whichever one we have
predicted home margin = home rating − away rating + 2.4 + rest
edge = predicted home margin − Vegas home margin

Worked example, both fuels on, same starter, no rest gap: home FPI 6 and EPA net +8 (that is 4.2 points), away FPI 2 and EPA net +1. Blended ratings are 5.1 and 1.3. Add home field and the model has the home team by 6.2. The posted home spread is −1, so the market has the home team by 1. Edge is 5.2 toward the home side, which prints as Lean.

The no-bet band is 5 points. College uses 1.5. Lean is 5 up to but not including 6.5. Play is 6.5 up to but not including 8. Strong is 8 or more. Those are sizes of the disagreement. The wider band is there so the board shows fewer tickets. A Strong tag is a bigger gap. On the holdout it was not a better bet.

The NFL model has not beaten the market. Ratings for each game used only earlier weeks. Home field, the 0.52 scale, and the rest term were frozen on 2022–2023, and even on those seasons the close was closer. The quarterback rule was not refit. The holdout is 2024–2025, 544 real nflverse closing lines. Mean absolute error was 10.25 points for the model and 9.67 for the close. ATS at a 5-point edge was 87 bets and 51.7%. That sample is noise: a couple hundred bets at 52% would still be noise, and −110 needs 52.4% to break even. The old 3-point line was 209 bets at 47.4%. We still print a side past 5 so the ledger can track it.

nflverse publishes the closing spread, not an opener. There is no free historical open in that file, so this backtest cannot measure closing-line value. The check that matters is the close itself. On 2022–2023 the mix that minimized error put the entire weight on the close. In 2024–2025, when the model disagreed with the close, it was slightly more often wrong. A live lock still records CLV once the game is final and the cache has that closing spread, flipped into the home betting number. We do not copy the live ESPN number into CLV.

Totals stay off the ticket. The same holdout, with a simple offensive-and-defensive EPA total fit on 2022–2023, missed the final score by 10.35 points. The closing total missed by 10.06. On outdoor games, wind barely correlated with the spread residual (about −0.02) or the total residual (about −0.04). High-wind games were not a side or a total versus the close.

Moneyline still fires when the model wins by 2 or more, same rule as college. That is a display rule. It is not a claim of an edge.

The ledger

After a game goes final, ATS and moneyline tickets grade themselves from the score. Pushes count as pushes. No-bets do not go in the record. The season line sits on the home board and the ledger.

The deep dive

Double-click a card, or tap Details, for that game. The page repeats the market, the model number, and the reason in plain English. It is the same math as the card. Recent form and FPI come from the public ESPN feeds. If those feeds have no current injury report, the page says so instead of guessing.

You can lock the ATS or moneyline ticket into the ledger. An ATS lock stores the spread as line at lock and the juice when ESPN printed one. A moneyline lock stores the price. Closing-line value stays empty until we actually have a close. We do not fake one. An imputed FCS rating still cannot be locked against the spread.

The parlay desk

The parlay desk stacks two or more of those tickets. A leg has to be locked already, or it has to clear the same rules as a lock. Saving a board leg freezes it into the ledger at the number ESPN is showing then. We do not fill in −110 when the price is missing, and we do not invent a closing line.

decimal = 1 + american / 100 when the price is plus
decimal = 1 + 100 / |american| when the price is minus
parlay decimal = decimal × decimal × …
profit = stake × (parlay decimal − 1)

The American number on the slip is that decimal, rounded. The payout uses the unrounded product. One loss kills the ticket. A push or a void drops that leg and the rest still count. If two markets from the same game are on the slip, or several games from one conference, or a stack of big favorites or home dogs, the desk says so in plain English. That is a warning. The only ticket it refuses is the same game and market twice.

The Saturday Slate · CFB desk