About

How Ratings Work

Ratings use a DUPR-style Elo algorithm that considers score differential, not just win/loss. A close loss hurts less than a blowout; a dominant win helps more than squeaking by.

Starting rating
3.500
Every new player begins here.
Rating range
2.000 – 8.000
Hard floor and ceiling.
Recency half-life
90 days
Older matches carry less weight.
K-factor
0.05 – 0.40
Decays as you play more matches.
Match type multipliers
Tournament 1.5Γ— Club 1.0Γ— Recreational 0.5Γ— Unrated excluded

Status Badges

Status reflects how reliable the rating number is.

Full 3 or more matches played in the last 90 days.
Provisional Fewer than 3 recent matches β€” rating is less stable.
Inactive No matches in the last 90 days.

Last Played Colors

The Last Played pill on the leaderboard shows how many days ago a player's most recent match in the selected category was, with a colour for activity at a glance.

today – 10 days ago Currently active.
11 – 20 days ago Recently active.
21 – 40 days ago Slowing down.
41 – 90 days ago Cooling off.
more than 90 days / never Inactive β€” rating no longer reflects current form.

Win Rate (~Win%)

Win rate shows how often you win, but raw percentages can be misleading when you've only played a few matches. Someone who went 5W / 0L looks like a 100% winner β€” but that's only 5 games. We can't yet tell whether they're genuinely dominant or just got lucky early.

To make the number fairer, we add a small imaginary record of 2 wins and 2 losses to everyone's tally before calculating the percentage. Think of it as the system saying "let's assume you're roughly average until proven otherwise."

Examples
5W / 0L (real record) β†’ (5+2) / (5+4) = ~78%
8W / 2L (real record) β†’ (8+2) / (10+4) = ~71%
40W / 10L (real record) β†’ (40+2) / (50+4) = 78%
~ The ~ prefix appears when you have fewer than 20 matches β€” it's a reminder that the number is still an estimate. Once you've played 20+ matches, the ~ disappears and the win rate is considered reliable.

Categories

MD β€” Men's Doubles
WD β€” Women's Doubles
XD β€” Mixed Doubles
MS β€” Men's Singles
WS β€” Women's Singles
UN β€” Unclassified

Ratings are tracked independently per category. UN matches are excluded from ratings.

Algorithm Changes

v1.0.0 β†’ v1.2.0 β–Ό

Notable behavioural changes since the rating engine first shipped (v1.0.0). A higher number means the math affecting your displayed rating has changed.

v1.2.0 current
  • Recency half-life shortened to 90 days. Older matches now fade twice as fast (was 180 days). Recent active play has a stronger pull on your rating, and a player who stops showing up will see their rating drift back toward the middle of the range over a few months instead of staying frozen for nearly a year.
  • New Last Played column. Each leaderboard row now shows how many days ago that player's most recent match in the selected category was, as a colour-coded pill β€” green within 10 days, teal within 20, amber within 40, orange within 90, grey beyond. The colour meanings are also shown in a legend at the bottom of the leaderboard.
  • Inactive threshold tightened to 90 days. The Inactive Status badge now applies after 90 days of no matches in a category (was 270 days), so long-absent players drop to the bottom of the leaderboard much sooner. The Status badge itself still reflects rating reliability: Full, Provisional, or Inactive.
v1.1.0
  • Per-category K-factor decay. Rating stability now grows with matches played in that category, not your total across all categories. Your MD rating no longer "borrows" stability from XD experience and vice-versa β€” each pool stands on its own evidence.
  • Unrated match type. Practice/casual matches can be marked Unrated; they're tracked for analytics but excluded from public ratings.
  • Stricter ingestion guards. Empty (0–0) results, scores outside 0–30, and unrecognised match types are now rejected or downgraded to Unrated instead of silently feeding the math.
v1.0.0 initial

First release: DUPR-style Elo with score-differential perf-gap, K-factor decay, 180-day recency half-life, match-type weights, provisional/inactive flags, and per-category isolation.