Why your QR code won't scan (and how to find out which part broke)
Four different things can break a QR code, and they need four different fixes. One test tells you which one you have, before you reprint anything.
Your QR code is not scanning, and you already printed it. Or you are about to, which is the better version of this problem to have.
Before you change the colour, regenerate it, or blame the printer, work out which layer actually broke. A QR code that never scanned and a QR code that stopped scanning have nothing in common except the symptom. Fixing the wrong one costs you a second print run.
Start here, before you change anything
Take a photo of the code with your phone. Then open that photo in any QR reader that accepts an image file rather than a live camera.
What happens next splits the problem four ways.
The photo decodes and opens the right page. The pattern is fine. So is the destination. Your problem is capture conditions: light, glare, focus distance, or the scanner app.
The photo decodes but the page is dead or wrong. The pattern is fine. The problem is behind the code, not in it.
The photo does not decode at all. The pattern is damaged. Either the code was built badly or the print destroyed it.
Nothing scans, but only on your phone. Hand the code to someone else. If it works for them, the code was never the problem.
That is the whole diagnostic. Each of the four sections below fixes one branch.
If no phone can read it, the pattern is broken
Four things damage the pattern. They show up in roughly this order of frequency.
The contrast is too low
A camera does not see colour. It sees light against dark, and it has to sort every cell in the grid into one bucket or the other. That is called thresholding, and it is the entire mechanism.
Red modules on an orange background have plenty of colour difference and almost no lightness difference. To a phone camera in a dim restaurant, that is one flat surface. Same for navy on black, or pale yellow on white.
Two rules that hold up: keep the code dark on a light background rather than the reverse, and judge the pair on lightness rather than hue. Inverted codes, light on dark, do work on some scanners and fail on others. That is not a gamble worth taking on a print run.
The quiet zone got eaten
Every QR code needs an empty margin on all four sides, four modules wide. The specification is explicit about it. It is not white space for looks. It is how a scanner works out where the code ends and the rest of the page begins.
This one is almost never the generator's fault. It happens in the layout. You drop the code into a corner, tuck it against a headline, or put a thin border box around it to make it look tidy. The margin goes, and detection fails on a code that is otherwise perfect.
The logo covers too much
A logo in the middle of a QR code works because of error correction. The format encodes redundant data so a partly damaged code can still be read. There are four levels, L, M, Q and H, recovering roughly 7, 15, 25 and 30 percent of the symbol.
So a centre logo is a deliberate wound you can afford. Up to a point. Push past what the level can rebuild and it stops decoding, usually not gradually but all at once.
There is a catch nobody mentions when they tell you to just raise the error correction level. Higher correction means more redundant data, which means more modules, which means a denser grid at the same physical size. You bought logo room and paid for it in print size.
There is too much data in the code
The more characters you encode, the more modules the grid needs. At a fixed physical size, more modules means each one is smaller.
A short link and a 200 character tracking URL with campaign parameters produce visibly different codes. The second one is a much finer grid and needs noticeably more paper to stay readable. If you are near the size limit, shortening the URL does more for you than any design change.
If it scans on screen but not on paper, it is size
This is the most common version of the whole problem, and the most avoidable. On your monitor the code is backlit, sharp, and you are holding the phone 15 cm away. On a flyer it is ink, in whatever light the room has, and people stand back.
We wrote about the three things that go wrong in the jump from screen to paper in more detail in why QR codes fail on paper.
Two by two centimetres is not the answer
You will see that number everywhere, along with the rule that a code needs one unit of width for every ten units of scanning distance. Both are rough floors, and both assume a short payload.
They break the moment your code carries a long URL. Same physical size, twice as many modules, half the module width. The rule of thumb says you are fine and the camera disagrees.
The honest answer is that the minimum depends on two things: how many modules your specific code has, and how far away people will be standing. That is a calculation, not a constant. Our generator works it out for the code you are actually building and tells you the number before you download, which is the one thing a static rule cannot do.
You scaled up a small PNG
A PNG is a fixed grid of pixels. Enlarge it in a layout tool and you get soft, mushy edges where the scanner needs hard ones. Small codes survive this. Poster-sized ones do not.
Send the SVG or the PDF to whoever is printing. Both are vector, so the edges stay sharp at any size. Export large in the first place rather than rescuing a small export later.
The surface is working against you
Glossy laminate throws glare straight back at the camera, which is why laminated menus fail under bright lighting and work in the shade. Folds through the code break the pattern. So do staples. Curved surfaces, bottles and cups, distort the grid enough that scanners give up at the edges.
None of this is fixable after printing. It is a layout decision: keep the code flat, keep it away from the fold, and prefer matte stock where you have the choice.
If it worked before and then stopped, the code is fine
Printed patterns do not decay. If a code scanned in March and fails in September, nothing changed in the ink. Something changed behind it.
The destination moved
The page was deleted, renamed, or moved behind a login. The code still decodes perfectly, hands the phone a URL, and the phone gets a 404. If you encoded a link straight to your own site, this is the likely answer, and it is fixable without reprinting anything: put the old URL back, or redirect it.
Your QR generator switched it off
This is the one nobody selling QR codes will tell you plainly.
A dynamic QR code does not contain your link. It contains a link to your provider, who then redirects to wherever you have pointed it. That indirection is genuinely useful, because you can change the destination after printing.
It also means your printed codes depend on an active subscription. When the trial ends, the plan lapses, a card expires, or the campaign hits a scan limit or an expiry date you set and forgot, every code you ever printed goes dead at once. They still look perfect. They still decode. They just land on a dead redirect.
The tell is that the failure is sudden and total rather than patchy. If half your codes work and half do not, it is a design or print problem. If all of them stopped on the same day, check the dashboard you generated them in.
Static codes cannot have this failure, because there is nothing in the middle to switch off. The trade-off is real and worth stating: with a static code you cannot change the destination later. Pick based on whether that matters more to you than the code outliving your subscription.
If it is only your phone
Sometimes the code is fine and the scanner is the problem.
On iPhone, QR scanning can be turned off. Settings, Camera, Scan QR Codes. On Android it is usually in the camera app settings, or you can use Google Lens directly.
Two things people get backwards. Phones have a minimum focus distance of roughly 8 to 10 cm, so moving closer to a code that will not scan usually makes it worse. Back away instead. And you do not need to fill the frame or line the code up inside any box on screen.
If another phone reads it without complaint, stop debugging the code.
Not doing this again
Test before the run, not after. Three checks catch nearly everything:
Scan it on two phones, one iPhone and one Android. They use different decoders with different tolerances.
Test at the real distance. A code on a wall gets read from two metres, not from your desk.
Print one proof on the actual stock before committing to a thousand.
If you are choosing a generator, the useful question is whether it checks the code before you download it or leaves you to find out at the printer.
Sources
ISO/IEC 18004, the QR code specification, on quiet zone requirements
Denso Wave, the inventor of the format, on error correction levels
Apple Support on the Scan QR Codes camera setting
Find out before you print, not after.
We check contrast, quiet zone and minimum size while you build the code, and tell you the number for your code rather than a rule of thumb.
Open the generatorQuestions people ask when a code fails
Why won't my QR code scan?
Most often one of four things: not enough lightness contrast between the code and its background, a quiet zone that the layout has cropped, printing too small for the distance people stand at, or a destination link that has died. Photograph the code and decode the photo to work out which one you have.
Do QR codes expire?
The code itself never expires. A dynamic QR code routes through a provider's redirect, and that redirect can be switched off when a subscription lapses or a campaign hits an expiry date or scan limit. A static code has nothing in the middle to expire.
What is the minimum size for a printed QR code?
It depends on how many modules your code has and how far away people will be. The common advice of 2 by 2 cm, or width equal to a tenth of the scanning distance, assumes a short link. A long tracking URL packs in more modules and needs more paper at the same readability.
Can QR codes be coloured?
Yes, as long as there is enough difference in lightness between the modules and the background, not just in hue. Dark on light works better than light on dark. Gradients are risky because they can pass on average and fail at one end.
Does a logo in the middle break a QR code?
Not on its own. Error correction lets a code survive partial damage, which is what a centre logo is. Cover more than the correction level can rebuild and it stops decoding, and raising the correction level adds modules, which means the code needs to be printed larger.