A QR code that will not scan is almost never mysterious. It is nearly always one of seven things, and they are worth checking in this order because the list runs from most to least common.
1. Contrast is too low
Scanners convert the image to greyscale and look for the edge between dark and light. Bright colours sit in the middle of the brightness range and vanish.
Amber measures 2.1:1 against white and green 2.3:1 — both below the 3:1 floor where modules stop being reliably distinguishable. A light grey code on a cream background is the same problem in a subtler form.
Fix: use a dark colour on a light background, aiming for 7:1 or better on print. Full figures in the colour guide.
2. The code is inverted
Light modules on a dark background reads perfectly well to a person and breaks a large share of scanners, which assume dark-on-light.
Fix: never invert. On a dark design, put a normal code inside a light panel.
3. The white margin was cropped
The blank border — the quiet zone — is what tells a scanner where the pattern ends. It is the first thing designers delete to make a code fit a layout, and deleting it is the single most common physical cause of failure.
Fix: restore a margin of at least four modules, or roughly one sixth of the code width. See the quiet zone guide.
4. It is printed too small
Below about 2 cm most phone cameras struggle, and a dense code needs more than that. The working rule is that a code should be about a tenth as wide as the distance it is scanned from.
Fix: enlarge it, or shorten what it encodes so the pattern gets sparser. The print size guide has sizes by job.
5. Glare, or the wrong surface
Glossy lamination under a downlight becomes a mirror and the camera sees a white rectangle. Curved surfaces — bottles, cups, tubes — distort the grid. Textured or absorbent paper blurs the module edges.
Fix: matte finishes everywhere, flat placement, and angle signs away from ceiling lights. Test in the evening as well as daylight, because the lighting that breaks it is usually not the lighting you tested in.
6. The logo is too big
A logo eats into the error correction budget. At level H you can safely cover about 25% of the width, at M about 17%, at L about 12%. Past that, the code reads intermittently — which people mistake for a bad scanner.
Fix: shrink the logo one step and leave error correction on Automatic so it uses H. Details in the logo guide. If it works sometimes and not others, this is very often why.
7. The code is fine — the destination is not
Sometimes the scan works perfectly and the phone still shows an error. That is not a QR problem:
- The link is broken, or was mistyped before the code was made
- The page needs a login, so the scan lands on a sign-in wall
- The Wi-Fi SSID has a wrong character, so the phone finds no network
- The Wi-Fi password was changed after the code was printed
- The link is http on a site that now forces https
Fix: open the destination in a browser yourself before blaming the code.
Still stuck?
Two tests separate a code problem from an environment problem:
- Scan the original file on screen. If that works, the code is fine and the problem is printing, size, surface or light.
- Try a different phone. Older budget Android handsets are much fussier than a recent iPhone. If it works on one and not the other, you are near the edge of readability — make the code bigger or sparser rather than hoping.
Then run through the pre-print checklist before you reprint anything in volume.
If none of it helps, the fastest route is usually to generate a fresh code at defaults, with no logo and no colour changes, and confirm that one scans. It tells you immediately whether the problem is the code or everything you did to it.
