3D Printer Calibration: Step-by-Step
Calibration is what separates a printer that sometimes works from one that reliably produces good parts. This guide covers the full calibration sequence — bed leveling, Z-offset, e-steps, flow rate, PID, and pressure advance — in the correct order, with the exact procedure for each step.
Calibration order
Each step depends on the previous one. Do not jump to flow rate before e-steps, or pressure advance before flow rate.
| Step | What it does | Tool needed | When to redo | Notes |
|---|---|---|---|---|
| 1 | Bed leveling | Manual or auto (BLTouch / CR Touch) | First setup, after moving printer, if first layer fails | Manual leveling first even on printers with auto-leveling — mesh compensation works best when the bed is already close. |
| 2 | Z-offset | Slicer / printer UI | After bed leveling, any first-layer issue | Target: nozzle presses filament flat without squishing through the layer. Paper test: slight resistance when sliding. |
| 3 | E-steps (extruder calibration) | Ruler + command line (M92) | New printer, after extruder change | Only needed on printers without flow compensation. Bambu / Prusa MK4 calibrate automatically. |
| 4 | Flow rate / extrusion multiplier | Single-wall cube print | New filament brand, any under/over-extrusion | Per-filament setting. 0.95–1.05 covers most spools. |
| 5 | PID tuning | M303 command | Temperature fluctuates ±3°C+, after hotend change | Run M303 E0 S210 C8 for hotend. Saves with M500. Only needed if temps are unstable. |
| 6 | Pressure advance / linear advance | OrcaSlicer calibration / built-in | Rounded corners, blobs at direction changes | Run after flow rate is correct. Bambu Lab sets this automatically per filament. |
Step 1: Bed leveling
The goal is a consistent gap between the nozzle and bed across the entire print surface. For most printers, this means 0.1–0.2 mm — roughly the thickness of a standard sheet of paper.
- Manual leveling (paper test)
- Home the printer (G28). Disable steppers (M84). Move the nozzle to each corner and slide a sheet of paper under it — there should be slight resistance when you pull the paper. Adjust the bed knob until resistance is consistent at all four corners, then check the center.
- Auto-leveling (BLTouch, CR Touch, LeviQ, etc.)
- Auto-leveling probes measure a mesh of points across the bed and compensates in software. It does NOT replace manual leveling — the bed should be manually leveled close first, then the mesh handles remaining variance. Run the mesh calibration after manual leveling, then save (M500).
- Bambu Lab / Prusa MK4
- Both run automatic leveling before every print. No manual procedure is needed unless you are seeing persistent first-layer problems — in that case, check for a warped build plate before anything else.
Step 2: Z-offset
Z-offset is the fine distance adjustment between the nozzle and the bed at the home position. A correct Z-offset produces a first layer that is visibly squished flat but not so squished that it oozes sideways between lines.
Signs of incorrect Z-offset:
- Too high: first layer lines are round, not flat, filament doesn't stick, gaps between lines
- Too low: nozzle drags through previously deposited material, filament builds up on the nozzle, clogged on first layer
Step 3: E-steps calibration
E-steps tell the firmware how many motor steps equal 1 mm of filament. If this is wrong, all other calibration is undermined. Modern printers (Bambu, Prusa MK4) calibrate automatically. On printers running stock Marlin firmware, check and set e-steps once after setup.
| Printer | Default e-steps | Method |
|---|---|---|
| Creality Ender 3 / S1 | 93 steps/mm | Manual M92 E<value> |
| Creality K1 / K1 Max | Factory calibrated | Slicer flow rate only |
| Prusa MK4 | Auto (input shaper) | PrusaSlicer first layer calibration |
| Prusa MK3S+ | 280 steps/mm (Bondtech) | Manual M92 or Prusa Calibration wizard |
| Bambu Lab (all models) | Auto | Built-in flow calibration per filament |
| Elegoo Neptune 4 / Pro | 415 steps/mm | Manual M92 E<value> |
| Anycubic Kobra 3 | Auto (LeviQ 2.0) | Built-in auto-leveling, manual flow rate |
To calibrate e-steps manually:
- Mark 120 mm of filament above the extruder with a felt tip
- Send
M83(relative extrusion mode) - Send
G1 E100 F100to command 100 mm of extrusion - Measure how far the mark moved. If it moved 95 mm instead of 100 mm:
- New e-steps = (current e-steps × 100) ÷ actual mm moved
- Send
M92 E<new value>thenM500to save
Step 4: Flow rate (extrusion multiplier)
Flow rate is a per-filament multiplier applied on top of e-steps. Different brands and colors of the same material can have slightly different actual diameters, requiring flow rate adjustment. Target: 0.95–1.05.
Print a single-wall cube (20 × 20 × 20 mm, 1 perimeter, no infill, no top/bottom layers). Measure the wall thickness with calipers. It should equal your line width (0.4 mm for a 0.4 mm nozzle). Adjust flow rate = (target wall width) ÷ (measured wall width).
In OrcaSlicer: Calibration → Flow Rate. In PrusaSlicer / BambuStudio: set as a filament override under "Extrusion multiplier" in the filament profile.
Step 5: PID tuning (only if needed)
PID controls how the printer maintains nozzle and bed temperature. Factory settings are usually fine. Only run PID tuning if you see temperatures fluctuating more than ±2°C during a print, or after replacing the hotend or heater block.
Send M303 E0 S210 C8 (hotend, 210°C, 8 cycles). Wait for it to finish — it will output new Kp, Ki, Kd values. Send M301 P<Kp> I<Ki> D<Kd> then M500 to save. For the bed: M303 E-1 S65 C8.
Step 6: Pressure advance
Pressure advance (Klipper) or linear advance (Marlin) compensates for the lag between extruder movement and filament pressure at the nozzle tip. Without it, corners accumulate excess material, and straight sections after corners are under-extruded.
In OrcaSlicer: Calibration → Pressure Advance. This prints a tower that varies the pressure advance value. Find the layer with the sharpest corners and no blobs — read off the value from the printed scale. Typical values: 0.02–0.08 for direct drive, 0.4–0.8 for Bowden.