Skip to content
FlashScan Pro

QR code won't scan: 7 causes and their fixes

Weak contrast, size too small, quiet zone cropped, excessive density: why your QR code refuses to read and how to fix it before the print run.

This article contains affiliate links: we may earn a commission if you use them, at no extra cost to you. This does not influence our recommendations.

The code never lies: if it won’t read, there’s a reason

A QR code that refuses to scan is almost never an app problem — it’s a pattern problem. The causes fall into seven families, from most common to sneakiest. The good news: all of them can be checked and fixed before the print run.

1. Insufficient contrast — cause #1

The reader decodes the difference between dark and light modules. A light-gray code on white, or dark-on-dark, never registers to the sensor’s eye. The rule: dark modules on a light background, with a frank contrast gap — aim for a 4:1 ratio minimum, like text. Our article on colors and contrast details which combinations pass and which fail.

Tricky variant: inversion — white modules on black background. Some readers decode it, many don’t. Don’t count on it for a printed code.

2. Size — too small for the distance

A 1 cm code on a poster read from 2 meters will never decode. The field rule: 1 cm of side per 10 cm of reading distance. A business card held in hand: 2 cm is enough. A wall poster: 10 cm and up. Our print size guide gives the values per medium.

3. The cropped quiet zone

Around the pattern, the standard requires a blank margin of 4 modules on each side. The layout designer who crops “tight to the edge” removes that margin — and the reader can’t find where the code begins. Fix: regenerate the code with its full margin and lock it in the template.

4. Density — too much content in the pattern

Every added character tightens the modules. A shortened-URL QR is 25 modules across; the same code with 300 characters needs 80+, unscannable at a reasonable size. If your code is packed black with modules, shorten the content: base URL without parameters, compressed text — or go through an intermediate page.

5. The medium — blurry, glossy, folded

An inkjet that bleeds, lamination that creates glare, a fold through the pattern: degradations error correction can’t always recover. For a sharp print run, a monochrome laser like HP LaserJet M110w — monochrome wifi laseraffiliate produces crisp edges at a far better cost per page than an inkjet — the #1 readability factor after contrast.

6. Damage — beyond the redundancy

Reed-Solomon error correction tolerates part of the pattern being unreadable: ~7% at level L up to ~30% at level H. A logo in the center or a light scratch passes at level H. But tolerance has limits: if more than a third of the pattern is gone, no correction will save the code. See our article on error correction levels.

7. The “regenerated” code — recreated from memory

Last sneaky case: someone re-generated the code with the wrong content — shortened URL, typo, truncated parameter. The pattern scans perfectly… but leads to the wrong place, or nowhere. Test the decoded content, not just the fact that it scans.

The pre-print test protocol

  1. Scan the generated code from the screen with a phone — exact content verified;
  2. Print a proof at real size on the real medium;
  3. Scan the proof from the intended reading distance, with two different phones;
  4. Only then: the print run. A failed proof costs a sheet — an unreadable code costs the run.