Why your QR code isn't scanning
A QR code that “just won’t scan” is rarely broken in the way people assume. The pattern is usually fine — what’s wrong is how it was printed, sized, or placed, and every one of those problems is fixable once you know which one you’re looking at. Below are the eight causes worth checking, roughly in order of how often each turns out to be the culprit, with the fix for each.
1. It’s too small for how far away people are standing
This is the most common failure, and it’s usually self-inflicted: a code sized to look neat on a card gets reused on a poster three metres away, and a camera can’t resolve modules that small at that distance. The fix is a fixed rule — minimum width equals viewing distance divided by ten. A poster read from three metres needs a code at least 30cm wide; a shelf label read from 20cm needs only 2cm. If you don’t already size by this rule, it’s the first thing to check — see our full breakdown of the 10:1 rule, with worked examples for every common print size.
2. The contrast between code and background is too low
A QR scanner isn’t reading colour, it’s reading light versus dark, and it needs a real difference between the two to lock on. Pastel-on-white, or a logo colour only a shade darker than the background, often looks readable to a person and is nearly invisible to a camera’s exposure. Our own validator rejects anything under a 3:1 contrast ratio between code and background — a reasonable floor even without a validator, and a genuinely dark foreground on a genuinely light background is the safest default.
3. The colours are inverted
A light code on a dark background can work, but it isn’t the safe default it looks like. Plenty of scanner apps, particularly older ones baked into non-camera apps, assume dark modules on light and don’t check the other way round. If you’ve gone light-on-dark deliberately, test it on more than one device before printing at scale — see our piece on the trade-off for what to test.
4. The quiet zone was cropped away
The blank border around a QR code isn’t wasted space — it’s how a scanner finds the edge of the pattern in the first place. The specification requires at least four modules of clear space on every side, and our own renderer uses exactly that. Crop that border to fit a tight layout, or print another design element inside it, and a camera decoding perfectly readable modules can still fail to find where the code starts. This is a common failure on business cards, where every millimetre feels precious — if a code fails only when placed inside other artwork, check the margin first.
5. The logo is bigger than the code can tolerate
A logo dropped into the centre of a QR code eats into the error-correction budget that would otherwise recover from print noise or a bit of glare. Go far enough and there’s nothing left to recover with. The ceiling depends on error correction level and is measured as a share of the code’s width, not its area — a costly confusion, since 25% of width is only around 6% of area. We cover the exact numbers, and why padding tightens them further, in the companion article on logo sizing.
6. The surface is damaged or too curved
A QR code printed onto a curved product label, a crumpled ticket, or a surface with a scratch across it is asking its error correction to do real work, and the lower levels don’t have much budget to spend. If a code has to survive handling, wrapping, or a rough surface, use a higher error-correction level — H tolerates noticeably more damage than L — and avoid wrapping a code so tightly around a cylinder that the modules on one edge distort into an ellipse.
7. Glare is hiding the pattern from the camera
Glossy lamination and glossy stickers create a bright reflected patch a phone’s autofocus struggles to see past, especially outdoors or under overhead lighting. This is a finish problem, not a code problem: matte stock, or angling the surface away from direct light when scanning, usually resolves it without touching the code itself.
8. The code decodes fine but the link is dead
Sometimes the scan works perfectly and the phone still shows nothing useful, because the destination has moved, expired, or was never live. This is easy to mistake for a scanning failure because the symptom — “nothing happened” — looks identical from the user’s side. It’s also the one failure a static code can never recover from: once printed, its destination is fixed for good. If a code’s target might ever change, decide that before printing — see our article on static versus dynamic codes.
Checking systematically
Most real failures come down to size, contrast, or the quiet zone, because those are easiest to get wrong without noticing on a screen where everything looks fine at a glance. Before reprinting anything, view the file at its actual print size rather than zoomed in on a monitor, and let QRCodeForge’s built-in validator decode the rendered code at multiple sizes and contrast levels before you commit it to print — it exists precisely to catch these eight causes before a customer does.
Make a free QR code with QRCodeForge — every format free, no signup, and every code checked before you download it.