First, isolate the problem: the code or the page?
Before looking for the cause, you need to know where the chain breaks. A scan happens in two steps: the phone decodes the image to extract a text (usually a web address), then it opens that address. Each step has its own failures.
- The phone does not react, or never offers to open a link: this is a reading problem. The image itself is at fault — contrast, size, margin, logo, surface.
- The phone does offer a link, but the page shows an error, stays blank or leads somewhere unexpected: this is a destination problem. The code is perfectly readable; what it points to no longer responds.
1. Contrast that is too low
A QR code reader does not see colours: it sees light areas and dark areas, and must decide for each small square (each “module”) which one it is. The closer the two shades, the more of a gamble that decision becomes — especially in poor lighting or with an entry-level camera.
- Pastel colours or light greys on a white background are the most frequent cause: elegant on screen, unreadable on paper.
- A light code on a dark background (“inverted”) is read by most recent phones, but not by some older or industrial readers. Dark on light remains the safe rule.
- Two bright colours of similar brightness (red on green, blue on purple) may work in colour and collapse once photocopied in black and white.
Contrast can be measured: it is the brightness ratio between the light shade and the dark shade. Black on white reaches 21:1; below 4:1, reading becomes genuinely hit-and-miss, and above 7:1 you have a comfortable margin, even at small sizes or in low light.
2. A code too small for the scanning distance
What matters is not the absolute size of the QR code, but the number of pixels it occupies in the photo taken by the phone. A 3 cm code is read effortlessly on a table; the same code stuck on a shop window and aimed at from the pavement covers only a handful of pixels, and each module becomes indistinguishable.
A rule of thumb widely used by printers: the side of the QR code should be at least one tenth of the distance from which it is scanned. It is not a standard, but it is a good starting point:
- Business card or flyer, read in hand at 20-30 cm: 2 to 3 cm per side.
- Table tent or menu, read at 40-50 cm: 4 to 5 cm.
- Poster or shop window, seen from 1 to 2 metres: 10 to 20 cm.
- Outdoor sign read from the pavement or a stopped car, at 3-5 metres: 30 to 50 cm.
The length of the content matters too. The longer the encoded address, the more modules the code contains — and, at the same printed size, the smaller each module. A 150-character address full of tracking parameters produces a dense, fragile code; a short address, like that of a dynamic QR code, produces an airy code that can be read from further away.
3. A cropped white margin
Every QR code needs a light, empty border around it, called the “quiet zone”. It is what lets the phone understand where the code starts and where it ends. The standard that defines QR codes (ISO/IEC 18004) requires a margin at least four modules wide on all four sides.
This margin disappears more often than you might think: a designer finds it unsightly and removes it, a decorative frame is placed right against it, the guillotine trims it at print time, or the code is set on a busy photo or pattern. In all these cases, the edges of the code merge with the background, and the phone can no longer tell where it ends.
4. A logo or design that is too ambitious
If you can place a logo in the middle of a QR code, it is thanks to error correction: part of the code is redundant, so it stays readable even when a portion is hidden or damaged. Four levels exist, which can rebuild roughly 7%, 15%, 25% or 30% of the data depending on the chosen setting.
The problem arises when the logo hides more than error correction can repair, or when it spills over areas that nothing can make up for:
- The three large squares in the corners (the position markers): without them, the phone cannot find the code. They must never be covered or heavily distorted.
- Very fanciful module shapes (tiny dots, stars, patterns) reduce the dark surface of each module and make reading more demanding.
- A logo without a white margin around it merges with neighbouring modules and “eats” more data than its actual size.
5. The surface and the reading conditions
A perfectly designed code can fail because of what it is printed on, or where it is displayed:
- Glare: glossy lamination, a pane of glass or a screen under a spotlight throws back a white patch that erases part of the modules. Matte is almost always preferable.
- Curved surfaces: on a bottle, a cup or a post, the code distorts and its edges leave the frame. Better to place it on the flattest part, or make it smaller.
- Blurry printing: a low-resolution QR image that has been enlarged, or paper so absorbent that the ink bleeds, produces soft module edges that the phone misreads. A vector file (SVG, PDF) avoids this trap.
- Outdoor wear: sunlight fades inks, rain warps paper. A code displayed outside for months gradually loses its contrast.
- Lighting: a code placed in a dark corner, or backlit behind a shop window, reads far less well than the same code under clear light.
6. The code reads, but the destination no longer responds
This is the most frustrating failure, because the code itself is flawless. The phone reads it instantly… and opens an error page, a blank page or a site that has nothing to do with it any more. The usual causes:
- The website was redesigned and the page address changed, with no redirect from the old one.
- A typo slipped into the address when the code was created, and nobody tested it before printing.
- The code was created with a service that deactivated it at the end of a free trial or a subscription — a widespread practice, often discovered by customers before the business owner.
- The destination page works on a computer but not on mobile: too heavy, blocked by a cookie pop-up, or restricted to a logged-in account.
With a static QR code, the address is baked into the image: the only fix is to reprint. With a dynamic QR code, the printed code points to a relay you control; you simply correct the destination, and every item already printed works again immediately. It is often the difference between a thirty-second update and a full reprint.
What if it is the phone?
It is rarer than people think, but it happens. A dirty or scratched lens blurs the image — a wipe with a cloth often solves the problem. On iPhones, the camera has read QR codes natively since 2017, as do the vast majority of recent Android phones; on an older model, you sometimes need Google Lens or a dedicated app. Finally, a third-party scanning app that has been denied camera access obviously cannot read anything.
If the code only works on some phones, do not be too quick to blame them: it is the sign of a code on the edge of readability. Your customers will not try again with another device.
Prevent rather than reprint
Almost all these failures can be caught in a few minutes, provided you test in real conditions rather than on the computer screen that has just generated the code:
- Print a proof at actual size, on the actual paper. A QR that reads on a 27-inch screen tells you nothing about its 2 cm version on a flyer.
- Scan it with at least two different phones, including an entry-level or slightly older one.
- Scan from the distance your customers will actually use — from the pavement for a shop window, not with your nose against the paper.
- If the item is likely to be photocopied, also test a black-and-white photocopy.
- Open the destination on a phone using mobile data, without being logged into your account: that is what a customer will see.
- Once the items are out, keep an eye on your scan statistics: an item that suddenly stops generating scans is often damaged, covered or badly placed.
A tool can do part of this work for you. At QRyx, every QR code is generated at the highest error correction level, then goes through a scannability test before being saved, on every plan: contrast between the chosen colours, light/dark direction, readability once converted to greyscale, and above all an actual decode of the final file, logo and frame included. If it fails, the problem is flagged and named before saving, rather than discovered after printing.
QRyx