Bike speed from gear and cadence calculator
Pedalling at 90 rpm in a 2.5 gear on a wheel with a 2.105 m rolling circumference gives about 28.42 km/h: enter cadence, the gear ratio or tooth counts and the circumference to get your speed in km/h, mph and m/s. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Cadence rpm
- 90
- Gear ratio
- 2.5
- Circumference m
- 2.105
- Circumference mm
- 2,105
- Wheel rpm
- 225
- Speed ms
- 7.89375
- Speed kmh
- 28.4175
Road cyclists, trainers, and gearing nerds constantly ask what speed a given cadence produces in a chosen gear on a real wheel. The answer is not a vague range from a chart: it is a fixed product of pedaling revolutions per minute, the drivetrain gear ratio, and the tire rolling circumference. This bike speed from gear and cadence calculator accepts cadence in RPM, either a direct gear ratio or chainring and cog tooth counts, and the wheel rolling circumference in metres or millimetres. Use it to plan training zones, compare cassette steps, or audit indoor trainer speed estimates without spreadsheets or guesswork.
How cadence, gear ratio, and circumference become road speed
Every full pedal revolution turns the rear wheel through the drivetrain by a fixed factor called the gear ratio. On a single chainring and cog that ratio is simply the number of teeth on the chainring divided by the number of teeth on the rear sprocket. Multiplying your pedaling cadence in revolutions per minute by that gear ratio yields the rear wheel rotational speed in RPM.
Distance covered per minute is then wheel RPM times the rolling circumference of the tire as mounted and inflated; dividing by sixty converts that distance-per-minute figure into metres per second. Multiplying metres per second by three point six gives kilometres per hour, and dividing kilometres per hour by one point six zero nine three four four converts to statute miles per hour.
The compact identity speed in kilometres per hour equals cadence times gear ratio times circumference in metres times zero point zero six is algebraically identical and convenient for mental checks. Rolling circumference is not the same as nominal tire size printed on the sidewall: ISO and ETRTO charts list approximate developed circumferences for common 700c and 650b sizes under typical load, and a small change in pressure or tire model moves the number by a few millimetres.
This capability does not estimate circumference from tire markings; you supply the measured or tabulated rolling length so the speed result stays deterministic and auditable for training logs and equipment comparisons.
When this speed calculation comes in handy
Coaches and self-coached riders use a bike speed from gear and cadence calculator to translate indoor cadence targets into expected outdoor road speed for a planned gear, or to reverse the question when choosing cassette steps for a hilly gran fondo. Indoor trainer apps that report cadence but not GPS speed can estimate equivalent outdoor pace for a given tire and gear when calibrating perceived effort. Failed validation does not consume balance.
Pin rounded speeds and wheel RPM in tests so a future unit conversion change is caught immediately, and you get reproducible road-speed numbers for training plans, SEO landings, and edge workers without standing up a full bike computer stack.
What you can do with it
Training pace from cadence targets
Convert a planned cadence and gear into expected km/h or mph so outdoor efforts match indoor RPM goals for a known wheel circumference.
FAQ
How do you calculate bike speed from cadence and gear?
Multiply cadence (RPM) by gear ratio to get wheel RPM, then multiply by rolling circumference in metres and divide by 60 for m/s. Convert with ×3.6 for km/h or ÷1.609344 for mph.
What is gear ratio on a bicycle?
Gear ratio is chainring teeth divided by rear cog teeth (for example 50/20 = 2.5).
Should I use tyre size or rolling circumference?
Use rolling circumference in metres or millimetres (measured or from an ISO/ETRTO table for your tyre). Nominal size labels alone are not accepted; they are not a unique circumference.
What cadence and circumference ranges are accepted?
Cadence must be greater than 0 and at most 300 RPM. Circumference must be 0.5–4 m or 500–4000 mm. Gear ratio must be greater than 0 and at most 20.
How fast do I go at 90 rpm in a 2.5 gear?
About 28.42 km/h on a wheel with a 2.105 m rolling circumference. The rear wheel turns 225 times a minute, and that distance per minute is converted into kilometres per hour.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/hobby/sport-bike-speed-from-cadence-gear \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"cadence_rpm":90,"gear_ratio":2.5,"circumference_m":2.105}'const res = await fetch("https://api.kit.forhosting.com/hobby/sport-bike-speed-from-cadence-gear", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"cadence_rpm": 90,
"gear_ratio": 2.5,
"circumference_m": 2.105
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/hobby/sport-bike-speed-from-cadence-gear",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"cadence_rpm": 90,
"gear_ratio": 2.5,
"circumference_m": 2.105
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/hobby/sport-bike-speed-from-cadence-gear", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"cadence_rpm":90,"gear_ratio":2.5,"circumference_m":2.105}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"cadence_rpm":90,"gear_ratio":2.5,"circumference_m":2.105}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/hobby/sport-bike-speed-from-cadence-gear", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"cadence_rpm": 90,
"gear_ratio": 2.5,
"circumference_m": 2.105
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "hobby.sport_bike_speed_from_cadence_gear",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
It returns wheel RPM plus road speed in metres per second, kilometres per hour, and miles per hour using the same pure arithmetic on the free browser path and the paid API.
Input contract, response fields, and validation rules
Example: ninety RPM, gear ratio two point five, circumference two point one zero five metres yields wheel RPM two hundred twenty-five and about twenty-eight point four two kilometres per hour. POST a JSON body with pedaling cadence and enough information to resolve both gear ratio and wheel circumference. The field cadence_rpm is required and must be a finite number greater than zero and at most three hundred revolutions per minute; aliases such as cadence and rpm are accepted. Gear ratio may be sent directly as gear_ratio, a finite number greater than zero and at most twenty, or derived from chainring_teeth and cog_teeth when both tooth counts are present. If you send both a ratio and tooth counts, the product of chainring over cog must match the ratio within a tight tolerance or the request fails with invalid_input. Circumference is required as circumference_m between zero point five and four metres, or as circumference_mm between five hundred and four thousand millimetres; when both units appear they must agree after conversion. Missing fields, empty strings, non-finite values, and out-of-range numbers fail with invalid_input naming the field, and those failures are not billed. On success the body echoes cadence_rpm, gear_ratio, circumference_m and circumference_mm, optional chainring_teeth and cog_teeth when provided, wheel_rpm, speed_ms, speed_kmh, speed_mph, and a short formula string for display. Prefer speed_kmh or speed_mph for dashboards; keep speed_ms and wheel_rpm when you need SI intermediates or trainer cross-checks.
Where a bike speed from cadence API earns its keep
Content that ranks for bike speed from gear and cadence calculator benefits when the interactive path and the automation path share one deterministic implementation, so a blog example and a production webhook never disagree on twenty-eight point four versus twenty-eight point five.
Integration use cases
Cassette and chainring comparison
Compare road speed at the same cadence across tooth combinations by sending chainring_teeth and cog_teeth (or gear_ratio) for each setup.
Trainer and content automation
Estimate outdoor-equivalent speed from cadence-only trainer data, or power SEO widgets and bulk gear tables from the same pure API contract.
Technical questions
What does the bike speed from gear and cadence calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.