Klipper extrusion calibration: rotation distance step by step

Quick answer: mark the filament 120 mm above the extruder inlet, extrude 100 mm (G91, then G1 E100 F60), measure what actually went through, and set new rotation_distance = old × actual ÷ requested. Paste the value under [extruder] in printer.cfg, RESTART, and repeat the test once to confirm. One test, one formula — the rotation distance calculator does the arithmetic and prints the exact config line. The rest of this guide is the full procedure, the one direction-of-correction trap that trips everyone coming from Marlin, and a worked example with real numbers.

The quick procedure

  1. Mark filament 120 mm above the extruder inlet.
  2. Heat the hotend to print temperature.
  3. Extrude: G91, then G1 E100 F60.
  4. Measure the mark again — actual = 120 − remainder.
  5. new = old × actual ÷ requested.
  6. Paste into printer.cfg, RESTART, re-test.

Two preconditions: max_extrude_only_distance must be at least 101 (the default 50 rejects G1 E100), and the extrusion must be slow — F60 (1 mm/s) keeps back-pressure from eating into the measurement.

Full procedure, step by step

  1. Allow a 100 mm extrude-only move. In printer.cfg, set max_extrude_only_distance: 101 (or more) in the [extruder] section, then RESTART. Skip this and the console rejects the test move.
  2. Heat and mark. Bring the hotend to normal print temperature (Klipper refuses cold extrusion by default). Mark the filament exactly 120 mm above the extruder inlet with a ruler and a fine marker or a small tape flag.
  3. Extrude 100 mm slowly. In the console: G91 (relative positioning), then G1 E100 F60. Slow on purpose — this measures the drive gears, not the melt limit.
  4. Measure what actually went through. Measure from the inlet to the mark again. Actual extrusion is 120 − remainder: if 23 mm remains, the printer delivered 97 mm.
  5. Compute the new rotation_distance. new = old × actual ÷ requested. The rotation distance calculator does this and shows the paste-ready line.
  6. Save and confirm. Under [extruder] in printer.cfg, paste the computed value — it looks like this:
    rotation_distance: 7.3575
    then RESTART and repeat the test once. The mark should now land 20 mm from the inlet (100 mm consumed).

Why rotation distance moves the opposite way to e-steps

This is the part forum threads keep getting wrong, so it gets its own section. Klipper and Marlin describe the same mechanical property inreciprocal units:

  • Marlin e-steps = steps per millimeter. If the printer under-extrudes, it needs more steps to push a millimeter — the value goes up: new = old × requested ÷ actual.
  • Klipper rotation_distance = millimeters per revolution. If 100 mm requested only delivered 97 mm, each revolution physically moved 3% less filament than the config claims — the honest value is smaller: new = old × actual ÷ requested.

So when someone asks "why is my rotation distance going down when I'm under-extruding?" — that is the correct direction. A lower rotation_distance does not mean less extrusion; it means Klipper turns the stepper more revolutions for the same commanded distance, which feeds more filament. Copying a Marlin habit ("under-extrusion → increase the number") inverts the correction and doubles the error. This matches the official Klipper Rotation_Distance documentation, which derives the value from this same measure-and-trim test.

Worked example with real numbers

A Bondtech-style geared extruder with rotation_distance: 7.585 in printer.cfg. The test: mark at 120 mm, G1 E100 F60, and the mark now sits 23 mm from the inlet — actual extrusion is 120 − 23 = 97 mm of the 100 mm requested.

StepMathResult
1. Actual extrusion120 mm − 23 mm remainder97 mm
2. New rotation_distance7.585 × 97 ÷ 1007.35745 → 7.3575
3. Correction(7.3575 − 7.585) ÷ 7.585−3.0% (value goes down — correct for under-extrusion)
4. Paste into printer.cfgunder [extruder], then RESTARTrotation_distance: 7.3575

These are exactly the formulas the rotation distance calculator applies — enter 7.585, 100 and 97 there and you get 7.3575 with the paste-ready line. Had the same printer been on Marlin at 418.5 steps/mm, the identical 97 mm result would push e-steps up to 418.5 × 100 ÷ 97 ≈ 431.4 — same fix, opposite direction. After saving, repeat the test once: the mark should land 20 mm from the inlet, and anything within about ±0.5 mm is measurement noise, not a reason to iterate further.

Troubleshooting: what extrusion symptoms mean

SymptomLikely causeFix
Consistent under-extrusion in every print and every filamentrotation_distance too high (printer feeds less than commanded)Run this calibration; the corrected value will come out lower.
Bulging, overfilled top surfaces, dimensionally fat partsrotation_distance too low (over-extrusion)Same test — the corrected value comes out higher.
Under-extrusion only at higher speeds, fine when slowHotend melt limit, not extrusion — flow demand exceeds capabilityCheck the volumetric flow calculator and cap speed; rotation distance is already right.
Gaps at seam starts, bulged cornersPressure lag in the melt zoneTune pressure advance after extrusion is calibrated.
Test result differs between filamentsFilament diameter variance or grip slip on soft/very hard materialCalibrate with your most-used filament; fix remaining per-material differences with slicer flow, not printer.cfg.
Result changes after every run of the testSlipping drive gear, loose grub screw, or a partially clogged nozzleFix the mechanical fault first — calibrating on top of slip just records the slip.

Frequently asked questions

How do I calibrate extrusion on Klipper?
Mark the filament 120 mm above the extruder inlet, heat the hotend, extrude 100 mm with G91 then G1 E100 F60, and measure the remaining distance to the mark. Actual extrusion = 120 − remainder. New rotation_distance = old × actual ÷ requested. Paste it under [extruder] in printer.cfg, RESTART, and repeat the test once to confirm.

Why is my rotation distance going down when the printer under-extrudes?
rotation_distance is millimeters of filament per full stepper revolution. If 100 mm requested only delivered 97 mm, each revolution physically moved 3% less filament than the config claims — so the corrected value must go down (old × 97 ÷ 100). This is the opposite of Marlin e-steps, which are steps per millimeter and go up for the same under-extrusion. A lower rotation_distance is not "less extrusion" — it makes the stepper turn more for the same commanded distance.

Is rotation distance the same as e-steps?
They calibrate the same mechanical property in reciprocal units. rotation_distance is mm per revolution; Marlin e-steps are steps per mm. The same measure-and-trim test tunes both, but the formula is inverted: Klipper uses old × actual ÷ requested, Marlin uses old × requested ÷ actual.

Why does Klipper refuse my G1 E100 command?
The default max_extrude_only_distance is 50 mm, so a 100 mm extrude-only move is rejected. Set max_extrude_only_distance to at least 101 in the [extruder] section (and make sure max_extrude_cross_section is not the binding limit), then RESTART before running the test.

Should I calibrate rotation distance or flow first?
Rotation distance first, always. Flow (the slicer extrusion multiplier) is a percentage on top of the mechanical feed — trimming the multiplier while the feed is wrong just hides the error in one profile. Fix the hardware number in printer.cfg, leave the slicer at 100%, and only touch flow afterwards if a specific filament still needs it.

How often do I need to redo extrusion calibration?
After changing anything in the drive path — extruder gears, motor, or a different hotend/extruder assembly — and whenever prints show consistent over- or under-extrusion across filaments. It normally survives filament swaps and firmware updates, since it lives in printer.cfg.