Almost every QR code that “does not work” is a valid, correctly generated code that has been made unreadable by how it was printed or placed. Genuinely corrupt codes are rare. Here are the causes in the order they actually turn up.
1. It is too small for the distance
The most common cause, and the easiest to get wrong on a screen where everything looks fine. The working rule is 10:1: divide the scanning distance by ten and that is the minimum width.
- Business card, held at 20cm → about 2cm
- Table card or flyer, 30–40cm → about 3–4cm
- Poster, 1.5–2m → about 15–20cm
- Shop window read from the pavement, 3m → about 30cm
Full table in best QR code size for printing.
2. The quiet zone has been crowded
A QR code needs a clear margin around it — about four modules wide — for the reader to find its edges. Designers routinely crop it away, or run a border, or place text hard against the pattern. The code is intact and the reader cannot see where it ends.
If a code fails and you cannot see why, add white space around it and try again. This fixes a surprising number of cases on its own.
3. Not enough contrast
Readers need a clear dark/light distinction. Pale grey on white, navy on black, or two mid-tone brand colours will all fail, sometimes on only some phones — which is worse, because it passes your test and fails for a third of customers.
Dark pattern, light background, and check it in greyscale. If it disappears in greyscale, it will not scan reliably.
4. The colours are inverted
A light code on a dark background is a specific case worth separating out. Some readers handle it and many do not, because the specification assumes dark-on-light. It is a design choice that quietly halves your scan rate.
5. The logo is too large
A centred logo works by consuming error-correction capacity. Push past roughly 30% of the code area — and less if the code was generated at a low correction level — and there is nothing left to reconstruct from. Combine a large logo with a code that is also printed small and scuffed, and it fails.
Keep the logo under about a fifth of the area, generate at a high correction level if you are using one, and never let it touch the three corner squares.
6. Glare, curvature or texture
A laminated menu under a spotlight, a code wrapped round a bottle, or one printed on heavy woven stock all defeat readers for physical reasons rather than digital ones. Matte finishes scan better than gloss. Flat surfaces scan better than curved. If the code must go on a curve, make it larger than the rule suggests.
7. It was resized badly
Scaling a small PNG up produces soft, blurred module edges, and the reader cannot tell where one module stops. This is the single best argument for downloading SVG for anything printed: it is vector and scales without loss. If you only have a PNG, export it again at the size you need rather than stretching what you have.
8. The destination is dead
If the phone reads the code and shows a link, the code is working perfectly — the failure is at the other end. A moved page, an expired domain, a link that needs a login, or a destination that is fine on desktop and broken on mobile. Test the destination on a phone, on mobile data rather than office Wi-Fi.
This is also the failure a static code cannot recover from: the URL is baked into the pattern, so fixing it means reprinting. A dynamic code is repointed in seconds and every printed copy follows.
9. The account behind a dynamic code lapsed
A dynamic code depends on the service resolving its redirect. If the account was on a free trial that ended, or the provider retired the short domain, the pattern is still perfect and leads nowhere. Worth knowing before choosing a provider, and covered in do QR codes expire?
How to test properly
Most failures survive testing because the test was too kind. A useful one:
- Print it at final size, on the actual material, and scan that — not the screen.
- Use at least one iPhone and one Android, from the native camera, not a scanner app.
- Scan from the real distance, at an angle, in the lighting the code will actually live in.
- Use mobile data, not the office network, so you catch destinations that only resolve internally.
- Test a copy that is slightly scuffed. Real ones will be.
If it passes that, it will survive the wall.