1. The code is too small for its data
Every QR code is a grid of modules (the small squares). More encoded data means more modules, and more modules at the same physical size means each module is smaller. Below roughly 0.4mm per module, phone cameras fail.
A 140-character URL might need a 37×37 grid. The same code encoding a 20-character short link needs 21×21 — nearly half the density at the same print size.
Fix: shorten the URL before generating the code, or print it larger. Shortening is free and it’s the single most effective fix for scan reliability.
2. No quiet zone
QR codes need a clear margin — 4 modules wide on all sides — with nothing in it. Designers routinely crop this to save space, or run a border right up to the pattern. Scanners then can’t find the code’s edges.
Fix: restore the 4-module margin. It must be blank; a background colour is fine, artwork is not.
3. Not enough contrast
Dark-on-light is required. Light-on-dark (inverted) codes fail on many scanners. So do low-contrast pairings — grey on white, navy on black, or a gradient running through the pattern.
Fix: keep at least a 4:1 contrast ratio, dark pattern on light background. Coloured codes work if the contrast holds.
4. Damage, curvature, or reflection
Scuffing, folds, moisture, gloss varnish reflecting light back at the camera, or heavy curvature on a bottle or can. Error correction tolerates some loss — level H handles about 30% — but not the loss of a corner marker.
Fix: use error-correction level Q or H for anything printed, and keep codes off high-curvature and high-gloss surfaces. Details in QR codes on packaging.
5. A logo covering too much
A logo in the centre is fine within limits. Push past roughly 30% coverage, or place it over a corner marker, and the code stops decoding.
Fix: keep the logo central, under 30% of the area, and use level H error correction to buy headroom.
6. The destination page is gone
The code works exactly as designed and delivers the user to a 404. If the code encodes the final URL directly, you can’t fix this without reprinting.
Fix now: if you control the server, add a redirect at the old URL. Fix for next time: encode a short link so the destination stays editable. See dynamic QR codes.
7. The QR platform switched it off
Many QR generators route codes through their own domain and stop honouring the redirect when a subscription lapses or a free trial ends. The pattern is intact; the company disabled the hop.
Fix: check whether codes expire on your platform, and use a provider that doesn’t gate redirects.
8. The service shut down
goo.gl and Firebase Dynamic Links both stopped serving in August 2025, breaking every code built on them simultaneously. If your code encodes a third-party short domain, it depends on that company continuing to exist.
Fix: use your own domain for anything printed, on a shortener you control.
9. The link was anonymous and got cleaned up
Most services delete unclaimed anonymous links to control abuse — ours after 30 days. Claim links with a free account before printing.
- Scan with a second phone, ideally a different OS. Rules out a device or camera-setting problem.
- Decode the code to see the encoded URL.
- Open that URL in a browser. If it fails there, the problem is the destination, not the code.
- Check the quiet zone — 4 clear modules on every side.
- Measure a module. Below ~0.4mm, print larger or shorten the URL.
- Check contrast — dark on light, 4:1 or better.
- Test the printed piece under real lighting, not just on screen.
- Shorten the URL first. Fewer modules, sparser pattern, more reliable scan.
- Encode a short link, not the destination, so you can fix mistakes after printing — and see every scan.
- Error correction Q or H for print.
- Test on at least three phone models before a press run.
- Own the domain for long-lived print.
Generate a code free — every design is machine-verified as scannable before download.