Dual extrusion calibration lines up a printer’s second nozzle with its first so that both lay plastic in the same place (the XY offset) and at the same height (the Z offset), and it stops the idle nozzle from oozing onto the part. It applies to printers with two or more nozzles: IDEX machines, dual-nozzle printers such as the Bambu Lab H2D, and toolchangers such as the Prusa XL. Single-nozzle systems like an MMU or AMS have no second nozzle, so there is no offset to set.
The order that works is Z offset first, then XY offset, then ooze and purge settings, then a verification print. Reference numbers from manufacturers: Bambu Lab designs the H2D’s nozzles to sit 5 mm apart in height, and its sensor-based XY calibration is documented as accurate to about 15–20 µm. Prusa’s manual XL test is built to correct offset errors up to ±1 mm. Your printer’s own routine takes priority over anything generic here.
The consumer toolchanger 3D printer: the SnapSwap 4-toolhead system swaps heads in 5 seconds for true multi-color and multi-material printing, with smart calibration and auto filament loading.
- 4 toolheads · 5 s swap
- Up to 500 mm/s · 20,000 mm/s²
- 270 mm cube build volume
- Multi-color & multi-material

Calibration order in seven steps
- Clean both nozzles and remove residue; make sure the filament is dry and the nozzles are the same type you will print with.
- Run the printer’s automatic nozzle offset routine, if it has one.
- Set or check the Z offset between the nozzles.
- Set or check the XY offset with a two-colour alignment test.
- Enable ooze prevention and set idle temperature and purge amounts.
- Print a verification model that uses both nozzles on the same layers.
- Repeat after any nozzle change, nozzle crash or hotend swap.
What needs calibrating, and where it is set
| Parameter | What it does | Where it lives |
|---|---|---|
| XY offset | Lines up the second nozzle’s X and Y position with nozzle 1 | Printer firmware or menu (Marlin M218, Prusa XL tool settings, Bambu calibration); not in both firmware and slicer |
| Z offset | Makes both nozzles touch the bed at the same height | Firmware (Marlin M218 T1 Z on DUAL_X_CARRIAGE or SWITCHING_NOZZLE builds) or the printer’s calibration |
| Idle (standby) temperature | Cools the unused nozzle to limit oozing | Slicer: ooze prevention and idle temperature |
| Purge or prime amount | Fills the nozzle after a tool change | Slicer: minimal purge and wipe tower |
| Flow and pressure advance per material | Keeps each filament’s line width correct | Slicer and firmware, set for each filament separately |
Z offset between the nozzles
The nozzles must reach the bed at the same height, or the lower one drags across the print while the other prints in the air. Bambu Lab explains the principle on the H2D: the ideal height difference between the left and right nozzle is 5 mm, so the bed moves 5 mm when it switches nozzles. Assembly errors and nozzle tolerances mean the real figure is slightly different, so in Z calibration each nozzle touches the bed in turn, like homing, and the difference between the two Z positions becomes the offset. The bed height is then compensated by that value during printing.
On firmware you configure yourself, Marlin’s M218 [T<index>] [X<offset>] [Y<offset>] [Z<offset>] sets a hotend’s position relative to hotend 0. The Z value only works with DUAL_X_CARRIAGE or SWITCHING_NOZZLE. M503 shows the current offsets, and M500 saves them when EEPROM_SETTINGS is enabled. In Klipper, SET_GCODE_OFFSET [X=|X_ADJUST=] [Y=|Y_ADJUST=] [Z=|Z_ADJUST=] [MOVE=1] applies a positional offset to future G-code, and ACTIVATE_EXTRUDER EXTRUDER=extruder1 changes the active hotend; a tool-change macro that calls both is the usual way to apply per-tool offsets, but the exact macro depends on your printer.
If your printer has no automatic Z routine, a manual approach is to touch each nozzle to the bed with a feeler gauge or paper and note the difference. This is a general method, not a published figure, so verify it with the test print below.
XY offset: automatic, manual and test prints
| Printer | How the XY offset is set | Notes from the maker |
|---|---|---|
| Bambu Lab H2D/H2C | Settings → Print Calibration → Nozzle Offset Calibration, using a sensor behind the bed | Documented positioning accuracy of about 15–20 µm; can run automatically before a print |
| Bambu Lab H2D/H2C (high precision) | Prints a test with two contrasting filaments and reads it with the toolhead camera | Theoretical XY offset is 7 mm; use one dark and one light filament |
| Prusa XL | Automatic tool offset calibration, then an optional manual comb test | Combs for each tool are compared with Tool 1; values are added under LCD Menu → Settings → Tool → Tool # |
| Marlin IDEX | M218 T1 X… Y…, then M500 | Marlin’s configuration notes say to set the slicer’s second-extruder X offset to 0 so the offset is not applied twice |
| Klipper | SET_GCODE_OFFSET in a tool-change macro | The command applies offsets to future G-code; MOVE=1 moves the toolhead to apply it immediately |
Reading the Prusa XL comb test
Prusa’s manual calibration is the clearest published procedure for a visual test, and the logic carries over to any multi-nozzle printer. Print the supplied G-code in PLA on a clean sheet (Prusa recommends cleaning with isopropyl alcohol at 90% or higher and avoiding dark colours). Each zone has one comb per tool except Tool 1. For each comb find the two marks that line up best with Tool 1’s comb; the largest mark represents 0 and the medium marks represent 0.5 mm. If you cannot choose between two marks, use their average: if 0 mm and +0.1 mm both look aligned, use +0.05 mm. Add the measured offset to the value already shown for that tool, separately for X and Y, then reprint the test to confirm. Prusa recommends this check after a nozzle crash or when using a custom nozzle.
A generic alignment test
If your printer has no ready-made model, print a thin cross or grid in which one nozzle prints the horizontal lines and the other the vertical ones, using contrasting colours. Measure where the lines meet, change the offset in small steps, and reprint until the lines intersect cleanly. This is a method, not a manufacturer procedure, and it works only if both nozzles are clean and both filaments are dry.
Ooze, standby temperature and purge
An idle nozzle that stays at printing temperature oozes. Prusa’s knowledge base says to keep ooze prevention enabled in PrusaSlicer (Print Settings → Multiple Extruders) because disabling it keeps all extruders at print temperature, which it links to heavy oozing, melt-zone degradation and possible clogging. Temperature variation lowers inactive extruders by an offset, but a filament’s own idle temperature setting takes priority over it. Parked nozzles on the XL also cool down, which helps prevent loaded filament from degrading during long idle periods.
After a tool change the nozzle must be primed. In PrusaSlicer the minimal purge value (Filament settings → Advanced) sets how much material is pushed into the wipe tower; for the Prusa XL the defaults are 15 mm³ for PLA and 35 mm³ for other materials, with 35 mm³ recommended on each extruder for PLA-plus-other combinations. For TPU, which absorbs moisture, Prusa suggests raising it up to 70 mm³ if stringing or oozing occurs. A stabilization cone (apex angle 0–90°) widens the base of a tall, thin wipe tower. On single-nozzle machines the purge is mandatory; on dual-nozzle printers like the H2D, Bambu Lab notes that printing different filaments with different nozzles means switching nozzles rather than flushing the old filament, which cuts the number of flushes. See the purge waste guide for the single-nozzle side.
Diagnosing a bad dual-nozzle print
| Symptom | Likely cause | Fix |
|---|---|---|
| Second colour shifted sideways or gap between colours | XY offset wrong | Rerun the offset routine or comb test; check nothing is applied in both slicer and firmware |
| Second nozzle scrapes the print or bed | Z offset wrong (nozzle too low), or a blob on the idle nozzle | Recalibrate Z; clean the nozzles; check ooze settings |
| Second material does not stick or prints in the air on the first layer | Z offset wrong (nozzle too high) | Recalibrate Z with both nozzles touching the bed |
| Blobs or thin first lines after each tool change | Ooze while parked, or too little purge | Enable ooze prevention; raise minimal purge; dry the filament |
| Strings between parts | Idle nozzle too hot or wet filament | Lower idle temperature; dry filament; see string and blob fixes |
| Colour bleeding at colour edges | Not enough purge or flush | Increase the purge or wipe tower volume; see the purge waste guide linked above |
| Weak bond between two materials, or the bed temperature suits only one | Material pairing or bed temperature chosen from the first filament | Check pairing; in PrusaSlicer the heatbed temperature comes from the first material by default, and ‘Bed temperature by extruder’ lets you choose the source; see multi-material pairings |
| Calibration fails | Dirty or non-magnetic nozzle (Bambu sensor), too little contrast between filaments, or a bent nozzle | Clean and reseat the nozzle; use the maker’s nozzles; use a dark and a light filament |
Common mistakes
- Calibrating with dirty nozzles. Prusa’s troubleshooting for tool offset errors starts with cleaning the nozzle with a brass brush, and its manual calibration asks you to remove plastic residue from rails and belts because it can change the homing position.
- Applying the offset twice. Setting the same offset in the slicer and in firmware doubles the error. Marlin’s IDEX notes specifically say to keep the slicer’s second-extruder X offset at 0.
- Using third-party nozzles that the sensor cannot see. Bambu Lab lists non-magnetic nozzles, such as silicon carbide, as a cause of offset calibration failure.
- Skipping recalibration after a nozzle swap. Prusa recommends rechecking after a nozzle crash or custom nozzle; the same logic applies to any hotend change.
- Wet filament. Prusa says to keep the filament dry to limit oozing and degradation in combinations of materials.
Next steps
If you use a single-nozzle filament switcher instead, see the MMU, ERCF and AMS setup. For a comparison of all the technologies, read the multi-color printing overview.
Frequently asked questions
What is the difference between XY and Z offset on a dual extruder?
The XY offset is how far the second nozzle sits from the first in the horizontal plane, and the Z offset is the difference in height between the two nozzle tips. XY errors show as misaligned colours; Z errors show as one nozzle scraping the print or printing in the air.
How often should I recalibrate nozzle offsets?
After any nozzle or hotend change, after a crash, and whenever colours stop lining up. Some printers re-measure automatically before a print; Bambu Lab’s H2D offers an automatic quick calibration that can run before printing, and its high-precision method prints a test with two filaments.
Can I set the offset in the slicer instead of the firmware?
It can work, but pick one place. Marlin’s IDEX configuration notes say to keep the slicer’s second-extruder X offset at 0 when the firmware holds the offset. Applying the same correction in both places double-counts it.
Why does my idle nozzle ooze?
An idle nozzle at print temperature builds pressure in the melt zone and leaks. Enable ooze prevention, lower the idle temperature, dry the filament and raise the minimal purge so the next tool change primes cleanly.
Sources
- Bambu Lab Wiki: Nozzle offset calibration for the H2D
- Bambu Lab Wiki: Filament grouping for dual-nozzle printers
- Prusa Knowledge Base: Multi-tool manual calibration (XL)
- Prusa Knowledge Base: Combining materials (XL/XL+)
- Marlin documentation: M218 Set hotend offset
- Marlin documentation: Configuring Marlin (Dual X carriage)
- Klipper documentation: G-Codes



