Skip to main content
Semi Retired
Reference

Stats glossary

Every number on the site, defined.

Last updated when a stat’s definition changes · 25 Apr 2026

Primitives

Score-to-par (per hole)

Gross score on a hole minus that hole’s par. Negative is below par, zero is on par, positive is over par. The atomic unit every other stat is built from.

Formula
score_to_par = gross − par
Worked example
At the reference round (Wycombe Heights, 3 Sept 2023), James scored 2 on the par-3 hole 6: 2 − 3 = −1. That’s a birdie in the six-category classification.
Edge cases
  • A missing hole score is skipped — not zeroed. Downstream averages treat the hole as not played by that player.
  • Hole played by a guest outside the three-player group is ignored entirely (see ingestion rule 6).
Spec: definitions.md#score-to-par-per-hole

Round vs par

Total gross for a round, expressed as a signed integer versus course par. The standard golf way to describe how the day went.

Formula
round_vs_par = Σ score_to_par(hole) = (Σ gross) − course_par
Worked example
Reference round: Matty 98 vs par 69 → +29. Matt 102 → +33. James 92 → +23. Written with a leading sign always — +23, E, −4.
Edge cases
  • Rounds with any missing per-hole score are flagged as partial. Their vs-par is computed only over the holes actually played and excluded from stats that assume 18 holes (best / worst / personal course record / front-back split).
  • If the group plays different tees at the same course, par comes from the round’s captured tee — it’s unambiguous round by round.
Spec: definitions.md#round-vs-par

Six-category classification

Maps each hole’s score-to-par into exactly one of six buckets. Shape carries the signal on the scorecard; colour reinforces.

ShapeCategoryScore to par
Eagle or better≤ −2
Birdie−1
Par0
Bogey+1
Double bogey+2
Triple bogey or worse≥ +3
Formula
See the table below.
Worked example
Reference round, hole 3 (par 5). Matt scored 7 → +2 = Double. Matty 5 → 0 = Par. James 7 → +2 = Double. Hole 6 (par 3), James scored 2 → −1 = Birdie.
Edge cases
  • Albatross (≤ −3) buckets as Eagle — we don’t split the ≤ −2 tail.
  • Hole-in-one on a par 3 is an Eagle by this classification. Whether to celebrate it as distinct is a presentation-layer concern, not a seventh category.
Spec: definitions.md#six-category-classification

Round-level

Rounds played

The total number of rounds in the database that the player participated in.

Formula
rounds_played(player) = |{ round : player ∈ round.players }|
Worked example
After the 11-round backfill, every player has rounds_played = 11. All rounds are 3-player rounds by design — Matt, Matty, James in every one.
Edge cases
  • A round with fewer than 18 holes recorded still counts as one round played.
  • Guest rows (e.g. Olly on scorecard 4) do not count — the stat is only computed for the three group players.
Spec: definitions.md#rounds-played

Round W/T/L

Three counts per player: rounds won (strictly lowest gross), tied for low, and lost (otherwise). The leaderboard ranks primarily by wins desc, mean-round-vs-par asc as tiebreak.

Formula
For each round the player was in: outcome = W if strictly lowest, T if tied for low, L otherwise. Aggregate across rounds.
Worked example
After 11 rounds: James 10·0·1 (dominant), Matt 1·0·10 (his one win at Hazlemere), Matty 0·0·11.
Edge cases
  • Ties at the top of the leaderboard on both wins and mean-vs-par produce a shared rank (=1, =2, etc.). No further tiebreak.
  • Only 3-player rounds are registered (CLAUDE.md §2). Two-player variants never reach the stats engine.
Spec: definitions.md#round-wtl

Average gross per round

Arithmetic mean of the gross totals across every round the player has played. Context, not ranking — gross is course-difficulty-sensitive.

Formula
avg_gross(player) = (Σ round.gross[player]) / rounds_played(player)
Worked example
After 11 rounds: James 91.5 · Matt 101.8 · Matty 99.4.
Edge cases
  • Partial rounds’ grosses are flagged and reported alongside the round count.
  • rounds_played = 0 renders as an em-dash.
Spec: definitions.md#average-gross-per-round

Mean round vs par

Arithmetic mean of round-vs-par values. The most meaningful single “how good is this player” number in the system — normalises across courses of different difficulty.

Formula
mean_vs_par(player) = (Σ round_vs_par(player)) / rounds_played(player)
Worked example
After 11 rounds: James +21.0, Matty +28.8, Matt +31.3. Signed, one decimal place. Tiebreak on the leaderboard if two players share a win count.
Edge cases
  • Partial rounds contribute their actual vs-par (not a 18-hole projection) and get flagged.
  • Don’t confuse with “average hole vs par” — that’s a per-hole mean (see Per-par averages).
Spec: definitions.md#mean-round-vs-par

Median round vs par

The middle round. Robust to one truly terrible round dragging the mean upward.

Formula
Standard median over { round_vs_par(player) : round }. Even counts use the mean of the two middle values. One decimal place.
Worked example
If mean is meaningfully higher than median, blow-ups are inflating the mean — the median is the steadier read on “how they usually play.”
Edge cases
  • With a single round, median = mean (both equal that round).
  • rounds_played = 0 renders as an em-dash.
Spec: definitions.md#median-round-vs-par

Best round / Worst round

Per player, the round with the lowest (best) and highest (worst) round-vs-par. Vs-par is the headline; gross + course + date is the secondary context.

Formula
best_round = argmin round_vs_par(player, r). worst_round = argmax. Ties break to the more recent date, then to lower gross.
Worked example
James’s best: +15 at Huntswood on 8 Mar 2026. Worst: +29 at Wentworth (Edinburgh), 2 Oct 2023. Matt’s best: +23 at Hazlemere (the day he won the round). Worst: +43 at Wentworth.
Edge cases
  • Partial rounds are excluded — their vs-par isn’t comparable.
  • With exactly one round, best = worst — the profile collapses to a single “only round so far” treatment.
Spec: definitions.md#best-round--worst-round

Personal course record

The lowest round-vs-par a player has shot at a given (course, tees) combination. Different tees at the same course are separate records.

Formula
pcr(player, course, tees) = min round_vs_par over rounds at that (course, tees). Ties resolve to the earliest round that set the record.
Worked example
At Old Thorns (yellow, 2 rounds), James’s PCR is 94 (+22) on 3 Dec 2023 — lower than his 97 the day before.
Edge cases
  • First round at a course seeds the record automatically; the UI labels this rather than showing a “record broken” framing.
  • Ties resolve to the earliest round — later ties are record-equalled, not record-broken.
  • Partial rounds excluded.
Spec: definitions.md#personal-course-record

Hole-level

Score distribution

Count and rate of holes a player has made in each of the six score-to-par categories. Both counts and rates are always shown — rates normalise across players with different round counts.

Formula
For each category c: count(player, c) = number of holes in c; rate = count / total holes played. Rate to one decimal.
Worked example
Reference round, James (18 holes): 0 eagle / 2 birdie / 3 par / 4 bogey / 6 double / 3 triple+. Across the 11-round backfill his lifetime bogey rate is just under 40%.
Edge cases
  • Categories with zero count still render (0 · 0.0%) — consistency of the six-column shape matters.
  • Missing holes contribute nothing to counts or denominators.
Spec: definitions.md#score-distribution

Holes W/H/L (overall)

Match-play record of every hole the player has played vs the other two group players in the same round. W = strictly lowest, H = tied for low, L = otherwise. Shown as counts and rates.

Formula
For each hole: low = min(gross[q] for q in group). If player == low and only one at low → W; if player == low and multiple tied → H; otherwise → L.
Worked example
Reference round: James 5·4·9, Matt 3·4·11, Matty 4·4·10. The three counts sum to 18 per player; across all three players, W + H + L = 54 player-hole outcomes.
Edge cases
  • A hole where the player has no recorded score but others do contributes nothing to that player’s W/H/L.
  • Only 3-player rounds — the stat has no 2-player semantics.
Spec: definitions.md#holes-whl-overall

Head-to-head grid

Pairwise match-play record A vs B across every hole both played together. Shown overall and split by par type (3 / 4 / 5).

Formula
For each hole: if gross[A] < gross[B] then A_win += 1. If equal → halved. If greater → A_loss. Aggregate overall and filtered by hole.par ∈ {3, 4, 5}.
Worked example
Reference round, Matt vs James: 6 won · 4 halved · 8 lost overall (Matt lost the round by 10 strokes but won 6 individual holes — two separate stories).
Edge cases
  • An opponent the player has never played with renders as an em-dash, not 0–0–0 — the “no data yet” signal is different from “all drawn”.
  • A vs B and B vs A are mirror images: A.W = B.L, halves are shared.
Spec: definitions.md#head-to-head-grid

Segmented averages

Per-par averages

For each par type (3, 4, 5), the mean of score-to-par across all holes of that par the player has played. Shown with the sample size (number of holes).

Formula
avg_par(player, p) = mean(score_to_par) restricted to holes where hole.par == p
Worked example
Reference round alone, James on par 3s (5 holes): scores 4, 2, 3, 4, 6 → diffs +1, −1, 0, +1, +3 → sum +4 → avg +0.8.
Edge cases
  • Par types with zero samples render as an em-dash.
  • No par-6 handling — no par-6 holes appear in the current course set.
Spec: definitions.md#per-par-averages

Per-stroke-index averages

Mean score-to-par bucketed by the hole’s stroke index: Hard (SI 1–6), Mid (SI 7–12), Easy (SI 13–18). Captures whether a player disproportionately bleeds on the hard holes.

Formula
Three buckets over six stroke indexes each. avg = mean(score_to_par) within the bucket; samples = 6 holes × rounds played.
Worked example
Across 11 rounds, each bucket has 66 samples per player. Hard-bucket averages run 0.5–1 stroke higher than Easy-bucket averages — the stroke index does its job.
Edge cases
  • Courses with non-standard SI assignments (ties, missing values) still bucket cleanly by SI number.
  • Empty buckets (zero rounds played) render as em-dash.
Spec: definitions.md#per-stroke-index-averages

Front / back split

Mean score-to-par on the front 9 vs the back 9. Makes late-round fatigue or front-nine slow starts visible. Delta (back − front) is shown below.

Formula
avg_front = mean(score_to_par for hole index 0–8). avg_back = mean(score_to_par for hole index 9–17). delta = avg_back − avg_front.
Worked example
Across 11 rounds, each side has 99 samples per player — the same rounds, split in half. A positive delta means the player plays worse on the back nine on average.
Edge cases
  • Partial rounds missing holes in either nine still contribute their played holes; the denominators narrow accordingly.
  • Unused holes on 9-hole variants would break this stat — the data model doesn’t accept them.
Spec: definitions.md#frontback-split

Derived / characterful

Bounce-back rate

After a bogey or worse, what share of the next holes score par or better. Resilience after a bad hole — does the damage stop at one?

Formula
Trigger holes = any hole scored bogey+ (+1 or worse). Hit = the next hole (same round) scored par or better. Rate = hits / triggers.
Worked example
Across 11 rounds James’s bounce-back rate is around the mid 30s. Translated: after a bogey or worse, he plays the next hole to par or better about one in three times.
Edge cases
  • Triggers that sit on the last hole of a round are skipped — no “next hole” within the round.
  • “Next” does not cross round boundaries — this is within-round resilience only.
  • rounds_played = 0 or no bogeys yet renders as em-dash with caption “Not enough bogeys yet”.
Spec: definitions.md#bounce-back-rate

Blow-up rate

After holding par or better on a par-4 or par-5, what share of the next holes score double bogey or worse. Damage after a steady hole — the blow-up we all fear.

Formula
Trigger holes = par-4 or par-5 holes scored par or better. Hit = the next hole scored double+ (+2 or worse). Rate = hits / triggers.
Worked example
Typical values in the backfill run low-teens percent. A high rate means the player rarely consolidates a good hole; a low rate means the good hole often leads to another one.
Edge cases
  • Last hole of a round is skipped as a trigger.
  • Limited to par-4+ triggers deliberately — par-3 par is noise rather than signal.
  • No triggers yet renders as em-dash with caption “Not enough par-or-better yet”.
Spec: definitions.md#blow-up-rate

Recent form

Mean vs par across the last 5 rounds, compared to lifetime. Captures whether the player is trending up or down recently.

Formula
Last-5 rounds by round_date (most recent first, reversed for the sparkline). recent_mean = mean(round_vs_par) over those. Delta = recent_mean − lifetime_mean.
Worked example
If a player’s recent 5 rounds average +24.0 while their lifetime mean is +28.5, they’re playing 4.5 strokes better per round lately. Down is an improving trend.
Edge cases
  • With fewer than 5 rounds, the stat uses however many exist (and the sparkline has fewer points).
  • With zero rounds, renders as em-dash.
Spec: definitions.md#recent-form

Margin extremes

For a given opponent pair (A, B), A’s biggest win margin and A’s narrowest loss margin across every round both played. Margin is the gross differential.

Formula
margin = gross[B] − gross[A]. Biggest win = max positive margin (A beat B by the most). Narrowest loss = the loss margin closest to zero (least negative).
Worked example
James vs Matt across 11 rounds: biggest win +17 (Huntswood, 8 Mar 2026 — James 85, Matt 110). Narrowest loss −2 (Hazlemere — Matt 93, James 95, Matt’s only win).
Edge cases
  • An opponent against whom the player has never lost renders Narrowest loss as em-dash.
  • An opponent never beaten renders Biggest win as em-dash.
  • Ties on margin resolve to the earliest round by date.
Spec: definitions.md#margin-extremes