A QR code that scans perfectly on your monitor can fail completely on paper. Print adds variables a screen never has — viewing distance, ink spread, surface glare, bad lighting — and most failures trace back to three things: size, contrast, and the quiet zone. Here are the working numbers for each, plus the test routine that should precede every print run.
Size: start from scan distance, not the layout
The most common mistake is picking a QR code print size based on what fits the design. The right starting point is where people will physically stand when they scan. The rule of thumb:
Minimum code width ≈ scan distance ÷ 10.
Someone scanning from one meter away needs a code roughly 10 cm wide. The ratio is deliberately generous — phone cameras, lighting, and eyesight vary — so when in doubt, go bigger. In practice:
| Placement | Typical scan distance | Minimum code width |
|---|---|---|
| Business card, product label | 25–50 cm (10–20 in) | 2.5–5 cm (1–2 in) |
| Flyer, table tent, packaging | 50 cm – 1 m | 5–10 cm (2–4 in) |
| Poster, window decal | 1–2 m | 10–20 cm (4–8 in) |
| Banner, storefront signage | 3 m and up | 30 cm (12 in) and up |
Whatever the placement, don't go below roughly 2 × 2 cm (0.8 in). Below that, even close-range scans get flaky on older cameras.
Data density eats your size budget
A QR code isn't a picture — it's a grid of modules, and more encoded characters mean more, smaller modules at the same print size. A long URL stuffed with UTM parameters can push a small code into fine-detail territory that cheap printing blurs into mush.
This is one of the quieter arguments for dynamic QR codes: a QRMapper code always encodes the same short link (a qrmap.cc address, always the same length), regardless of how long or messy the destination URL is. Fewer characters, fewer modules, chunkier and more forgiving print. And for anything going to a professional printer, export SVG rather than PNG (available on Pro and up) — vector output scales to any size without resampling artifacts.
Contrast: dark modules on a light background
Scanner apps expect dark modules on a light background. That single sentence resolves most QR code contrast questions:
- Never invert. Light modules on a dark background fail on many readers, even when it looks striking in the mockup.
- Black on white is the baseline. Brand colors are fine if the module color stays genuinely dark — navy, forest green, or deep burgundy on white or cream all work. Yellow, pastels, or light gray on white do not.
- Skip gradients across the code. If contrast varies from one corner to the other, some region will sit below the readable threshold.
- Keep the background uniformly lighter than the modules. Placing a code over a busy photo means some modules will land on dark areas.
- Watch the ink, not just the file. Metallic and foil inks reflect light unpredictably, and low-grade stock lets ink spread until adjacent modules merge.
A quick sanity check: convert the artwork to grayscale. If the modules don't read clearly darker than everything behind them, fix the design before it ships.
Protect the quiet zone
The QR code quiet zone is the empty margin around the pattern — the spec calls for at least four modules of clear space on every side. It's the first thing designers crop when space gets tight, and cropping it is how you get a code that scans in isolation but fails inside the finished layout, because the reader can't find the pattern's boundary.
A practical guide: keep the clear margin at least as wide as one of the three large corner squares. No text, borders, ornaments, or dark backgrounds inside it. If the code sits on a colored or photographic layout, place it in a plain white box — the box becomes the quiet zone.
Placement and surface
Where the code lives matters as much as how it's drawn:
- Flat beats curved. A code wrapped around a bottle or cup distorts its own grid. If a curved surface is unavoidable, keep the code small relative to the curve and put it on the flattest section.
- Matte beats gloss. Glossy lamination under an overhead light throws a glare patch that blanks out part of the pattern. Choose matte or satin finishes for anything laminated or coated.
- Avoid folds, seams, and edges. A crease through the middle of a code is a scan failure waiting for the first refold.
- Hang it at phone height. Roughly chest-to-eye level for posters. Codes near the floor or above head height force awkward angles that stretch the effective scan distance.
Restaurant table tents and menus deserve special care here — they're handled, wiped, and re-laminated constantly, which is exactly the scenario covered in our guide to QR code menus.
Test-scan before the print run — every single time
A failed scan discovered after a 5,000-copy run is an expensive lesson. The proof test takes ten minutes:
- Print one proof at final size on the actual stock, or the closest you can get.
- Scan with several phones — old and new, iOS and Android, stock camera apps.
- Test at the real distance and in the real lighting, not at your desk.
- Try off-angle scans, not just straight-on.
- If the piece will be laminated or coated, test the finished surface — glare only shows up after finishing.
Worth being precise about what a dynamic code does and doesn't save you from. If the destination is wrong, outdated, or needs to change next quarter, you can fix a printed QR code without reprinting — the pattern stays the same and only the redirect changes. But no dashboard can rescue a print that's physically unscannable. Size, contrast, and quiet zone are decisions you only get to make once per print run; everything behind the scan stays editable. That editable half is what QRMapper handles — short qrmap.cc links that keep codes low-density, SVG export for the printer (on Pro and up), destinations you can change after the ink dries — and the free plan is enough to start: five URL codes, no card required.
Get the physical layer right — sized for the scan distance, dark on light, quiet zone intact, proofed on the real surface — and the printed code becomes the most reliable part of the campaign. Everything else is just a redirect.
Print once. Point anywhere.
Create a dynamic QR code you can re-point anytime — free, no credit card.
Get started free