Skip to content
100% in your browser. Nothing you paste is uploaded — all processing runs locally. Read more →

Why your printed QR code didn't scan — eight failure modes I keep seeing

6 min read #qr #print #design

I’ve now reviewed the same QR-code-doesn’t-scan problem at three different companies in the last year. Same eight root causes show up. The QR generator produces a perfect QR code — and then physical reality breaks it. Here’s the catalog.

1. Quiet zone got cropped

The QR spec requires a 4-module-wide white border around the code (the “quiet zone”). Decorators / Canva users routinely crop into it because “it looks cleaner.”

It does. It also makes the QR unscannable on most cameras — they need that border to find the finder pattern’s edges.

Fix: keep the quiet zone, even if it’s just plain white. The generator on this site includes a 4-module margin in every download; don’t crop it out in your design tool.

2. Module size too small for scanning distance

Rule of thumb: each module needs to be at least 1 mm at the scanning distance, more on cheaper cameras.

A v3 QR (29 modules across) printed at 2 cm × 2 cm has ~0.7 mm modules. That’s borderline at arm’s length, useless from across a restaurant.

Fix:

3. Low contrast between dark and light

The QR spec defines “dark” and “light” modules. Scanners pick a threshold from histograms; if your dark and light are too close, threshold detection fails.

A common offender: pastel-coloured QR codes for branding. “We made it match our brand orange #ff7849 on cream #fef3e7.” The contrast ratio is 1.4:1; below the WCAG AA threshold for ordinary text and well below what QR scanners need.

Fix: keep contrast ratio ≥ 4:1. Black or dark navy on pure white is the safe choice; check with a contrast tool (the colour-contrast tool handles this).

4. Inverted (light-on-dark)

Some scanners reject QR codes where the modules are lighter than the background. The spec doesn’t strictly require this orientation, but iOS’s built-in scanner historically struggled with inverted codes.

Fix: dark modules on light background. Always. Inversion is a visual choice; reliability isn’t optional.

5. Logo overlay covers a finder pattern

H-level error correction recovers ~30% damage. People put a logo in the centre. Most of the time it works — until the logo creeps into where one of the three finder patterns is. Then the scanner can’t locate the code at all.

Fix: centre your logo only in the central 25% of the code. Stay clear of the corners. The three finder patterns occupy the top-left, top-right, and bottom-left corners (each ~7×7 modules), so their position is predictable.

6. Glossy print + ambient light = phantom dark spots

Glossy paper or laminated finishes reflect overhead lights as bright specks across the QR. Phone cameras pick up these reflections and interpret them as light modules where the print is dark — the QR becomes unreadable from the angle the user is holding the phone.

Fix: matte print for QR codes. Outdoor signage especially.

7. The QR is a JPEG of itself

A surprisingly common chain:

  1. Generate QR as PNG.
  2. Drop into a Word doc.
  3. Word converts to JPEG.
  4. JPEG compression introduces blur + color artifacts at module edges.
  5. Scanner can’t tell which side of the threshold each module is on.

The smaller the QR, the worse JPEG compression hurts.

Fix: SVG download wherever the design tool accepts it. PNG with no JPEG conversion otherwise. The generator downloads as both — pick the format your downstream tool will preserve.

8. The data is too long

Long URLs make dense QRs (high version, many modules). At small print sizes, each module is too tiny for the camera. The QR is technically valid; the camera just can’t resolve the modules.

A 200-character URL needs version 11+ at L ECC, which means 61×61 modules. At 5 cm square, each module is 0.8 mm. Scanners want at least 1 mm.

Fix:

Quick test before printing

Before sending a QR to a printer:

  1. Print a test page on your office printer at the actual final size.
  2. Try scanning with three different phones — including at least one older Android. iOS Camera is forgiving; older Android is the limiting case.
  3. Hold at the actual scanning distance you expect, with realistic ambient light.
  4. If any phone fails: the QR isn’t ready.

This catches all 8 of the failure modes above with about 5 minutes of investment.

A maddening one I forgot

A bonus ninth: font ligature in the QR data when generating from a text editor that auto-formats. Smart quotes (""), em-dashes (-), etc. The QR gets generated with the auto-formatted text; the URL inside it is then broken. Always paste from plain text.

TL;DR

Try it on the generator. The output is correct. The print job is where it usually goes wrong.