Voron Bed Leveling Guide — Perfect First Layers Every Time
Troubleshooting Calibration Bed Leveling
A perfect first layer is the foundation of every successful 3D print. On Voron printers, bed leveling involves multiple systems working together: mechanical adjustment, probe-based leveling, bed mesh compensation, and Z offset tuning. This guide covers every method for every Voron model — from the single-Z V0.2 to the quad-gantry V2.4. Last updated: May 2025.
Before you start: heat your printer to printing temperature (bed at 100°C, hotend at 245°C for ABS/ASA). Thermal expansion changes clearances by 0.05-0.15mm — enough to make a cold-leveled bed print poorly. Always level at temperature.
Bed Leveling Systems by Voron Model
Each Voron variant uses a different bed leveling approach. Understanding your specific system is the first step.
| Model | Z System | Leveling Method | Key Commands |
|---|---|---|---|
| V0.2 | Single Z + manual | Manual bed screws + Z offset | PROBE_CALIBRATE |
| Trident | Triple-Z + auto-level | Z_TILT_ADJUST + screw tilt adjust | Z_TILT_ADJUST, SCREWS_TILT_CALCULATE |
| V2.4 | Quad-Z + auto-level | QUAD_GANTRY_LEVEL + screw tilt adjust | QUAD_GANTRY_LEVEL, SCREWS_TILT_CALCULATE |
Step 1: Z Offset Calibration
Z offset is the distance between the nozzle and the bed when the probe triggers. Getting this right is essential before any other bed leveling step.
Paper Method — Getting in the Ballpark
- Heat the bed to 100°C and hotend to 245°C
- Home the printer:
G28 - Move the toolhead to the center of the bed:
G1 X150 Y150 F3000(adjust coordinates for your bed size) - Run
PROBE_CALIBRATE— Klipper will probe the bed and move the nozzle to the probe Z height - Place a standard piece of printer paper (0.08-0.1mm) between the nozzle and bed
- Use the
TESTZ Z=-0.1andTESTZ Z=0.1commands to micro-adjust the nozzle position - When the nozzle grips the paper with slight resistance — you can pull the paper but it drags — the Z offset is close
- Run
ACCEPTand thenSAVE_CONFIGto store the value
The paper method gets you within 0.05-0.1mm. For final tuning, use a live first-layer test.
Live Z Adjustment — Fine Tuning
Print a 100x100mm single-layer square at your normal printing temperature. Observe the extrusion:
- Too high: Lines are round, separate, and don't touch each other. Gaps between lines. Poor bed adhesion. Solution: lower Z by
SET_GCODE_OFFSET Z_ADJUST=-0.02and reprint. - Too low: Lines are translucent, the nozzle drags through the filament, and the surface is rough. The nozzle may scrape the PEI sheet. Solution: raise Z by
SET_GCODE_OFFSET Z_ADJUST=0.02and reprint. - Just right: Lines are slightly squished together with a smooth matte finish. No gaps between lines. The surface looks uniform with a subtle satin sheen.
Adjust in 0.01-0.02mm increments. Voron printers are sensitive enough that 0.01mm makes a visible difference. Once the first layer looks perfect, note the Z_ADJUST value and add it to your PROBE_CALIBRATE Z offset, or save it in your PRINT_START macro.
Pro tip: Always do Z offset adjustment at the same bed temperature. A cold vs. hot Z offset can differ by 0.1mm due to thermal expansion of the bed, frame, and nozzle.
Step 2: Bed Mesh Calibration
Bed mesh creates a 3D map of your bed surface and compensates for warping, tilt, and local deviations. Every Voron model uses this step.
Running Bed Mesh
- Heat the bed to printing temperature (100°C for ABS) — the bed warps as it heats, so calibrate at temperature
- Run
BED_MESH_CALIBRATE - Recommended grid sizes: 5x5 for V0.2, 7x7 for V2.4/Trident 250, 9x9 for V2.4 350 (larger beds need more probe points)
- After calibration, visualize the mesh:
BED_MESH_OUTPUT PGP=1 - If deviations are under 0.2mm, save the profile:
BED_MESH_PROFILE SAVE=default - Add
BED_MESH_PROFILE LOAD=defaultto yourPRINT_STARTmacro
Interpreting Your Bed Mesh
The PGP output shows your bed visualized as a contour map. Here's what to look for:
- < 0.1mm total deviation: Excellent. Your bed is very flat, your frame is square, and your gantry is well-aligned. The mesh is just fine-tuning.
- 0.1-0.3mm total deviation: Good. This is normal for most Voron beds. The mesh will compensate fine.
- 0.3-0.5mm total deviation: Acceptable but worth investigating. Check frame squareness, bed mounting screws, and gantry alignment.
- > 0.5mm total deviation: Something is mechanically wrong. The bed may be warped, the frame may not be square, or the gantry may be tilted. Fix the mechanical issue before relying on mesh compensation.
A common mistake: running bed mesh without running gantry leveling first. If your gantry is tilted, the bed mesh will show a false slope that the mesh can compensate for — but it's better to fix the tilt and run a flatter mesh. Always do gantry leveling before bed mesh.
Step 3: Screw Tilt Adjust — Trident and V2.4
Screw tilt adjust uses your probe to measure the bed's tilt relative to the nozzle and tells you exactly how much to turn each bed leveling screw. This automates the tedious manual leveling process.
Configuration
Add a [screws_tilt_adjust] section to your printer.cfg with the screw positions for your build plate. Example for a V2.4 350:
[screws_tilt_adjust]
screw1: 30, 30
screw2: 320, 30
screw3: 320, 320
screw4: 30, 320
screw_thread: CW-M5
The coordinates are the X,Y positions of each bed screw. Use CW-M5 for clockwise M5 screws (standard Voron bed screws).
Procedure
- Run
G28to home the printer - Run
SCREWS_TILT_CALCULATE— Klipper will probe each screw position and report the required adjustment - Klipper output example:
"screw1: 0.10 turns CW, screw2: -0.05 turns CCW, screw3: 0.00, screw4: 0.02 turns CW" - Turn each screw by the specified amount. One full "turn" is 360° of a standard M5 screw, which changes height by ~0.8mm.
- Re-run
SCREWS_TILT_CALCULATEand repeat until all screws show < 0.05 turns (i.e., the bed is level within ~0.04mm)
Pro tip: Use a screwdriver with a marked handle or a digital angle gauge to count partial turns accurately. Mark the starting position of each screw with a piece of tape so you can track how much you've turned them.
Step 4: Gantry Leveling — Trident (Z_TILT_ADJUST)
Trident's triple Z system uses three independent Z motors. The gantry can tilt in any direction, and Z_TILT_ADJUST corrects this automatically.
Prerequisites
- All three Z motors must be wired correctly and moving in the right direction
- The Z endstop is set up and functioning (typically a probe-based or switch-based Z stop)
- Your
printer.cfghas a[z_tilt]section with probe points defined
Procedure
- Run
G28to home the printer - Run
Z_TILT_ADJUST— Klipper will probe at the defined points and adjust each Z motor independently - Check the output: the gantry should now be parallel to the bed within 0.02-0.05mm
- Run
Z_TILT_ADJUSTagain to verify — the adjustments should be very small (< 0.02mm) on the second pass - Run
SAVE_CONFIGto store the Z motor position offsets
Important: Z_TILT_ADJUST only works if the mechanical gantry is reasonably close to level. If one side is significantly higher than the other (more than 2-3mm), level the gantry manually first using paper feeler gauges under each corner, then run the auto-adjust.
Step 5: Quad Gantry Leveling — V2.4
The V2.4 has four independent Z motors, one at each corner. Quad Gantry Leveling (QGL) is the process of making the gantry parallel to the frame top.
Prerequisites
- All four Z motors are wired and moving correctly — check that "Z1" is rear-left, "Z2" rear-right, "Z3" front-right, "Z4" front-left per the Voron wiring diagram
- The Z belts are tensioned evenly — loose belts cause inconsistent leveling results
- Your
printer.cfghas a[quad_gantry_level]section with correct screw positions
Procedure
- Run
G28to home all axes - Run
QUAD_GANTRY_LEVEL— Klipper will probe at all four gantry points and adjust each Z motor - The output shows the adjustment applied to each Z motor (in steps or mm)
- Re-run
QUAD_GANTRY_LEVELto verify — the adjustment on the second run should be near zero - If the second run shows significant adjustment (> 0.1mm), there's a mechanical issue: check belt tension, Z motor mount tightness, and gantry squareness
- Once stable, run
SAVE_CONFIGto save the Z offset values
Common QGL Issues
- QGL fails with "did not level successfully" error: One of your Z motors is too far out of alignment. Manually level the gantry using paper feeler gauges first, then re-run QGL. If a motor is consistently problematic, check the motor wiring or belt path.
- QGL completes but first layer is still uneven: Your bed itself may be tilted. Run
SCREWS_TILT_CALCULATEafter QGL to verify the bed is level relative to the gantry. If the bed is tilted, you need both QGL (for gantry) and screw tilt adjust (for bed). - Gantry binds after QGL: The gantry may have been racked before leveling. Loosen the Z belt tension on all four corners, manually square the gantry by measuring diagonals, re-tension evenly, then run QGL again.
Complete Leveling Sequence (Recommended Order)
For the best results, follow this sequence in order. Each step assumes the previous one is complete.
- Mechanical check: Frame square, gantry racking, belt tension (see our calibration guide)
- Gantry leveling:
Z_TILT_ADJUST(Trident) orQUAD_GANTRY_LEVEL(V2.4) — skip for V0.2 - Screw tilt adjust:
SCREWS_TILT_CALCULATE— manual bed leveling for V0.2 - Z offset:
PROBE_CALIBRATE+ paper method + live adjustment - Bed mesh:
BED_MESH_CALIBRATE+ save profile - First layer test: Print a single-layer square and verify quality
Troubleshooting Flowchart
First layer too squished (translucent lines, nozzle scraping)
→ Increase Z offset by +0.02mm using SET_GCODE_OFFSET Z_ADJUST=0.02
→ Re-test with a first-layer square
→ If still too squished, try +0.04mm
→ If overshoots (gaps appear), dial back to +0.02mm refinement
First layer too high (round lines with gaps, poor adhesion)
→ Decrease Z offset by -0.02mm using SET_GCODE_OFFSET Z_ADJUST=-0.02
→ Re-test with a first-layer square
→ Continue in -0.02mm steps until lines are slightly squished together
→ If you overshoot and get scraping, increase by +0.01mm
First layer uneven across the bed (good in center, bad at edges)
→ Run BED_MESH_CALIBRATE — your mesh may be outdated
→ Run SCREWS_TILT_CALCULATE — the bed may be tilted relative to the gantry
→ If on V2.4, run QUAD_GANTRY_LEVEL — the gantry may not be parallel to the frame
→ Check that the build plate is clean and free of debris under the spring steel sheet
Mesh shows a consistent slope (one corner always high)
→ The gantry is tilted. Run gantry leveling (Z_TILT_ADJUST or QUAD_GANTRY_LEVEL)
→ If leveling doesn't fix it, check that all Z motors are moving the correct direction
→ Verify Z belt tension is even on all sides
Mesh shows a saddle shape (center lower than edges, or vice versa)
→ The build plate is warped. This is normal for cast aluminum tooling plates — they often have a slight bow
→ The bed mesh will compensate for up to 0.3-0.4mm easily
→ If the warp is > 0.5mm, consider replacing the build plate or using a cast aluminum plate (MIC6) instead of a stamped steel one
QGL fails repeatedly on the same motor
→ Check that Z motor connection is secure
→ Check that Z belt isn't slipping on the pulley — tighten the pulley set screw
→ Verify motor driver current is adequate (0.8-1.2A for typical NEMA17 Z motors)
→ Mechanical binding: move the gantry up and down by hand at that corner and feel for resistance
Advanced Tips
Bed Mesh at Temperature vs. Cold
Always run bed mesh at printing temperature. The aluminum build plate expands and can change shape by 0.1-0.2mm from room temperature to 100°C. A mesh created at room temperature will be inaccurate for hot printing. Some builders create two mesh profiles — one for ABS (100°C) and one for PLA (60°C) — and switch between them in their slicer's start G-code.
Adaptive Bed Mesh
Klipper supports adaptive bed meshing, which only probes the area where your print will be. This is faster and more accurate because it focuses probe points on the print area. Add ADAPTIVE=1 to your BED_MESH_CALIBRATE command within your PRINT_START macro after you know the print's bounding box. This gives you finer resolution where it matters.
Virtual Endstop vs. Hardware Endstop
Voron printers typically use a hardware Z endstop on the V0.2 (a microswitch on the bed) and probe-based virtual endstops on Trident and V2.4 (using the nozzle probe or inductive probe as the Z reference). If you're using a virtual endstop, make sure [safe_z_home] is configured correctly in your printer.cfg, or the printer will home Z at an undefined position.