Team ELO→Match rating 0-100→Context & result→Match quality→Level 0-1000
Every finished match updates the numbers in this order. All data is collected and processed by Sharp Lab.
1Team strength (ELO)
Every team has an ELO rating that moves after each match. A team starts with the typical level of the first competition it appears in, and the home team gets a +100 advantage.
Ehome = 11 + 10−(Rhome − Raway + 100) / 400
R′ = R + K · G · (W − E)
Wresult: 1 win, 0.5 draw, 0 loss
Kcompetition weight × round (final ×1.25, semi-final ×1.125, quarter-final ×1.0625, last 16/32 ×1.03)
Ggoal margin: 1 if the difference is 0-1, 1.5 if 2, (11 + diff) / 8 if 3 or more
2Match rating (0-100)
Each player gets a score in ten areas: involvement, finishing, attacking presence, chance creation, passing, ball carrying, defending, duels, discipline and goalkeeping. Every stat x is scaled between a "worst" and a "best" value and averaged with its weight w:
s = 100 · clipx − worstbest − worst area = Σ wj sjΣ wj
The areas are combined with weights that depend on the position (finishing counts most for a striker, goalkeeping for a keeper). The result is compared with players in the same position and with similar minutes (0-29, 30-59, 60+):
rating = 60 + 12 · z, z = raw − μposition, minutesσposition, minutes
An average performance is 60 and every standard deviation adds or removes 12 points. Players with fewer than 10 minutes get no rating.
3Context and result
The rating is then adjusted by who you played and how the match ended (R = team ELO):
context = 3 · tanhRopp − Rteam300 + 3 · tanhR̄ − 1320250 + 2 · tanh(ln K28) max ±6
result = [ ±1.5 + 2 · (W − E) + tanhgoal diff3 + defence ] · minutes900.5 max ±5
R̄average ELO of both teams: a match between strong teams scores higher
W − Esurprise: winning when you were expected to lose adds more
defence+1.5 for a clean sheet, −0.5 per goal conceded, weighted by position (keeper 100 %, centre back 80 %, full back 60 % … striker 0 %)
4Match quality
Not every match counts the same. A factor q between 0.7 and 1.5 gives more weight to strong leagues, strong opponents and important games:
q = clip( level · opponent · importance · result, 0.7, 1.5 )
level = e0.7 (R̄ − 1320) / 400 opponent = e0.15 (Ropp − Rteam) / 400
importance = (K / 28)0.1 result = 1 + 0.03 · tanh(goal diff / 3)
5Level (0-1000)
The level is a running rating, like ELO for players. Each match moves it towards that match's rating r = 10 · rating · q. New players start at the average of their league, μ.
Rnew = (1 − k) · Rbefore + k · r, k = minutes90 · max(0.06, 0.31 + n / 20)
Early in a career each match moves the level a lot; after many matches (n = full matches played) it becomes stable. Long breaks pull the level back towards the league average:
Rbefore = μ + (Rlast − μ) · 0.9months without playing − 1
The level shown also takes into account how many matches the player has, so a few great games are not enough to reach the top:
Level = μ + (R − μ) · 0.9months since last match − 1 · nn + 15
6What you see on the page
| Item | Meaning |
| Level | Current level (0-1000). Only players with a match in the last 6 months. |
| Trend ▲ ▼ | Change in level over the last 5 matches (arrow from ±1.5). |
| Prime level | Highest level reached since 2016, once the player has about 20 full matches. |
| Form ■■■■□ | Last 5 matches compared with the expected level, from 1 (worst 10 %) to 5 (best 10 %). |
| Areas | Percentile of each area among active players (50 = median). |
| Charts | From 2016: match data before 2016 is incomplete and not shown. |