Why your QR code won't scan on some phones
A QR code is not a picture of your link. It is a grid of black and white squares with a fixed skeleton — corner markers, timing lines, a copy of the settings, and the data spread across what is left — and a scanner has to find that skeleton before it can read a single bit. Almost every code that scans in one place and not another has lost part of the skeleton, or the conditions the skeleton needs.
What the scanner looks for first
Three large squares sit in three of the four corners. They exist to be found from any angle: whichever line you draw through one, the ratio of dark to light along it is the same, which lets a camera locate and orient the code before decoding anything. Smaller alignment squares elsewhere let it correct for the curve of a bottle or the tilt of a photograph.
This is why damage is not equal everywhere. A scratch across the data area is usually recoverable, while a logo pasted over a corner square, or a code cropped so one corner is missing, is not a damaged code — it is not a code at all as far as the camera is concerned.
The margin is part of the code
The specification asks for a quiet zone of four empty modules — four squares' width of blank space — around every side. It is not decoration. The scanner uses it to know where the grid ends, and a code butted against a border, a photograph or a line of text has no reliable edge to find.
This is the most common failure in printed material by a wide margin, because designers naturally crop to the black pixels. If a code works when you paste it on a white page and fails in the layout, this is the first thing to check.
Error correction is a budget, and logos spend it
Four levels of error correction are available, recovering roughly 7, 15, 25 and 30 per cent of the code if it is dirty or covered. That redundancy is what lets a logo sit in the middle of a code at all: the covered modules are treated as damage and reconstructed.
The catch is that redundancy is made of extra modules. At the same physical size, a higher level means smaller squares, so a code that is printed small, given the highest correction level and then covered by a logo has spent the same budget three times. If you want a logo, keep it small, keep the code big, and decode the finished artwork rather than assuming.
Contrast, inversion and shiny surfaces
Cameras threshold the image into dark and light, so what matters is brightness difference, not colour difference. Two colours that look nicely contrasted to the eye — a mid blue on a mid green — can convert to nearly the same grey and become unreadable.
Codes are also meant to be dark on light. Inverted codes, white modules on a dark background, are read by some scanners and rejected by others, which is exactly the pattern of works on my phone, fails on yours. Gloss, foil and screens under bright light add reflections that wash out part of the grid, and a code behind glass often fails only at certain angles.
Size, distance and what the printer can hold
A workable rule for planning is that the code's side should be about a tenth of the distance it will be scanned from: a code read from two metres away wants to be roughly twenty centimetres across. A poster code the size of a business card code is a poster that nobody can scan.
Printing sets a floor as well. Ink spreads slightly on paper, so once a single module is around a third of a millimetre, neighbouring dark squares start to merge and the grid stops being readable no matter how good the camera is. The same applies to embroidery, engraving and anything else with a minimum feature size.
What you put in changes how dense it gets
The amount of data decides the version, and the version decides how many modules per side — from 21 for the smallest up to 177 for the largest. A long link with tracking parameters can push a code several versions denser than a short one, which then has to be printed larger to stay readable.
Encoding matters too. Digits are packed most tightly, uppercase letters and a handful of symbols get a compact mode of their own, and anything else falls back to full bytes. A link written in uppercase can therefore fit in a visibly simpler code than the same link in mixed case, which is why some printed URLs are shouted.
Test the thing you are actually shipping
Decode the final artwork, not the file you generated: the failure is usually introduced afterwards, by a crop, a recolour, a resize that blurs the edges or a compression pass. Reading the code back tells you both that it still decodes and that it points where you think it does.
Then test it the way it will be used — printed at final size, on a phone that is not yours, at the distance and lighting of the real place. And if the code points at a short link, remember that the paper will outlive the redirect service; a code you cannot change is a promise to keep that URL working.