A QR code either scans instantly or it doesn't scan at all, and the difference usually has nothing to do with the tool that generated it. Four physical factors decide the outcome, and all of them are set by you rather than by the software.
Error correction: why a logo does not break the code
QR codes store their data with deliberate redundancy using Reed-Solomon error correction — the same family of mathematics that lets a scratched CD still play. The standard defines four levels, and choosing between them is a trade-off between resilience and capacity.
- Level L recovers about 7% of the code. Highest data capacity, least tolerance for damage.
- Level M recovers about 15%. The usual default and a reasonable choice for screen display.
- Level Q recovers about 25%. Sensible for anything printed.
- Level H recovers about 30%. Use this whenever you place a logo in the centre or expect the code to get scuffed.
This is why a logo in the middle does not stop a code working: the scanner reconstructs the obscured region from the redundant data. It also explains the failure mode people hit — placing a large logo on a Level L code leaves nothing to reconstruct from.
The quiet zone is not decoration
Every QR code needs a margin of blank space around all four edges, formally at least four modules wide (a module being one of the small squares). Scanners use that empty border to locate where the code begins and ends. Designers routinely crop it away to make a layout tidier, and the result is a code that reads inconsistently or not at all — particularly on cheaper scanners and older phone cameras.
Size relative to scanning distance
A useful rule of thumb: the code should be roughly one tenth of the distance it will be scanned from. A flyer read at arm's length — say 30cm — needs a code around 3cm across. A poster read from three metres needs one around 30cm. Codes printed at business-card size and expected to work from across a room simply will not.
The amount of data matters here too. A long URL produces a denser grid with smaller modules, so it needs to be printed larger to stay readable. Shortening the URL first is often the easiest fix for a code that has to be small.
Contrast and inversion
Scanners expect dark modules on a light background. Inverted codes — light on dark — are read by many modern phones but rejected by plenty of older scanners and most dedicated hardware. If the code matters commercially, do not invert it. Avoid low-contrast colour pairings for the same reason, and never print a code over a photograph or textured background.
Static codes cannot be changed later
A QR code generated here is static: the destination is encoded directly into the pattern. That means it works forever and does not depend on any service staying online — but it also means the destination cannot be edited once printed. If you might need to redirect it later, encode a URL you control and change where that URL points, rather than regenerating the code.
Test before you commit
- Scan with at least two different phones, ideally one Android and one iPhone.
- Test at the actual distance and size it will be used at, not on your monitor.
- If printing, test an actual print — screen contrast flatters codes considerably.
- Check the decoded destination rather than assuming; a typo in a URL survives encoding perfectly.