RPIX 2.2

How the ranking works

Version 2.2, adopted 1 October 2026. Provisional until the backtest. A score from 0 to 100 for Salvadoran players who are actually playing.

RPIX in one minute

RPIX rates Salvadoran footballers around the world from 0 to 100.

It looks at four things. What a player produces in matches counts the most.

Then how much he plays, and in which league. Then his market value, and whether a young player already has a big role.

Players are compared with others in the same position. A goal means something different for a striker and for a goalkeeper.

Every rule is the same for every player. Nothing is changed for one name.

  • Performance 45% what he produces in matches
  • Playing level 30% how much he plays, and where
  • Market 15% market value
  • Prospect 10% young and already playing

Who gets ranked

A player needs 270 league minutes this season: about 3 full matches.

With fewer minutes, a rating says more about luck than about the player.

"Not ranked" does not mean "bad". It means we do not have enough matches yet. His page still shows his numbers.

What counts and what does not

Counts

  • Minutes played, and how much of his club's league matches that is
  • The level of his league
  • Goals and assists
  • Cards (fewer is better)
  • Shots on target, tackles, passes and saves, only where the league publishes them
  • Market value, as context (15%)
  • Age, only when the player is actually playing

Does not count

  • Height
  • National-team call-ups
  • The coach's opinion
  • Fan votes
  • Nimble, the AI second opinion
  • The player's name, or how famous his club is

A real example

Álex Roldán, Seattle Sounders FC. These are his numbers today, read from the live data. RPIX 42.2, confidence 100 (HIGH), data tier FULL.

  1. 1
    Market (15%)

    Market value EUR 3,500,000 on a scale where EUR 25,000 is 0 and EUR 25 million is 100.

    M = 71.5
  2. 2
    Playing level (30%)

    He played 1,420 of the 2,430 minutes his club's league matches offered (27 x 90): 0.584. At age 30 no age adjustment. League factor 0.85 (MLS).

    T = 100 x 0.584 x 0.85 = 49.7
  3. 3
    Performance (45%)

    His goals, assists, tackles, passes and cards per 90 minutes, compared with the other full-backs in our data, give 40.0 out of 100. The league adjustment multiplies it by 0.922.

    O = 40.0 x 0.922 = 36.9
  4. 4
    Prospect (10%)

    He is 30, so there is no prospect credit.

    Y = 0.0
  5. 5
    Total

    Each part times its weight, added up.

    0.15 x 71.5 + 0.30 x 49.7 + 0.45 x 36.9 + 0.10 x 0.0 = 42.2

Confidence and data tiers

Every score comes with a confidence number from 0 to 100. It says how much data stands behind the score.

High confidence: many minutes, many matches, full statistics. Low confidence: few minutes or missing statistics. Read a low-confidence score with care.

FULL = the league publishes detailed statistics (shots, tackles, passes, saves). BASIC = only minutes, goals, assists and cards.

Confidence never changes the RPIX. It only tells you how far to trust it.

National-team call-ups

Call-ups never change RPIX. We show them next to the ranking so you can compare.

We detect each camp from club line-ups: the date from which most called-up players are left out of their clubs' squads. For example, the September 2026 camp ran from 15 to 30 September. Club matches during a camp do not count against a player.

A player is flagged only if he was left out of his club's squad in his last 2 known matches before the camp.

Call-ups page · Selection gap

Nimble second opinion

  • What it is. Nimble is a 9-billion-parameter AI model that runs on our own machines, not in a cloud service. We use it like a second reviewer: it reads a short table of numbers and says, in plain words, whether a called-up player looks justified. It is a readable opinion, not a measurement.
  • What it sees. For each player called up (played or on the bench) in a senior national-team window, only numbers that are already on this site, with the name replaced by "Player A": position group, age, club league and league factor, data tier, league minutes, club matches and appearances this season, his last 5 club league matches before the camp, status, RPIX with O, T, M and Y, confidence, the call-up check result and national-team caps. It also sees the same numbers for the 3 highest-ranked players at the same position who were not called up. It is told to judge only from club form and those numbers, and to answer "borderline" when the data is thin.
  • The question is neutral and identical for every player. "Based only on this data, should this player be in this national-team squad?" Same instructions, same settings (temperature 0, fixed seed 20261001) and same prompt version for everyone; the version is shown with every answer. The wording never mentions favouritism, suspicion or what anyone believes. The answer is Yes, Borderline or No, with two short reasons that cite the numbers.
  • It is never part of RPIX. Nimble does not change RPIX, the call-up check, the selection gap or any score, and it is never used to compute them.
  • The proof is the numbers. The evidence is the selection gap and the call-up check, which anyone can recompute. Nimble only adds a readable opinion next to them; if it is wrong, the numbers still stand.
  • Anyone can check it. Every answer is stored with the exact numbers it was shown (open "What was asked" beside each answer), the model, the machine that ran it, the date and the prompt version. If Nimble cannot answer, or its reply is not valid, nothing is shown: we never make up an answer. Only the site administrator can ask Nimble; visitors never trigger it.

Fan and reporter votes

  • Each visitor can mark a player Underrated (+1), Fair (0) or Overrated (-1). Voting again changes the vote.
  • A voter is a salted one-way hash of IP address and browser, with a salt that changes daily; no raw IP address is stored. The same person can therefore vote once per player per day. Limit: 30 votes per hour per network address.
  • Fan score = 50 + 50 x average vote, shown only from 5 votes. The fan vote never changes RPIX.
  • Registration with email confirmation and approval is coming, so that votes come from known people. Until then, fan votes are shown but will be archived when registration opens. Reporter votes will open together with registration.

Data sources and updates

  • Every figure on a player page carries its source link and an "as of" date. Market values, profile data and per-match statistics come from Transfermarkt; national-team call-ups come from the same per-game data.
  • Data is refreshed by hand and the ranking is recomputed from the stored figures (age is recomputed daily). Anything we cannot confirm is left empty and shown as "not collected".

Fairness

We judge players on merits. The same rules apply to everyone in the same situation.

We never tune a rule for a player. We never guess missing data. A missing statistic is missing information, not a bad game.

The formula was frozen before any test of it. It changes only with a new, published version.

Does it work? Our hypothesis

RPIX is a hypothesis, not a fact. We test it.

H1 Does RPIX today predict how a player's market value changes over the next 12 months, better than market value alone?

H2 Does it predict how much he will play, weighted by league level, better than his past minutes?

H3 Does a high performance score (O) repeat in the next period, or is it noise?

Status: the backtest has not been run yet. The plan is on the Backtest page.

The math

Everything technical is here, folded away. Open what you want to check. Same formula, same numbers as above. Think a rule is wrong? Prove it.

The formula RPIX = G x (0.15 M + 0.30 T + 0.45 O + 0.10 Y), with every term defined.

RPIX = G x (0.15 M + 0.30 T + 0.45 O + 0.10 Y)

  • G = 1 if current-season league minutes are 270 or more, otherwise 0 (not ranked).
  • M (15%) = 100 x clamp( log10( value_eur / 25,000 ) / 3 , 0 , 1 ). Market context. The league factor is not applied to M.
  • T (30%) = 100 x clamp( s / e(age) , 0 , 1 ) x L, where s = league minutes / (club league matches played x 90) and L is the league factor.
  • O (45%) = O_raw x sqrt(L). O_raw is the weighted mean of his positional percentiles (see Positions).
  • Y (10%) = 100 x max(0, T - 100 x s x L) / 50, and 0 from age 23. 50 is the largest possible gain, for a player aged 18 or younger who plays half the minutes in a league with L = 1.00 (T = 100, base 50). So Y runs from 0 to 100.

Results are rounded to one decimal. Ranking ties break on O, then T, then confidence, then league minutes; market value is never a tie-breaker. Unknown inputs are never guessed.

Expected share of minutes by age, e(age)

Agee(age): e(age): expected share of league minutes for a player of that age. Used in T.
23+1.00
220.90
210.80
200.70
190.60
18 or younger0.50

Example

A 20-year-old plays 70% of his club's league minutes in a 0.70 league: s = 0.70, e = 0.70, adjusted share = 1.00, T = 100 x 1.00 x 0.70 = 70. A 25-year-old with the same 70% gets T = 100 x 0.70 x 0.70 = 49. The younger player is credited for being a regular early, but cannot pass the league ceiling. His prospect gain is 70 - 49 = 21, so Y = 100 x 21 / 50 = 42.

Performance O by position How goals, assists, tackles and the rest are weighted for each position, and how small samples are handled.

Each statistic is a rate per 90 minutes. To stop a few good games from creating an unrealistic rating, every rate is pulled toward the average of his position with a 450-minute prior: adjusted rate = (n + prior x 450 / 90) / ((minutes + 450) / 90). His own rate then counts for minutes / (minutes + 450): 40% at 300 minutes, 50% at 450, 67% at 900, 80% at 1,800 and 89% at 3,600. The adjusted rate becomes a percentile among players of the same position group in our data: 90 means roughly the top 10% of the group, 50 the middle, 10 near the bottom.

Forwards and wingers (FW)

MetricWeight: Weight of this metric in the position formula for O.
Goals per 9040%
Assists per 9025%
Shots on target per 9015%
Passing contribution10%
Discipline10%

Midfielders (MF)

MetricWeight: Weight of this metric in the position formula for O.
Goals per 9020%
Assists per 9025%
Shots on target per 9015%
Tackles won per 9015%
Passing contribution15%
Discipline10%

Full-backs (FB)

MetricWeight: Weight of this metric in the position formula for O.
Goals per 9010%
Assists per 9020%
Shots on target per 9010%
Tackles won per 9025%
Passing contribution25%
Discipline10%

Centre-backs (CB)

MetricWeight: Weight of this metric in the position formula for O.
Goals per 9010%
Assists per 9010%
Tackles won per 9025%
Passing contribution25%
Defensive actions (unavailable in our data)20%
Discipline10%

Goalkeepers (GK)

MetricWeight: Weight of this metric in the position formula for O.
Saves per 9040%
Goals prevented (unavailable: no expected goals against)20%
Clean sheets per 9015%
Passing contribution10%
Penalty saves10%
Discipline5%
  • Unknown is not zero. When a league does not publish a statistic (for example tackles in El Salvador), its weight is removed and the other weights are re-scaled to add up to 100%. This lowers confidence, never the score by itself.
  • Passing contribution = 50% completed passes per 90 (percentile) + 50% pass accuracy (percentile). Accuracy uses a prior of 150 attempts toward the group average.
  • Discipline = yellow cards + 3 x red cards + 2 x own goals, per 90, adjusted like any rate; fewer is a higher percentile. A second yellow counts once, as the resulting red, and not also as a yellow.
  • Team statistics (clean sheets, goals conceded, wins, table position) are never scored for outfield players. For goalkeepers the clean-sheet rate counts because preventing goals is his job; saves weigh more whenever they exist.
  • Goalkeeper fallback: expected goals against is not in our data, so the goalkeeper weights are re-scaled over saves, clean-sheet rate, penalty saves, passing and discipline. A penalty-save figure counts only for a goalkeeper who faced at least one penalty (prior of 3 attempts).
  • Winger and centre-forward share one FW group in this version.
  • Reference groups (ranked-eligible players with the core inputs, today):
    • FW: 5 players
    • MF: 7 players
    • FB: 3 players
    • CB: 4 players
    • GK: 4 players
    Goals, assists and cards exist in every league, so FULL and BASIC players share one pool for them. Shots on target, tackles and passes are compared only among players whose league publishes them. With so few players, a lone player in a group sits at percentile 50 for such a metric. We use mid-rank percentiles (players below + half the ties, divided by the group size) and show the group size next to every percentile.
League factor L How strong each league is, from 1.00 (top five in Europe) to 0.20.

League factor L

L: League factor L (0 to 1): strength of the league. T uses L; O uses its square root.sqrt(L): Square root of L, the league adjustment applied to O.Competitions
1.001.000England, Spain, Italy, Germany and France top flights
0.850.922MLS, Russian Premier League and comparable European top flights (Ekstraklasa, Nike Liga)
0.700.837European professional second levels (including Polish and Slovak), Liga MX, USL Championship
0.600.775Colombia Primera A
0.500.707Costa Rica, Honduras, Guatemala, Liga de Expansión MX, MLS Next Pro
0.350.592El Salvador Primera División
0.200.447El Salvador second tier (Segunda División)

L multiplies T in full. O gets only sqrt(L), because league level already shows up in market value, minutes and the quality of opposition; a full L on O would count it twice. Factors are provisional until backtested, and no factor is changed because of one player.

Leagues in our data

L: League factor L (0 to 1): strength of the league. T uses L; O uses its square root.Leagues
1.00Premier League, Ligue 1, Bundesliga, Serie A, La Liga
0.85Ekstraklasa, Russian Premier League, Nike Liga, Major League Soccer
0.70Liga MX, Betclic 1 Liga, MONACObet Liga (2nd tier), USL Championship
0.60Primera A
0.50Liga Promerica (Primera Division), Liga Nacional de Guatemala, Liga Nacional de Honduras, Liga de Expansion MX, MLS Next Pro
0.35Primera Division
0.20Segunda Division
Confidence formula and status labels How the confidence number is built, and every status label.

Confidence = 35% minutes sample + 35% data completeness + 20% match count + 10% source. Minutes sample = min(1, minutes / 1,350). Data completeness = share of his position formula's weight that has data. Match count = min(1, appearances / 15). Source = 100% for Transfermarkt per-game data, 60% for screenshots or manual values. Confidence never changes RPIX.

Confidence: Confidence: how much data is behind this score, 0-100 (from LOW to HIGH).Label
85-100HIGH
65-84MEDIUM-HIGH
45-64MEDIUM
25-44LOW
0-24VERY LOW

DATA: FULL means detailed match statistics (shots on target, tackles, passes, saves) are published for the player, as in MLS, the Russian Premier League, Liga MX, Colombia and the USL Championship. DATA: BASIC means only minutes, goals, assists and cards are published, as in El Salvador, Costa Rica, Honduras, Guatemala, Poland's I liga and Slovakia's 2. liga.

Status labels

  • RANKED: 270+ league minutes and every required input known.
  • NOT RANKED - insufficient minutes: under 270 league minutes. The profile page still shows his stats.
  • NOT RANKED - required input unknown: minutes, club matches, market value, league or goals, assists and cards are missing.
  • INJURED: the latest known club match status within his last 2 known club matches is "injured".
  • NO CURRENT CLUB DATA: no club league match in the last 45 days.

Injured and no-current-club-data players are not ranked, but their page shows the RPIX they would have.

All ten fairness principles The full list we hold ourselves to.
  1. 1
    Every rule applies to every player in the same situation. No weight, threshold, league factor or positional rule is changed to help or hurt a named player.
  2. 2
    Unknown data is never guessed.
  3. 3
    Team outcomes are not automatically treated as individual performance.
  4. 4
    Players are compared primarily with others in similar positions.
  5. 5
    Small samples are adjusted so a few strong games do not create an unrealistic rating.
  6. 6
    Missing advanced statistics are missing information, not poor performance.
  7. 7
    Age changes how playing time is read, but is not rewarded again in several components. Only T and Y use it.
  8. 8
    National-team selection is not a scoring component, because the coach controls it. Height is not scored either; it is only shown on the profile.
  9. 9
    Market value is context, not the definition of football quality, and has the second-lowest weight (15%).
  10. 10
    The formula is frozen before any formal backtest is evaluated.
What RPIX still cannot measure Known gaps in the data, and what we would add when a reliable source exists.
  • Interceptions, clearances, blocks and aerial duels: centre-back and full-back defending is under-measured. Those weights are dropped, not scored as zero.
  • Expected goals and assists, shot location, goalkeeper post-shot expected goals, progressive passes and carries, physical tracking, tactical role.
  • Team strength is not added to anyone's score. A future version may use team context to normalise statistics, only when enough data exists.
  • Future (v2.3 candidates): expected goals and assists, progressive passes and carries, interceptions, clearances, aerial duels, goalkeeper post-shot expected goals, opponent strength, team-possession normalisation, tactical roles, separate winger and striker models, multi-season ageing curves, larger comparison groups, extra full-back metrics. None is added until a reliable source exists.
The four hypotheses, exactly H1 to H4 as pre-registered for the backtest.
  • H1 RPIX at time t predicts the next 12 months of change in log10 Transfermarkt market value better than market value alone and better than minutes share alone.
  • H2 RPIX at t predicts level-weighted minutes (sum of minutes x league factor) over the next 12 months better than prior level-weighted minutes, market value and raw minutes share.
  • H3 Players with higher O at t keep a higher position-adjusted O in the next competitive period (the performance signal repeats rather than being noise).
  • H4 Selection gap, descriptive only: for each senior camp, how often lower-RPIX or inactive players are called while higher-RPIX active players at the same position are not. No pass or fail. See the Selection gap page.

The plan, comparisons and statistics are on the Backtest page. It has not been run yet.

Version history Every version of the method and what changed.
VersionChanges
2.2 active2.2 - proposed by Mario 2026-10-01, implemented the same day. Weights M 15, T 30, O 45, Y 10. Height and national-team selection removed from the score. O becomes a position-specific percentile model with small-sample shrinkage and sqrt(L) league adjustment. Prospect becomes its own component Y. Confidence score and FULL/BASIC data tier added. Provisional until the backtest.
2.12.1 - design draft 2026-10-01, never live. Market value 30%, minutes 25%, match output 20%, physical profile 15%, national team 10%. Superseded by 2.2.
2.02.0 - approved by Mario 2026-10-01 (not yet public when amended the same day). Replaces the six-part provisional formula. Adds the must-play gate (270 league minutes), current-season minutes (T), match output (O) and a position-based physical part (P). Weights 35/25/20/20.
1.0superseded by 2.0

Version 2.2 stays provisional until the 2025-10-01 to 2026-10-01 backtest is completed. Weights change only with a new published version; they are never tuned quietly.