Back to CoursePace

How CoursePace Works

CoursePace turns a marathon course into practical split targets. Instead of pretending every kilometer costs the same, we estimate how climbs and descents change effort, then convert that into a steady race plan.

Data

Each race starts with the best route file we can find, preferably an official GPX from the race organizer. If an official file is not available, we use a reviewed community route and label it with a lower confidence tier.

We normalize the route to marathon distance and attach elevation data from credible sources.

Preprocessing

Elevation data is noisy, so we clean it before using it for pacing. The route is checked for suspicious gaps, resampled at consistent distances, and smoothed so small map artifacts do not create fake surges.

We also review places where map terrain can be wrong for runners. A bridge, tunnel, underpass, or overpass may sit above or below the ground surface returned by elevation services, so those sections can receive manual course-surface corrections.

Algorithm

After the course profile is prepared, CoursePace converts distance into effort-adjusted distance. The grade-to-effort curve is inspired by Aaron Schroeder's reverse-engineering of Strava's grade adjusted pace model.

Read the reverse-engineering article
g_i = Δh_i / Δd_i

For segment i, g_i is grade, Δh_i is vertical displacement, and Δd_i is course distance.

f_i = F(clip(g_i, -45%, 45%)) D_i* = Δd_i · f_i

F maps grade to an effort factor, and D_i* is the effort-adjusted distance for that segment.

D* = Σ D_i* P* = T_goal / D*

D* is total effort-adjusted distance, T_goal is your target finish time, and P* is the flat-equivalent effort pace.

P_j = P* · (D_j* / D_j) C_j = P* · Σ_{k≤j} D_k*

For split j, P_j is target pace, D_j* / D_j is the split adjustment ratio, and C_j is cumulative time through that split.

In the split table, a factor above 1.000 means that split costs more than flat running, while a factor below 1.000 means it costs less. Target pace is the actual pace to run for that split while keeping effort steady.