Why your QR code will not scan
A QR code that works perfectly on your monitor and fails on the printed page is the most common problem in this whole business. The code is almost never the issue — the encoding either worked or it did not, and if it scans once it will scan forever. What changes is everything around it: how big it ended up, what it was printed on, and how far away the phone is.
Here are the causes in roughly the order they actually occur, with the fix for each.
1. It is too small for the distance
This causes more failures than everything else combined. The working rule is 10:1: a code scans reliably from about ten times its own width. A code 2 cm across wants the phone within about 20 cm. Put that same code on a wall poster people read from two metres away and it will never scan, no matter how many times you regenerate it.
Work backwards from the real reading distance rather than forwards from what fits the layout:
| Scanned from | Minimum code width |
|---|---|
| Held in the hand (20 cm) | 2 cm |
| Across a table (50 cm) | 5 cm |
| Standing at a sign (1.5 m) | 15 cm |
| Shop window (3 m) | 30 cm |
Sizing for print covers how to get from these numbers to the right pixel dimensions.
2. The quiet zone got cropped
A QR code needs blank margin around it so the scanner can find its edges. Crop tight to the pattern and recognition falls apart, which is why codes often stop working after someone drops them into a design and trims the whitespace.
Worth knowing precisely: the codes this tool produces carry a two-module quiet zone. The QR specification recommends four. Two is enough on plain white paper and keeps the image compact, but if you are placing a code on a coloured background, a photograph, or anything busy, add white space yourself in your layout rather than relying on what is baked into the file. A white box around the code with margin equal to roughly four of its little squares is the safe version.
Never let anything overlap the code — not a border, not a caption, not a page edge.
3. Contrast is wrong, or inverted
Codes generated here are pure black on pure white, which is the maximum contrast available and never the problem at the point of generation. It becomes a problem afterwards, in two ways.
Recolouring. Designers lighten the dark modules to match a brand palette. Mid-greys on white read as ambiguous to a camera in poor light. If you must recolour, keep the dark modules genuinely dark.
Inverting. Light code on a dark background looks smart and breaks a significant share of scanners. Some handle inversion, many do not. There is no upside worth that.
4. The surface is fighting you
Print introduces failures that never appear on screen:
- Glossy stock and lamination throw glare straight back at the camera. Matte finishes scan far more reliably, especially under overhead lighting.
- Ink bleed on absorbent material — uncoated stock, fabric, cardboard — thickens the dark modules until they merge. Print larger than you think you need on anything absorbent.
- Curved surfaces distort the pattern. On bottles and tubes, keep the code narrow relative to the curve so it stays close to flat.
- Low-resolution printing. A 300 px image stretched across a poster is a blurry code. Use SVG output for anything large.
5. The URL is too long
Every extra character adds modules, and more modules at a fixed physical size means smaller squares for the camera to resolve. A long tracking URL with campaign parameters can easily double the module count against a short one.
This is the highest-leverage fix available and the one people reach for last. Shortening the destination does more for scannability than any setting in any generator. Redirecting through a short path on a domain you control has a second benefit: you can change where it points later, which a printed code otherwise cannot do — see static versus dynamic codes.
6. It is damaged, covered, or worn
Codes in the physical world get scuffed, folded and rained on. That is what error correction is for, and if codes are failing after weeks in service rather than on day one, the level was set too low.
Level Q tolerates about 25% damage and is the right default for anything handled. Level H tolerates about 30% and is what you need if a logo covers the centre. The error correction guide explains why H is not simply "better" — at a fixed size the denser pattern can scan worse.
7. Nothing is wrong with the code
Before regenerating anything, rule these out:
- The URL is broken. The code scans fine and the page 404s. Open the link in a browser first — a QR code cannot fix a typo in a spreadsheet.
-
Missing protocol. A value of
example.com/pageencodes as plain text, and many scanners will not offer to open it. Always includehttps://. The CSV formatting guide covers this. - The wrong column got encoded. If every code in a batch resolves to something odd, check which column was selected.
- A dirty camera lens. It happens more than you would think.
How to test properly
Screen testing proves the encoding is valid and nothing else. The only test that means anything is the real one:
- Print one code at final size on the final material
- Scan it at the real distance, under the real lighting
- Try an old phone, not just your own
- If it will live outdoors, check it in daylight and at dusk
Do this before the print run, not after. It is the difference between reprinting one sheet and reprinting four hundred labels.
If a code fails, change one thing at a time and rescan. Make it bigger first — size fixes more failures than every other adjustment put together.