Why QR Codes Fail to Scan (And How to Avoid It)
Almost every unscannable code fails for one of five reasons, and all five are decided before it goes to print.
It was printed too small
The usual rule of thumb is that a code should be at least a tenth of the intended scanning distance. Arm's length is roughly 2 cm; a code read from across a room needs to be dramatically larger, and one on a billboard larger still.
A denser pattern needs more physical space per module, so a long URL and a small print area are a bad combination. This is one of the practical arguments for dynamic codes: a short link encodes in fewer modules and therefore survives smaller printing.
The contrast was inverted or too weak
Scanners expect dark modules on a light background. Inverting that — light code on a dark panel — defeats many phone cameras outright, and the ones that manage it take noticeably longer.
Weak contrast fails the same way more gradually: a mid-grey on a light grey may scan under good light and fail under bad. If your brand colour is very light, put it on the frame or the surrounding design rather than the modules themselves.
The quiet zone was cropped
The light margin around a code is part of the code. It is how a scanner works out where the pattern begins. Designers crop it constantly, because it looks like empty space that could be tightened up.
Keep a clear margin on all four sides and never place text, a border or another graphic inside it. QrZeo's exports include the quiet zone; the risk is it being trimmed later in a layout tool.
The surface fights the scanner
Gloss and lamination produce reflections that wash out part of the pattern under direct light. Curved surfaces — bottles, tubes, cans — distort the geometry the decoder relies on. Fabric and textured stock blur module edges.
None of these are fatal, but all of them argue for a higher error-correction level and a larger print size than a flat matte page would need.
The code scanned fine and the destination was broken
This is the failure people misdiagnose most often. The code worked perfectly; the page behind it moved, expired, or was never mobile-friendly in the first place.
It is also the only failure on this list you can fix after printing, and only if the code is dynamic. Test the destination on an actual phone, over mobile data rather than office Wi-Fi, before the print run — and keep it dynamic so a broken link is an edit rather than a reprint.
