How the numbers work
Where every number on this site comes from, what we calculate ourselves, and what the data can and cannot tell you. Definitions live in the glossary.
Where the data comes from
Three providers, each used for what it does best. WhoScored (Opta) supplies on-ball event data — every pass, touch, carry, tackle — which powers the pass maps, chance-creation chains, progressive passes, high regains and xT. Full event coverage runs from 2021-22; pass-level detail (the season pass map, F3 passes, touch maps) exists for 2025-26 only.
Sofascore supplies shot-level detail (location, situation, body part, xGOT), player season stats (minutes, goals, ratings, duels) and team match stats (possession, passing splits, goal kicks, PPDA inputs). FotMob supplies match xG and xGA, which we use for every season — all six seasons on one xG model, so cross-season trends compare like for like.
League results, fixtures and tables are cross-checked against official SPFL records.
What we calculate ourselves
Derived on this site rather than taken from a provider: xG difference, xG per shot and xGA per shot, points per game, per-90 rates, conversion rates, build-up chain lengths (passes from possession win to shot), the direct ↔ possession style index, territory heatmaps, all correlations (Pearson r with a Fisher-z 95% confidence interval and significance test), squad percentiles and ranks, and the xT credit assigned to passing, receiving and carrying (explained below).
Read with care
Providers disagree. Different companies define events differently and xG models vary — a gap under ~10% between seasons or sources can be the model, not the football. Small samples lie. Conversion and finishing numbers swing hard on few shots; we flag or floor low-minute players, and correlations always show n and significance — grey means the sample is too small to trust, whatever the r value. Correlation isn’t causation. Teams that are winning pass more; passing more doesn’t make you win. Nothing here is controlled for opponent quality or game state, and we say so on the charts. Build-up chains are the tracked subset. Penalties, corners, set pieces and solo goals have no passing move to measure, so chain stats describe open-play passing moves only. PPDA is a proxy. It counts how often defensive actions happen relative to opponent passes — it cannot see whether the press is well-structured.
The idea: every spot on the pitch has a danger level
Imagine the pitch as a heat map. With the ball deep in your own half, almost nothing happens next — a goal in the next few moves is very unlikely. At the edge of the opponent’s box, the temperature is completely different. Expected threat (xT) simply puts a number on that: for each zone of the pitch, how often does having the ball there lead to a goal within the next handful of actions?
Once every zone has a danger value, you can score any action that moves the ball: value of where the ball ended up, minus value of where it started. A pass from halfway to the edge of the box moves the ball from a cold zone to a hot one — that difference is the threat the pass added. We use the same zone values for every match and every season.
The zone values come from a published grid (Karun Singh’s 12×8 expected-threat grid, built from hundreds of thousands of top-flight matches). We deliberately did not fit our own grid from Aberdeen’s ~200 matches — one club’s sample is far too noisy, and a home-made grid would just bake in our own quirks.
How each category is credited
Passing. Completed passes that move the ball somewhere more dangerous. The credit for a threat-adding pass is split 50/50 between the passer and the receiver — a through-ball only works because someone made the run to take it. Safe sideways or backward passes score zero, not negative: we measure threat created, we don’t punish keeping the ball.
Receiving. The receiver’s half of those same passes. This rewards players who get into dangerous spots to take the ball. Honest caveat: with event data we only know where the ball was received, not the quality of the run that got them there — that would need tracking data nobody publishes for Scotland.
Carrying. Opta-style event feeds don’t record carries directly, so we read them from the gaps: when the same move’s next touch happens five or more metres from where the last action ended, somebody moved the ball there with their feet. The player who carried it gets the change in danger between the two spots. Successful dribbles past an opponent show up through the same mechanism.
Shooting. Shots deliberately get no threat credit — shot quality is what expected goals (xG) is for, and mixing the two would double-count. Shooting is shown as goals (all seasons) plus real Sofascore xG where it exists (2025-26 only; we never estimate xG for seasons that don’t have it).
Ball-winning. Tackles won, interceptions, recoveries, clearances and blocked passes, counted per 90. This is a simple count, not a threat value — putting an honest value on defensive actions needs a possession model we’re not pretending to have. It answers “who does the interrupting?”, not “how much is it worth?”.
Percentiles: read the small print
The small numbers (and the player wheels) are percentiles vs same-position players in our own dataset — every Aberdeen player-season with 450+ minutes since 2021-22. A 90 means “90% of comparable Aberdeen player-seasons did less of this per 90”. It does not mean top 10% of the league: this is a single club’s sample, a few dozen players per position, so treat percentiles as a fingerprint of a player’s style and role, not a league rating.
Roles and “plays like”
The role label on each profile (“ball-winning destroyer”, “deep-lying playmaker”, “goal poacher”…) is a plain-English description, not a new score. It reads the same five percentiles — this time against the player’s finer slot (centre-backs vs centre-backs, full-backs vs full-backs, and so on) — and names the trait that stands out. A defensive midfielder whose ball-winning percentile towers over his passing is a destroyer; one whose passing leads is a deep-lying playmaker. When nothing stands out, we just use the position word. No made-up numbers, no ratings — the label only puts a name to what the percentiles already show.
“Plays like” finds the nearest player-seasons in our own history by those five percentiles, within the same position. It answers “who in recent Aberdeen sides had this shape?” — a similarity within one club’s data, not a global comp.
What this data is — and isn’t
Built from on-ball event data (every pass, touch, shot, tackle) for 2021-22 onward — 185 of 190 league matches; 2020-21 predates our event coverage and has no value layer. Event data sees the ball, not the other 21 players: no off-ball runs, no pressing traps, no shape. Per-90 numbers use minutes in covered matches only, and players need meaningful minutes before per-90 figures mean much.
The recruitment ledger
How every signing since 2020-21 got its verdict in the recruitment ledger — a look back at whether each one worked, not a crystal ball. (The ledger page is currently retired from the nav; the method is kept here because the same value layer powers the player profiles.)
Three things we score, two things we don’t
1. Did they play? Minutes are the cheapest and most honest test of a signing — managers pick players they trust. We use the player’s best single-season share of available minutes: 55%+ of minutes earns full marks, 30%+ partial.
2. Did they add threat? The value layer above, compared with positional peers: percentile for passing, receiving and carrying — plus finishing for forwards, ball-winning for defenders and midfielders. 60th+ percentile earns full marks, 35th+ partial. Signings without enough minutes in event-covered matches (and everything in 2020-21, before our event data starts) show a dash and are scored on the other dimensions only.
3. What happened to the money? Fee out vs fee in. Sold at a profit of £0.5m+ is full marks; sold at any profit, or still at the club and playing, is partial; bought for a fee and released for nothing is zero. Known hole: we have no wages data, so every signing’s true cost is understated — a “free” on big wages is not free. We say this rather than pretend otherwise.
Age is context, not points. A 20-year-old development buy and a 30-year-old win-now buy fail differently: one was bought to resell, the other to produce immediately. The ledger labels each signing’s profile so you read the verdict in the right light, but doesn’t pretend to price it.
Regimes are the rollup. Five recruiting regimes in six seasons — signings grouped by the manager they arrived under, with hit rates per regime. With samples this small the windows tell the story as much as the rate.
Why tiers, not scores
Each signing lands in one of four tiers — Hit / Solid / Squad-filler / Miss — from its share of available points (75%+ / 50%+ / 25%+ / below). A 0-100 rating on a sample of 19 signings would be false precision; coarse tiers are what the evidence can actually support.
Also deliberately excluded: on/off-pitch splits (too noisy at one club), any guess at what a different signing would have done (no counterfactual is knowable), and wage estimation (we’d be making numbers up).