PlayMaker

A rating is a summary of what was recorded, not a verdict on a footballer

How PlayMaker turns a match log into a number between 1 and 99, why the number moves when nobody has played, and the three places the arithmetic deliberately refuses to flatter anyone.

David Avramovic 5 min

Every scouting platform shows you a number. Almost none of them will tell you how it was made, and the reason is usually that the answer is embarrassing: somebody typed it, or a model nobody can inspect produced it, or it is an average of other people’s opinions wearing a decimal point. This is how ours is made. It is arithmetic, it is in the repository, and where it refuses to give somebody a good number that refusal is the point of it.

Counting stats are not the input

The pipeline starts with what a match log actually contains — appearances, minutes, goals, assists, tackles, interceptions, duels, distance — and immediately converts every volume figure to a per-90 rate. That first step is doing more work than it looks like it is doing. A squad player with 2,400 minutes will out-total a better player who missed half the season, and a platform that ranks on totals is measuring availability and calling it ability. Availability is worth knowing and we report it separately; it is not the same question.

The per-90 rates are then scaled onto a 0–99 range, combined into six attributes — pace, shooting, passing, dribbling, defending, physical — and weighted into one overall figure according to the role the player actually plays.

The first refusal: small samples are pulled toward the middle

Two goals in a single 45-minute appearance is a rate of four goals per 90. Taken at face value that is a finishing attribute of 99 and a striker who has never started a match sitting at the top of your search results. So every attribute is shrunk toward the baseline for that position, and how hard it is shrunk depends on how much football is behind it.

The baselines are per-role and every role is solved against its own weights, which is a detail worth one sentence because getting it wrong is invisible: if you level the baselines by shifting all six attributes equally, a striker’s baseline shooting lands around what thirteen goals in a season earns, and an empty profile finishes level with a real one. Nobody sees that on a screen. A test sees it.

The second refusal: unchecked evidence is discounted, by name

How much football it takes before a rate is believed at face value is not one number. It depends on who stands behind the figures. An official fixture record is calibrated at roughly a full season — 1,350 minutes. A coach confirming their own player needs about 40% more than that, because a coach is real evidence and also an interested party. A camera or a GPS vest sits further out again at 2,400: it is a measurement rather than a claim, but nothing has reconciled it against a fixture record and a tracker cannot tell a cup tie from a friendly.

A figure the player typed in themselves needs 3,400 minutes — roughly two and a half seasons. That is close to unreachable on purpose. A self-reported record can climb toward the middle of the scale and never quite earn the top of it, because nothing about it has been checked by anybody. The effect on a real profile is a few points, not a collapse: it is a discount for unverified evidence, not a punishment for being new, and the way to remove it is to get somebody to confirm the numbers rather than to play more football you have already played.

The third refusal: unrecorded is not zero

This one shipped broken and is worth telling on ourselves for, because it is the failure every platform in this category is one schema decision away from. The stats table stored every metric as a number defaulting to zero, so a metric nobody had ever collected and a metric measured at zero were the same byte, and the engine read both as zero.

The consequence was the exact inversion of what this product sells. A nineteen-goal season imported from a federation feed — appearances, minutes, goals, assists, and nothing else, because that is what a federation feed contains — rated 13, while an empty profile that had never played a match rated 53. Verifying the import made it worse, dropping it to 13 from 25, because verification removes the shrinkage that had been hiding the missing columns. Better evidence, worse number.

Attributes are now composed only from the terms that were actually recorded, with the weights renormalised over them. The same season rates 63, and confirming it raises the number instead of lowering it. What each source supplied is stored explicitly rather than inferred from whether a value is above zero, because "did not score" and "nobody imported goals" are different facts about a striker.

Goalkeepers are rated on goalkeeping

For a while they were not. There were sixteen metrics and not one of them described keeping goal, so a keeper’s defending — 42% of their overall — came from defensive actions, interceptions and aerial duels, and the only keeping-adjacent input was clean sheets, which is mostly a property of the defence in front of them. On honest numbers a full verified season rated 23. Shots faced, saves, goals conceded, post-shot expected goals faced, claims, sweeper actions and launch accuracy are now columns of their own, and elite and poor keepers separate by around fifty points instead of six.

What the number is for

It is a way of putting two players on one axis long enough to decide which of them is worth ninety minutes of somebody’s Saturday. It is not a valuation, it is not a prediction, and it is not a judgement of a sixteen-year-old’s ceiling. Every figure it is built from carries the label of who vouched for it, and when the model itself changes, the player’s progress chart gets a marked point saying so — because from the player’s side, a number moving for a reason they were not told about is indistinguishable from their own football having changed.