Every number on CompactStats is a calibrated probability: when we say 60%, we mean it should land about 60% of the time — and we test that claim on tens of thousands of past matches before anything ships. This page explains the machinery, and just as importantly, the situations where we refuse to make a pick.
Results, fixtures, half-time scores, odds and (where available) expected-goals data for 110+ leagues and 31 cups across five seasons, refreshed several times a day. Ratings use finished league matches only; cup games appear in team histories but never contaminate league rates.
Each team contributes a season rate — venue and overall evidence pooled, then shrunk toward the league average with the weight of ~32 games, so tiny samples cannot scream certainty. For a team's first 14 games, last season's rate blends in and fades out — after first being pulled toward the league average with the weight of 34 games, because a single season is part form and part luck. The match estimate is 40% home rate + 40% away rate + 20% league rate; recent head-to-head meetings nudge it up to 10% toward their pattern; and 30% of a Poisson goal-expectation model is folded in (expected goals for each side from attack against defence, using real xG where the league has reliable coverage — it strips finishing luck). Season openers are docked 2.5 points — measured on 2,727 of them, first games run cagey. BTTS is additionally squeezed toward the league mean; it is genuinely the hardest market to predict and pretending otherwise miscalibrates it.
We replay the whole model match by match, using only what was known before each kick-off — a replica that reproduces the ratings we actually published to the percentage point. Across 97,729 matches from 2023 to 2026 the middle of the scale was accurate, but the under side was not: in every season, a rating in the high 30s came in about four points higher, and a 30% about three. So ratings below a pivot — 55% for over 2.5 and BTTS, 45% for over 3.5 — are now lifted part-way toward it. The top of the scale is deliberately left alone: there the error swings from season to season, so "correcting" it would only learn one year's noise. Tuned on 2023–24 and judged only on 40,705 later matches, this cut the over-2.5 bias from −1.7 to −0.7 points. It also changes some calls: a few percent of fixtures we would have called under are now rated, honestly, as slightly more likely over.
The same replay found our ★ high-confidence ratings ran about five points hot in the first three games of a season — the model cannot see summer transfers or a new manager, and no tuning closed that gap. So a ★ now needs both sides at least four games in. Ratings published before this change keep the numbers and stars they were published with.
Pure Poisson: each side's expected goals generate a full score-probability grid, which sums to home/draw/away probabilities. The pick is whichever outcome is most likely, and the edge column compares our probability with the bookmaker's after stripping their margin. Why you will almost never see a draw pick — and why that is correct — is a study of its own.
Honesty means knowing when the model has nothing to say. We make no pick on: European qualifier rounds (graded a coin flip across 1,150 historical games — the audit); cup ties where either side has fewer than 3 league games this season; games where our own outlier boards contradict the call; and any over 3.5 rating below 45%. The percentage stays on show for information — we just do not put our name to a pick.
Until 8 August 2026 we also called Under 3.5 whenever the rating fell below 28% — 44% of every fixture list. Those calls were landing at 75%. We removed them anyway, because saying "under 3.5" on every game in football scores about 70%: the call was beating a coin that lands on its own about seven times in ten, and five points of that is not skill worth publishing. Deleting a 75% record makes our numbers look worse and our claims truer, which is the trade we will make every time.
Finished games are graded against official results. Live-captured finals grade provisionally after 25 stable minutes and are locked in by the official sync. And since 31 July, every rating is frozen before kick-off: the first data refresh within 12 hours of a game locks its rating and pick into a version-controlled ledger, and graded rows display those frozen numbers forever. The latest 30 days of that ledger are graded, market by market, on our record page. Model improvements apply from that moment forward — they never rewrite what you saw. The daily and weekly combination selections freeze the same way each morning.
The model reads goals, not team news: it knows nothing about injuries, rotation, motivation or weather. Probabilities are long-run frequencies, not promises about single games — a 70% call failing three times in a row is consistent with 70%. Odds shown are a snapshot and move. This is a research tool, not betting advice.