My QR code will not scan: why, and how to fix it
It is almost always one of eight things, and the first three account for most cases. They are ordered by how often they actually happen, so working down the list should find your problem inside a minute.
1. There is no white margin around it
The most common cause and the least known. A QR code needs an empty border of at least four modules, meaning four times the width of one of its small squares. Without that margin the reader cannot tell where the code ends and does not recognise it at all.
It happens whenever somebody crops the code flush to its edge, presses it against the trim of a card, or slides text up beside it. The fix is leaving clean space around it of roughly 10 per cent of the code's width, in the same light colour as the background.
2. Contrast is too low, or inverted
The squares need to be dark and the background light. If you picked a pastel for the squares, or a mid-dark background, the reader hesitates. And if you inverted the scheme, light on dark, some phones read it and some do not.
The quick test: look at the code through squinted eyes, or convert it to greyscale. If the squares do not stand out clearly from the background, the camera will not separate them either. Go back to dark on light and the problem disappears.
3. It is too small for the distance
The rule is one tenth of the reading distance: 3 centimetres to read at 30, 20 centimetres to read at 2 metres. And there is a hard floor of 2 by 2 centimetres below which printing bleeds the squares together regardless of distance.
If the code is on a high or distant sign, measure the real distance the person will stand at, not the one you pictured while designing. It is a routine mistake: on screen the code looks enormous, on the wall it ends up four metres from any human eye.
4. It stores too much text
More content means more squares and thinner ones. A long web address with campaign parameters, or a vCard with every field filled in, produces a dense code that needs considerably more size and light to read.
The fix is reducing what it stores: shorten the address, drop the fields the vCard does not need, or if it is a long text move it to a web page and use a link code instead. A code holding less information is literally easier to read.
5. Glare and curved surfaces
If the code is on gloss paper, laminated, behind glass or on metal, the reflection of a single lamp can cover exactly the part the camera needs. The person moves the phone, nothing happens, and they give up.
Choose a matte finish where you can. Where you cannot, size the code about 20 per cent larger to buy margin. On curved surfaces like bottles or cans, place the code on the flattest area and test it on the real container before committing to the run.
6. The logo covers too much
QR codes tolerate some obstruction thanks to error correction, up to around 30 per cent at the highest level. But that allowance is not a permission slip: it is the cushion protecting you from smudges, creases and bad light. Spend all of it on the logo and there is nothing left for the real world.
Stay under 15 per cent of the area, centred, and never cover the three large squares in the corners: those are what the reader uses to orient itself, and without them the code is unreadable.
7. The printing came out badly
A printer low on toner, a dirty head or porous paper can leave the squares grey, smeared or bled together. You can see it up close: the edges should be crisp, not fuzzy.
If you printed from a photo or a screenshot of the code, there is your problem: the image was already degraded. Download the original PNG, or better the SVG, and print from that file.
8. The code is fine and the destination is broken
Two failures worth telling apart feel identical. If the phone recognises nothing when you point it, the problem is the code. If the phone reads the code and shows the address, but the page then fails to load or errors out, the code is perfect and the problem is the destination.
In that second case, check the address is spelled correctly, includes the full domain, and that the page works if you open it by hand in a browser. It is surprisingly common to discover the QR was fine the whole time.