Saltar al contenido

Why QR codes fail to scan, and how to make ones that always do

6 min read Formats Updated August 2026

A QR code either scans instantly or it does not scan at all, and the failures are rarely random. They come from a small set of causes: the code is too small for the distance, the contrast is too low, the colours are inverted, or a logo has been dropped in the middle without the error correction to survive it.

This guide covers what the black squares are actually doing, and the specific numbers that decide whether a code works on a poster, a business card or a table tent.

What is inside a QR code

A QR code is not an image of a link. It is a two-dimensional data structure with defined regions, and knowing them explains every failure mode.

The three large squares in the corners are finder patterns; they let a scanner locate the code and work out its rotation, which is why a QR code scans upside down. The smaller square near the fourth corner is the alignment pattern, correcting for the code being photographed at an angle. The dotted lines running between the finder patterns are timing patterns, establishing the grid size. Everything else is data and error correction.

Around all of it is the quiet zone — a margin of blank space, four modules wide, where a module is one of the small squares. The quiet zone is part of the specification, not decoration. A code printed flush against text or a coloured background frequently fails for this reason alone, and it is the single most common design mistake.

Error correction: how much damage it survives

QR codes use Reed-Solomon error correction, the same family of algorithm that lets a scratched CD play. There are four levels, and choosing one is a trade between resilience and capacity.

Level L recovers about 7% of the data, M about 15%, Q about 25% and H about 30%. Higher levels mean more of the code is redundancy, so for a given amount of data the code needs more modules — a longer URL at level H produces a visibly denser code than the same URL at level L.

This is what makes centre logos possible. A logo covering 20% of the code is simply damage, and at level H the code still decodes. At level L the same logo destroys it. If you are placing a logo, use H and keep the coverage under about 25%; there is no way to place a logo 'correctly' other than leaving enough redundancy to absorb it.

The other reason to raise the level is the physical environment. A code on a table in a restaurant, a sticker on a lamppost, a label on a machine — these accumulate scratches, grease and fading. Level Q or H is a maintenance decision.

  • L (~7%): screens and digital use where nothing will damage it.
  • M (~15%): the usual default; fine for clean print.
  • Q (~25%): print that will be handled, or a small logo.
  • H (~30%): outdoor, industrial, or a centre logo.

How big does it need to be?

There is a widely used rule of thumb: the code's width should be at least one tenth of the scanning distance. Scanned from one metre, the code should be at least 10 cm across. From five metres — a poster across a room — it needs to be 50 cm, which is far larger than most people expect and is why poster QR codes so often fail.

The rule is conservative and modern phone cameras often beat it, but designing to it means the code works for the person with an older phone in poor light, which is the case that matters.

There is also an absolute floor. Below roughly 2 cm, a printed code becomes unreliable regardless of distance, because the individual modules approach the resolution of the printing process and the camera. If your code carries a long URL it has more modules in the same physical space, each one smaller — so shortening the URL genuinely improves scannability. A link shortener is a legitimate technical fix here, not just tidiness.

Contrast, colour and the inversion trap

Scanners look for a luminance difference between modules and background. The specification effectively wants a contrast ratio of at least 3:1, and in practice you want considerably more.

Two rules break codes constantly. The first: the code must be darker than its background. Scanners expect dark modules on a light field, and while many modern decoders handle inversion, a meaningful number do not. A white code on a black poster is a coin flip across the installed base of scanning apps.

The second: colour contrast is not luminance contrast. Red modules on a green background look strongly contrasting to a human eye and can be nearly identical in brightness, which is what the camera is measuring. If you are colouring a code, check it in greyscale — if the modules and the background look similar there, the code will struggle.

Gradients are usable if the light end stays clearly darker than the background, but every increase in styling is a decrease in margin. A code is a functional object first.

  • Dark modules on a light background, not the reverse.
  • Check the design in greyscale before printing.
  • Keep the four-module quiet zone completely clear.
  • Avoid placing a code over a photograph or texture.

Static versus dynamic codes

A static QR code contains the destination directly. Anyone scanning it goes straight there, it never expires, it works with no third party involved — and it cannot be changed. Fixing a typo means reprinting.

A dynamic QR code contains a short URL owned by a service, which redirects. That gives you editable destinations and scan analytics, and it introduces a dependency: the code works only as long as that company exists, keeps the link active, and does not start charging. There is a well-established pattern of free dynamic QR services expiring links after a trial and turning printed materials into dead ends.

For anything printed at volume or intended to last, static is the safer engineering choice. Use dynamic when the ability to change the destination is genuinely worth the dependency — a campaign you expect to redirect, for instance. Our QR generator produces static codes only, which is a deliberate limitation rather than a missing feature.

Test before you print a thousand

Test at the real size, on the real material, in the light where it will live. A code that scans on your monitor tells you very little about a matte-laminated card under a restaurant's dim lighting.

Test with more than one phone, including an older one, and with the default camera app rather than a dedicated scanner app — most people scan with the camera. Test at the distance people will actually stand. And print one physical proof before the run: paper absorbs ink and slightly thickens the modules, which reduces the effective quiet zone and can push a marginal code over the edge.

Preguntas frecuentes

Why won't my QR code scan?
In order of likelihood: no quiet zone around it, too small for the distance, insufficient luminance contrast, inverted colours (light code on dark background), or a logo placed without enough error correction to absorb it.
Can I put a logo in the middle of a QR code?
Yes, if you generate at error correction level H and keep the logo under about 25% of the area. The logo is treated as damage, and level H recovers roughly 30% of the data.
Do QR codes expire?
Static codes never expire — the destination is encoded in the code itself. Dynamic codes point at a redirect owned by a service, and stop working if that service ends the link or the company disappears.
What size should a QR code be on a poster?
At least one tenth of the viewing distance. Read from three metres, the code needs to be about 30 cm wide. Below roughly 2 cm nothing scans reliably regardless of distance.

Tools mentioned in this guide

Keep reading