How we calculate everything

raceindex.org publishes every figure and every sentence with its method shown. Course profiles are derived from geometry through one fixed pipeline; copy is composed from verified facts, never from source prose. This page is the full, version-locked specification — the audit control and the reason our claims are citable.

Scoring methodology

Version: scoring-methodology-v1.0

Every figure on this site is reproducible. Two analysts running this specification on the same course geometry get the same number — that is what makes a claim like “the flattest UK marathon for a PB” defensible and citable. The formulae and parameters below are published verbatim and version-locked: any change increments the version, triggers a full recompute, and is logged.

Why raw elevation numbers can’t be compared

The same course returns wildly different elevation totals depending on the device, the trackpoint density, and the smoothing the source applied — we have seen one course reported as roughly 932 ft of climb by one source and 748 ft by another. Publishing either as fact would be misleading.

So we never ingest a source’s elevation total. We ingest the course geometry (coordinates) and run every course through one identical pipeline. The output is comparable across every course because it was produced by the same code with the same fixed, published parameters.

How we normalise a course profile

Given the geometry (latitude/longitude, plus raw elevation where present), we apply the following deterministic steps. Where raw elevation is sparse or noisy, we derive it from a public, keyless elevation dataset by coordinate and record which source was used per course.

  1. Resample to a fixed step of Δ = 10 m by linear interpolation, removing trackpoint-density bias.
  2. Smooth with a rolling median over W = 50 m, then a light Gaussian with σ = 20 m.
  3. Accumulate gain and loss with a hysteresis of τ = 1 m, which kills GPS-noise inflation.
  4. Classify every resampled segment into grade buckets and record the percentage of distance spent in each.
  5. Integrate the published grade-to-energy-cost function over the course to produce the GAP factor.
  6. Stamp the output with the methodology version and a recompute hash = sha256(geometry snapshot + methodology version) so any number can be reproduced.

What is the GAP factor, and how is it computed?

GAP (Grade-Adjusted Pace) factor expresses how much slower a course is than a flat one, as a percentage, purely from its gradient profile. It uses the Minetti et al. (2002) energy cost of running, Cr(i), a fifth-order polynomial in the gradient i (rise over run as a fraction). The exact coefficients are published below and never change without a version bump.

We compute Cr(i) = a₅·i⁵ + a₄·i⁴ + a₃·i³ + a₂·i² + a₁·i + a₀ at every resampled segment, take the ratio to the flat cost Cr(0) = 3.6, weight by segment distance, and integrate over the course. The GAP factor is that distance-weighted mean cost ratio, expressed as “X% slower than flat”.

Lower is faster. Because the function and the coefficients are fixed and public, the same geometry always yields the same GAP factor — which is what makes our “flattest” and “fastest course” rankings reproducible.

Finisher distributions and the Field-Quality Index

For each race edition we compute an aggregate-only distribution — the count, median, the 10th/25th/75th/90th percentiles, the fraction of finishers below each distance-appropriate threshold band, and the DNF rate. We never store, index, or republish individual finisher rows; aggregation happens in memory and the rows are discarded.

Fast events attract fast fields, which would make a fast course look even faster for the wrong reason. The Field-Quality Index (FQI) corrects for this: we benchmark the edition’s fast tail (its 10th percentile) against the all-UK baseline for that same distance, producing a field-strength multiplier. The empirical-speed signal is de-confounded by FQI before it feeds the score, so we measure how fast people run once we control for who showed up.

How is PB-potential calculated?

PB-potential is the headline score and the hard-to-copy one, because it fuses two independent signals: the course should be fast (physics), and runners actually do run fast there once you control for the field (empirical). It is a weighted sum of three terms:

pb_potential = w₁·gap_term + w₂·empirical_term + w₃·conditions_term

The gap_term comes from the GAP factor (lower GAP scores higher); the empirical_term is the field-normalised real finish speed from the distribution (de-confounded by FQI); the conditions_term is the typical race-date temperature favourability. The default weights are published below, and we publish a sensitivity table alongside them.

Why the weights are trustworthy (the sensitivity table)

A score is only honest if its ranking does not lurch when a weight is nudged. We publish a sensitivity table that perturbs each PB-potential weight by a fixed amount and reports how much the resulting ranking moves (rank-correlation against the baseline ordering). A stable, high rank-correlation under perturbation means the headline ordering is driven by the data, not by a fragile choice of weight.

If a methodology change ever made the ranking sensitive to small weight changes, that is a signal to revisit the weights — and any such change would itself be a version bump, recompute, and log entry.

Value, conditions, beginner-friendliness and organisation

Value is the total cost to the start line — entry fee plus modelled travel and modelled accommodation by origin region — per finisher, benchmarked across the distance. Travel and lodging are labelled modelled estimates, not live prices, which is deliberate: it lets us avoid booking APIs while still surfacing the real ~£500+ outlay of which entry fee is only about a tenth.

Conditions favourability scores the typical race-date weather: no penalty inside the optimal temperature window, with published penalties per degree outside it and per unit of typical precipitation and wind above a floor.

Beginner-friendliness rewards a generous cutoff, a supportive field size, high support density, low gradient and a high flat-bucket percentage — especially meaningful at the half and 10k, the beginner-heavy distances.

Organisation is a counts-weighted aggregate of review sentiment (ratings and counts only — never verbatim review text).

The overall score (no black box)

The overall score is a published weighted composite of the five sub-scores, with the weights shown below. Crucially, every sub-score is shown independently on every page: there is no hidden roll-up, so a reader who cares only about value or only about flatness can see exactly that input rather than trusting a single opaque number.

Scoring parameters

Every value below is read directly from the single source of truth in code that the scorer also uses, so this page and the live calculations can never disagree.

Course-profile normalisation parameters (§6.1)
ParameterValueWhat it fixes
Resample step Δ10 mFixed-distance resampling removes trackpoint-density bias (the 932-vs-748 ft cause).
Rolling-median window W50 mRemoves spikes before gradient is taken.
Gaussian smoothing σ20 mLight final smoothing; fixed and published.
Gain/loss hysteresis τ1 mKills GPS-noise inflation of total ascent/descent.
Grade buckets — % of distance in each (§6.1 step 5)
BucketGrade rangeMeaning
steep_down< -6%Steep descent
down-6% to -2%Descent
flat-2% to +2%Flat
up+2% to +6%Climb
steep_up≥ 6%Steep climb
Minetti et al. (2002) cost-of-running coefficients — Cr(i) = a₅·i⁵ + a₄·i⁴ + a₃·i³ + a₂·i² + a₁·i + a₀ (J·kg⁻¹·m⁻¹)
CoefficientValueTerm
a₅155.4i⁵
a₄-30.4i⁴
a₃-43.3
a₂46.3
a₁19.5i
a₀3.6constant (flat cost)
PB-potential dual-signal weights (§6.3)
TermWeightSignal
gap_term0.45Course physics from §6.1 — lower GAP factor is faster.
empirical_term0.40Field-normalised real finish speed (§6.2), de-confounded by FQI.
conditions_term0.15Typical race-date temperature favourability (§6.4).
Overall composite weights (§6.4)
Sub-scoreWeightWhat it measures
PB-potential0.30Realistic chance of a fast time.
Value0.20Total cost-to-start-line per finisher.
Conditions0.15Typical race-date weather favourability.
Beginner-friendliness0.15Cutoff, support, low gradient, flat %.
Organisation0.20Counts-weighted review sentiment.
Conditions favourability model (§6.4)
ParameterValueEffect
Optimal temperature window6–12 °CNo penalty inside this endurance-running window.
Temperature penalty0.04/°CApplied per °C outside the window.
Precipitation penalty0.03/mmPer mm of typical precipitation.
Wind floor15 kphWind below this is not penalised.
Wind penalty0.015/kphPer kph of typical wind above the floor.
Publishing & verification thresholds (§5.5, §7.3, §9.1)
ThresholdValueGate
Confidence to publish0.70C-CONF-1: a value below this cannot be published.
Confidence to mark a fact verified0.80Plus cross-source agreement where applicable; only verified facts feed copy.
Max copy-vs-source similarity0.25C-COPY-2 / C-IP-3: above this, copy is regenerated.
Min copy helpfulness0.70C-COPY-4: below this, copy is revised.
Min qualifying races per facet page5§9.1 thin-page guardrail — fewer and the facet page is not emitted.

Distance-appropriate threshold bands

Each distance has its own threshold bands and its own plausible-median sanity range, shown here exactly as the pipeline applies them.

Marathon — threshold bands & plausible median range (42.195 km)
BandTime
sub-3:003:00:00
sub-3:303:30:00
sub-4:004:00:00
sub-4:304:30:00
sub-5:005:00:00
Sanity range for a plausible median finish time: 3:00:00 – 7:00:00.
Half Marathon — threshold bands & plausible median range (21.097 km)
BandTime
sub-1:301:30:00
sub-1:451:45:00
sub-2:002:00:00
sub-2:152:15:00
sub-2:302:30:00
Sanity range for a plausible median finish time: 1:15:00 – 3:30:00.
10K — threshold bands & plausible median range (10 km)
BandTime
sub-4040:00
sub-4545:00
sub-5050:00
sub-5555:00
sub-601:00:00
Sanity range for a plausible median finish time: 30:00 – 1:45:00.
5K — threshold bands & plausible median range (5 km)
BandTime
sub-2020:00
sub-2525:00
sub-3030:00
sub-3535:00
Sanity range for a plausible median finish time: 15:00 – 1:00:00.
Ultramarathon — threshold bands & plausible median range (50 km, variable distance)
BandTime
No fixed threshold bands at this distance.
Sanity range for a plausible median finish time: 4:00:00 – 36:00:00.
Relay — threshold bands & plausible median range (42.195 km, variable distance)
BandTime
No fixed threshold bands at this distance.
Sanity range for a plausible median finish time: 2:00:00 – 7:00:00.

Copy methodology

Version: copy-methodology-v1.0

Our written copy is original by construction and true by construction. We separate fact collection from writing: we harvest atomic, verifiable facts, discard the source’s sentences, and compose our own prose from the facts and our own data. The copy cannot be a paraphrase of anyone’s text because that text is never in the writing context, and it cannot assert anything a verified fact does not support.

Facts are collectable; expression is not

That a course is two laps, passes the cathedral, has eight aid stations and a six-hour cutoff are facts — not protected expression — and collecting them is legitimate. The wording on an organiser’s site is theirs, and we never store or reuse it.

So the architecture splits fact extraction from copy generation. We harvest atomic facts, throw away the source’s sentences, and write our own. This yields two guarantees: originality by construction (the writer is fed the structured fact set and our own data, never source prose, so the output cannot be a paraphrase) and truth by construction (copy may only assert what a verified, sourced fact supports — no invented atmosphere, no hallucinated landmarks).

What facts we collect (the key-fact taxonomy)

We harvest a defined set of visitor-relevant, factual predicates at three subject levels. Event-level facts are collected once and inherited by every distance, so a venue fact can never disagree between sibling pages. The full taxonomy is shown below.

The derived facts — gradient, finisher percentages, typical conditions — are the differentiator: copy grounded in data no competitor and no general-purpose model holds is exactly what earns ranking and citation.

Only verified facts reach the page

A harvested fact becomes verified only above a confidence of 0.80 and, where applicable, with cross-source agreement; every conflict is logged. Derived facts inherit the methodology version stamp.

Only verified facts are eligible to ground copy (C-COPY-1). An unverified fact never reaches a published sentence.

How the copy is written

The writer’s input is the verified fact set for the subject plus our computed scores and data — never source prose. It emits one block per page slot, and every factual claim in a block carries the identifier of the fact that grounds it. The standard slots per page type are listed below.

Data integration is mandatory: the prose must weave the proprietary numbers (gradient, finisher %, true cost, conditions) into natural sentences — “two flat laps along the seafront, among the ten fastest UK halves on our model, with a realistic sub-2 rate of X%” — because that is what makes the page the most useful one on the topic and what AI answers quote.

Voice and tone

Knowledgeable runner-to-runner: specific, useful, honest. No filler, no hype, no keyword-stuffing. Numbers are integrated naturally rather than bolted on, and every factual claim maps to a fact identifier so the prose is as auditable as the data.

How we quality-check copy

Five controls gate every block before it can be published. Grounding, originality, contradiction and helpfulness are automated; a human tier reviews all flagship pages and a sample of the rest. The gates are listed below.

Copy reference

The key-fact taxonomy (§7.2)

Event-level facts

Harvested once and inherited by every distance at the event.

  • setting
  • closed roads
  • nearest station(s)
  • parking / park-and-ride
  • expo
  • post-race village
  • on-course music
  • spectator access
  • bag drop
  • accessibility provisions
  • charity partners
  • first year staged
  • notable history
  • local context

Race / distance-level facts

Specific to one distance offering.

  • registration model
  • fee tiers
  • field cap / size
  • cutoff time & pace
  • pacers
  • wave starts
  • medal / finisher tee
  • UKA-measured
  • qualifying status
  • deferral / transfer policy

Course-level facts

Course shape and features, plus the derived facts only we hold (gradient, finisher %, conditions).

  • course type & lap count
  • surface
  • landmarks passed
  • scenery type
  • start / finish location
  • notable features
  • shade vs exposure
  • net elevation (derived)
  • key climbs (derived)
  • flat % (derived)
  • PB-potential (derived)
  • realistic sub-X rate (derived)
  • typical conditions (derived)

Copy slots per page type (§7.4)

Standard copy slots by page type
Page typeSlots
Race entity (per distance)intro, course description, who it suits, logistics, conditions, verdict
Event hubevent overview, distances offered, getting there, atmosphere
Facet pagefacet intro, how we ranked
Versuscomparison summary

Copy quality gates (§7.5)

The C-COPY controls every block must pass
ControlCheckGate
C-COPY-1Grounding — every factual claim maps to a verified fact.An ungrounded assertion fails and the block is regenerated or flagged.
C-COPY-2Originality — n-gram and embedding similarity of our copy against every source snapshot stays below 0.25.Over the threshold and the block is regenerated (C-IP-3).
C-COPY-3Contradiction — copy must never disagree with the structured numbers on the same page.Prose that says “flat” against a hilly profile is blocked.
C-COPY-4Helpfulness — a rubric score (specificity, decision-usefulness, completeness) at or above 0.70.Below the threshold and the block is revised.
C-COPY-5Human tier — all flagship pages and a sample of the rest are human spot-reviewed.Required before a tier-1 page is indexed (E-E-A-T).

Methodology version log (§16)

Every methodology version, with what changed and the recompute it triggered
VersionDateChangeRecompute
scoring-methodology-v1.0Phase 0Profile params (Δ=10m, W=50m, σ=20m, τ=1m), Minetti GAP function, FQI, distance-appropriate bands, dual-signal PB-potential, value/conditions/beginner/organisation, weights 0.45/0.4/0.15.baseline
copy-methodology-v1.0Phase 0Fact/expression separation; §7.2 fact taxonomy; copy slots; voice/tone spec; grounding + originality + contradiction + helpfulness gates.baseline

Any change to a formula, parameter, weight, source priority, fact taxonomy, or copy spec increments the relevant log entry, is published on this page, and triggers the appropriate recompute or regeneration (C-METH-1).