E-Steps Calculator (Marlin & Klipper Rotation Distance)
Extrude a known length, measure what actually came out, and this gives you the corrected e-steps for Marlin or rotation_distance for Klipper — plus the exact command to save it. It follows each firmware's own documented procedure, and catches the direction mistake everyone makes on Klipper. Moving firmware? It also converts the value you already have, no extruding needed.
The test, step by step
- Heat the hotend to your normal printing temperature so filament can actually flow. Leave the nozzle over empty air or above the bed.
- Using calipers, mark the filament above the point it enters the extruder (the top of the extruder body, or the end of the Bowden coupler). Marlin convention is 120 mm; Klipper's documentation specifies 70 mm. A second mark 10 mm lower helps if the first gets pulled inside.
- Set relative extrusion and push slowly. Marlin:
M83thenG1 E100 F100. Klipper:G91thenG1 E50 F60, which is what its own docs specify. The slow feed rate matters more than the distance — Klipper's documentation warns that a faster rate builds pressure in the extruder and skews the result, and cautions against using the interface's extrude buttons because they run faster. Fast extrusion tests under-read because the melt can't keep up. - Measure from the extruder entry to the mark. Ideally 20 mm remains. If more remains, the extruder pushed less than asked (under-extrusion); if less, it pushed more.
- Enter your current value and the measurements above, save the new value with the commands shown, and run the test again. A second pass within ±0.5 mm is as good as it gets. Klipper's docs suggest repeating the measurement outright if the first miss is more than about 2 mm, and the calculator flags that case.
The formulas
Klipper: new rotation_distance = current × actual ÷ requested
The Klipper line is stated the same way in its own documentation, which also asks for the result rounded to three decimal places — so that is what this page outputs when Klipper is selected.
They're inverses because the two firmwares describe the extruder in opposite units. Marlin counts steps per millimeter of filament, so under-extrusion means more steps are needed. Klipper describes millimeters per motor revolution, so under-extrusion means each revolution moved less than the config assumed, and the number comes down. Mixing them up moves you twice as far from correct — the calculator won't let you.
Worked example
An Ender 3 at the stock 93 steps/mm. You mark at 120 mm, extrude 100, and 23 mm remains, so only 97 mm went in.
- Marlin: 93 × 100 ÷ 97 = 95.88 →
M92 E95.88,M500 - The same extruder on Klipper with
rotation_distance: 33.5: 33.5 × 97 ÷ 100 = 32.495
When the number is far off
A genuine e-steps error is small — a few percent from manufacturing tolerance in the drive gear, or from an upgrade like a dual-gear extruder or a different motor. A result more than 10% away from what you had usually means something else is going on:
- Slipping or grinding. The drive gear is skating on the filament: idler tension too low, a partial clog, or the hotend too cold for the speed. Look for a shiny worn spot on the filament.
- Extruding too fast. 100 mm at F100 is right; at F300 many hotends can't melt fast enough and the reading is meaningless.
- Measuring from the wrong place. On a Bowden printer measure from the extruder, not the hotend.
- Absolute extrusion mode. Without
M83,G1 E100means "go to E=100", which may be 0 mm or 100 mm depending on the current E position. SendM83first, orG92 E0then the move. - A stepper motor with a different step angle (0.9° instead of 1.8°) or a geared extruder swap. These legitimately double or triple the value — the warning still fires, and that's fine if you know why.
Converting between Marlin and Klipper
A different job from calibration. If you are moving a printer from Marlin to Klipper, you already have a working e-steps figure — you want the equivalent rotation_distance, not a fresh measurement. Klipper documents the conversion:
steps_per_mm = full_steps_per_rotation × microsteps ÷ rotation_distance
full_steps_per_rotation is 200 for a 1.8° motor and 400 for a 0.9° one. microsteps is the microstepping your Marlin value was set at; Klipper's documentation says that if you are unsure, use 16 and set microsteps: 16 in the config to match.
Worked example
- Stock Ender 3, 93 steps/mm, 16 microsteps: 200 × 16 ÷ 93 = 34.409
- Same printer with a 0.9° motor: 400 × 16 ÷ 93 = 68.817
The geared-extruder trap
This is where most conversions go wrong. A Marlin steps/mm figure for a geared extruder — a BMG, a Clockwork, an Orbiter — already has the gearing baked into it. Klipper gives you two ways to express the same extruder:
- Without
gear_ratio: rotation_distance is measured at the motor. A BMG's 415 steps/mm converts directly to 7.711. - With
gear_ratio: 50:17: Klipper measures rotation_distance at the final gear instead, so the same extruder needs 22.679 — the direct figure multiplied by the ratio.
Both are correct. What breaks is mixing them: converting directly and setting gear_ratio leaves you out by the ratio, roughly 3× for a BMG, which shows up as severe over-extrusion on the first print. Tick the gear-ratio box above only if you intend to put gear_ratio in your config.
A converted value is the figure your printer was designed around, not a calibrated one — if the Marlin value was never measured, neither is this. Run the extrusion test at the top of the page afterwards.
Sources
- Klipper documentation, Rotation distance — the 70 mm mark, 50 mm extrusion at F60, the formula, three-decimal rounding, the speed warning and the 2 mm repeat threshold.
- The same document for the steps/mm conversion formula and its microsteps guidance. It states that with
gear_ratioset, rotation_distance is the travel per rotation of the final gear; the multiply-by-the-ratio rule for a geared extruder follows from that definition rather than being spelled out in the docs. - Marlin documentation for
M92,M500andM503.
What e-steps don't fix
E-steps make the extruder deliver the right length of filament. They don't correct for filament diameter variation, for how the plastic spreads at a given temperature, or for the slicer's assumptions about line width. That's the job of the flow rate, tuned per material after e-steps are set. Do this first, once per extruder; then use the flow rate calculator for each filament; then check dimensions with the shrinkage calculator. Doing them in another order means re-doing them.
Note that the popular Bambu Lab, Prusa MK4 and most Klipper-based printers ship with the extruder already calibrated and tuning flow is all that's normally needed. E-steps matter most on printers that have been modified — a new extruder, a new motor, a new mainboard — or on budget machines where the stock number was never right.
Frequently asked questions
How do I calibrate e-steps?
Heat the hotend, mark the filament above the extruder entry, extrude slowly, then measure back to the mark. Marlin convention is a 120 mm mark and 100 mm extruded at F100. Klipper documents its own figures: a 70 mm mark, 50 mm extruded with G91 then G1 E50 F60. Either way, if 23 mm remains of a 120 mm mark after asking for 100, only 97 mm went in, so new e-steps = old × 100 ÷ 97. The calculator switches to each firmware's procedure when you pick it.
Why does Klipper use 50 mm when everyone else says 100?
It is what Klipper's own rotation_distance documentation specifies: mark at 70 mm, extrude 50 mm with G1 E50 F60, and round the result to three decimal places. The slower F60 feed matters more than the distance — the docs warn that a faster rate builds pressure in the extruder and skews the result. Klipper also suggests repeating the measurement if it misses the requested length by more than about 2 mm.
What's the formula for e-steps?
New e-steps = current e-steps × requested length ÷ actual length extruded. For Klipper it's the other way up: new rotation_distance = current rotation_distance × actual length ÷ requested length, because rotation_distance is millimeters per revolution rather than steps per millimeter.
Why is Klipper's formula inverted?
Marlin's e-steps counts motor steps per millimeter of filament — under-extrusion means you need more steps, so the number goes up. Klipper's rotation_distance is millimeters of filament per motor revolution — under-extrusion means each revolution moved less than the config claims, so the number goes down. Same fix, opposite arithmetic.
How do I save the new value?
Marlin: send M92 E
How do I convert Marlin e-steps to Klipper rotation_distance?
Klipper documents the formula: rotation_distance = full_steps_per_rotation × microsteps ÷ steps_per_mm. With the usual 200-step motor and 16 microsteps, a stock Ender 3 at 93 steps/mm becomes 3200 ÷ 93 = 34.409. Use the microstepping the Marlin value was set at; Klipper's docs say to use 16 if unsure. The conversion gives you the value your printer was designed for, so it is still worth running the extrusion test afterwards.
Do I need gear_ratio for a geared extruder like a BMG?
Either way works, but you must be consistent, and this is where most conversions go wrong. A Marlin steps/mm for a geared extruder already includes the gearing. Converted directly, a BMG's 415 steps/mm gives 7.711 — correct only if you do not also set gear_ratio. If you do set gear_ratio: 50:17, Klipper measures rotation_distance at the final gear instead, so the value must be multiplied by the ratio, giving 22.679. Set gear_ratio without adjusting and you are out by about 3×.
Do I still need to calibrate flow after e-steps?
Yes. E-steps make the extruder push the right length of filament; flow (extrusion multiplier) corrects for how that plastic actually spreads when printed. Do e-steps once per extruder, then tune flow per material with the flow rate calculator.
Last reviewed September 10, 2026. Spotted an error or want another calculator? Tell us.