Print a two-color QR code in Cura with Pause at Height
You do not need a multi-material printer to make a scannable, two-color 3D QR. With UltiMaker Cura and the built-in Pause at Height post-processing script, any single-extruder FDM printer can swap filaments at the exact layer where the raised code begins.
What you need
- Any FDM 3D printer that Cura supports — Ender 3 series, Ender 3 V3 SE / KE, Anycubic Kobra, Elegoo Neptune, Creality K1 / K2, Sovol, FLSUN, Voxelab, or custom Marlin/Klipper machines.
- UltiMaker Cura updated to the latest version.
- Two spools of filament in contrasting colors — matte PLA is the safest choice for scanning.
- Some way to feed a manual filament swap when the printer pauses (spool holder access, filament runout gate opened, LCD/USB confirmation).
- A link, Wi-Fi credentials or plain text to encode.
Which download to use — 3MF or STL?
Cura reads both formats but handles them differently:
- 3MF — Cura loads it, but the two-color metadata is only respected on multi-extruder printers. On a single-extruder machine you still get one solid object, and you swap the filament with Pause at Height. Choose this if you plan to eventually upgrade to a dual-extruder or IDEX printer.
- STL (two files) — cleaner for single-extruder Cura workflows. You load
base.stl, addcode.stlas a second object aligned on top (X and Y coordinates match by design), and treat both as one print. Pause at Height at the code's start layer swaps the color.
Both routes end at the same physical result. The STL route is slightly less error-prone because there is no ambiguity about how Cura maps color assignments.
Step 1 — Design your QR code
Open qr3dmaker.com and paste your link. Pick two contrasting colors (light base, dark code is safest). Choose an object shape — desk stand, keychain or wall plaque.
Step 2 — Download
Click Download 3D file for the 3MF, or the secondary STL link for the two-file version. For Cura single-extruder, the STL fallback is recommended.
Step 3 — Open in Cura and find the color-change height
Drop the file(s) into Cura. Use the Layer View or the slider on the right to find the exact Z height where the raised code layer begins. For the default object it is around 2.0 mm, but confirm it — an error of one layer causes the color swap to happen in the wrong place. Write this Z value down (or the layer number).
Step 4 — Add the Pause at Height script
In Cura's menu: Extensions → Post Processing → Modify G-Code. Click Add a script and choose Pause at Height. Configure:
- Pause at: Height (not layer number — height is more robust across printers)
- Pause height: the Z value from step 3
- Park print head X / Y: coordinates to move the head out of the way. For most printers, X = 0, Y = 0 or the front-left corner works.
- Retraction: 5 mm — pulls the old filament back so it does not ooze
- Extrude amount: 5 mm — primes the new color before the print resumes
- Standby temperature: 175 °C for PLA — keeps the hotend warm without oozing
- Redo layer: enabled — reprints the pause layer to avoid a visible seam
Click Close.
Step 5 — Slice, save, print
Slice as usual. Cura injects an M0 or M600 at the exact height you configured, plus the park + retract + heat instructions. Save the G-code, start the print, and when the printer pauses at the color-change layer: press the filament runout gate, pull out the old spool, feed the new color until it extrudes cleanly, and press Resume on the printer.
Step 6 — Verify it scans
Once the print is done, scan with two or three phones from 20–30 cm before installing it in its final spot.
Troubleshooting
The pause happens at the wrong layer
You probably set a layer number instead of a height, or you re-sliced with a different layer height and the layer count changed. Always set Pause at Height in Height mode with the Z value in mm. Recheck after any layer-height change.
The new color has a streak of the old filament
Priming was too short. Increase Extrude amount to 10–15 mm and print a small purge blob at the parking spot before the head returns to the print. On PLA-to-PLA swaps, 10 mm is usually enough. On PLA-to-PETG or dark-to-light, go higher.
Klipper printers ignore Pause at Height
Klipper macros for pause vary by config. If your printer runs Klipper (Sonic Pad, K1, Voron, etc.), replace M0 in the generated G-code with your PAUSE macro, or install the Cura Klipper post-processing plugin from Marketplace.
The first layer of the code does not stick to the base
After the pause, the freshly loaded filament may need a moment at nozzle temperature to bond cleanly. Enable Redo layer in Pause at Height and slow the first post-pause layer to 20 mm/s (Cura → Speed → Initial layer speed).
My printer has a filament runout sensor — can I skip Pause at Height?
Some people do it that way: print until the exact height, cut the filament mid-print, let the runout trigger, load the new color. This works but is fragile (timing depends on how deep the retract is at that moment). Pause at Height is more predictable.
Related
Cura QR code — FAQ
Do I need a dual-extruder printer for a two-color QR?
No. Any single-extruder printer supported by Cura can print this with the Pause at Height post-processing script — the printer pauses at the color-change layer and you swap the spool manually.
Which Cura version supports Pause at Height?
Every recent version of UltiMaker Cura (4.x, 5.x) includes it. It is a built-in post-processing script — no plugin install required.
Does this work with Klipper printers?
Yes, with a caveat: Klipper uses its own PAUSE macro. Either edit the generated G-code to replace M0 with PAUSE, or use a community post-processing plugin.
Which download should I use — 3MF or STL?
For single-extruder Cura, the STL fallback (two files) is cleaner. The 3MF works but its color metadata is only respected on multi-extruder printers.
Do I need to babysit the print?
Only for the color-change moment (a few seconds to swap the spool). Before and after that, the print runs unattended.