QR code not scanning? Work through these nine causes
Almost every unscannable QR code fails for one of nine reasons. They are listed here roughly in order of how often they turn out to be the culprit.
Adjustable error correction, density control and a live preview to test before you print.
1. The code is too small
The most common cause by a wide margin. A QR code needs to be roughly one tenth of the distance it is scanned from — 2 to 3cm on a menu, 30cm on a poster, 2m on a billboard. Below about 1.5cm, most phone cameras struggle whatever the distance.
Fix: enlarge the code, or move it somewhere people can get closer to it. Full sizing table in the print guide.
2. There is not enough contrast
Scanners need a clear light/dark boundary. Pale grey on white, dark blue on black, or any code sitting on a busy photograph will all fail intermittently — which is worse than failing outright, because it passes your test and fails for customers.
Fix: aim for at least 4:1 contrast. Never invert the code so it is lighter than its background; a significant share of scanners cannot read an inverted code at all.
3. The quiet zone was cropped
QR codes need an empty margin of about four modules on all sides. Designers working to tight layouts crop it away routinely, and the code then scans on screen but fails in print where the surrounding artwork sits right against it.
Fix: restore the margin. If space is genuinely unavailable, shrink the code rather than the quiet zone.
4. The code is dynamic and has been switched off
If a printed code worked and then stopped, and the print itself is fine, this is almost certainly why. Dynamic codes resolve through the generator's server. Many platforms deactivate them when a free trial lapses or a subscription is cancelled — so business cards, flyers and packaging already in circulation stop working.
Fix: check whether the account behind the code is still active. Longer term, either use static codes where the destination will never change, or use a provider that will not hold a printed code hostage. This failure mode is the single largest source of complaints across the QR category, and it is entirely commercial rather than technical.
5. Too much data is packed in
The more data a code carries, the more modules it needs. At a fixed physical size that means smaller modules and a higher resolution demand on the camera. Long URLs with tracking parameters are the usual offender.
Fix: shorten the destination URL, or use a dynamic code, which encodes a short redirect regardless of how long the real destination is.
6. The surface causes glare or distortion
Gloss lamination, shrink wrap, curved bottles and screen displays all interfere. Glare washes out the pattern under overhead lighting; curvature distorts it geometrically.
Fix: matte finish wherever possible, larger code on curves, and keep the code inside the flattest section of a curved surface.
7. Error correction is too low for the environment
QR codes carry redundancy at four levels: L recovers from about 7% damage, M about 15%, Q about 25% and H about 30%. A code on an asset tag, a shop floor or anything outdoors will accumulate scuffs and dirt.
Fix: generate at level H for anything that will take physical abuse or carry a centre logo. Note that a logo covering the middle of the code consumes part of that redundancy budget.
8. Print quality lost the fine detail
A low-resolution PNG scaled up for print produces soft module edges. Absorbent stock such as newsprint or uncoated card causes ink to spread and close the gaps between modules.
Fix: print from a vector file (SVG or PDF) wherever possible, and go a size larger on absorbent materials. See file formats.
9. It is the camera, not the code
Older phones, cracked lenses, dirty lenses and some in-app browsers scan noticeably worse than a current phone's native camera. Some regions also have a meaningful share of devices that need a dedicated scanner app.
Fix: test on the oldest device you can find, not the newest. If a code works on a new iPhone and fails on a four-year-old Android, the code is marginal and needs to be bigger or higher contrast.
A five-minute diagnostic
- Scan the digital file on screen. Fails? The problem is the code itself — density, contrast or quiet zone.
- Scans on screen but not in print? The problem is size, resolution or the printing surface.
- Scans on your phone but not others? Marginal size or contrast — increase both.
- Worked before, fails now, print undamaged? The dynamic code has been deactivated.
- Scans but lands on an error? The code is fine; the destination is broken.
Frequently Asked Questions
Why has my QR code suddenly stopped working?
If it worked before and does not now, and the printed code is undamaged, the cause is almost always the code being dynamic and the account behind it having lapsed. Many QR platforms deactivate dynamic codes when a trial ends or a subscription is cancelled, which breaks everything already printed. Static codes cannot stop working this way.
My QR code works on my phone but not on my customer's. Why?
Usually size, lighting or camera quality rather than the code itself. Older phone cameras need a larger code and better contrast. Test on the oldest device you can find rather than the newest.
Does a QR code have an expiry date?
A static QR code has no expiry and cannot be given one — the data is in the pattern. A dynamic code resolves through a server, so it lasts as long as the provider keeps it live, which is a commercial question rather than a technical one.
Can a QR code be too small to scan?
Yes, and it is the most common cause of failure. The code needs to be at least one tenth of the distance people scan it from. Below about 1.5cm most phone cameras struggle regardless of distance.
Can too much data break a QR code?
Effectively yes. More data means more and smaller modules at the same physical size, which raises the resolution the camera needs. If you are encoding a very long URL, shorten it first — that alone fixes a lot of marginal codes.
Does a damaged QR code still work?
Often. Error correction can recover from roughly 7% damage at level L up to about 30% at level H. If your code will live somewhere it gets scuffed, printed at level H from the start is worth the slightly denser pattern.
Make a code you won't have to troubleshoot
Set error correction, control density, preview at real size, and repoint the destination later without reprinting.
Adjustable error correction, density control and a live preview to test before you print.