Almost every QR code that fails in the field fails for one of three reasons: it was printed too small for the distance, it had no clear space around it, or nobody scanned a physical proof before the run. Size is the one people ask about, so start there.
The 10:1 rule
A QR code should be roughly one tenth of the distance it will be scanned from. Someone scanning a table card from 30 cm needs about 3 cm of code. A poster read from 3 m needs about 30 cm. A billboard scanned from 20 m needs 2 m, which is usually the moment somebody reconsiders putting a QR code on a billboard.
This is a floor, not a target. Going larger costs nothing but layout space and buys tolerance for bad lighting, older phone cameras, and people who do not hold still.
Practical starting sizes
| Where it goes | Scan distance | Minimum size |
|---|---|---|
| Business card | 20–30 cm | 2 cm |
| Product packaging | 20–40 cm | 2–2.5 cm |
| Restaurant table card | 30–50 cm | 3 cm |
| Flyer or leaflet | 30 cm | 2.5 cm |
| Window sticker | 1 m | 10 cm |
| Estate agent yard sign | 2 m | 20 cm |
| Indoor poster | 2–3 m | 20–30 cm |
| Trade show banner | 3–5 m | 30–50 cm |
The absolute floor for any printed code is about 2 cm square. Below that, ordinary print tolerances start closing the gaps between modules and the failure rate climbs quickly.
The quiet zone matters more than size
A QR code needs a clear margin around it — the quiet zone — so the camera can find its edges. The specification asks for four modules’ width, which is roughly 10% of the code’s width in practice.
Designers delete it constantly. A code butted against a coloured panel, a border, or a line of text is the single most common cause of a code that "sometimes works". Give it white space, and do not put anything decorative inside that margin.
Density: fewer characters, bigger modules
A code encoding 30 characters has visibly larger squares than one encoding 150, at the same physical size. Bigger squares survive worse printing and scan from further away.
This is the practical argument for short URLs on print. If you are encoding a campaign URL with five UTM parameters, the pattern will be dense and will need to be printed larger. A dynamic code sidesteps the whole problem by encoding a short redirect and carrying the UTM parameters on the far side of it, where they cost nothing.
Test the physical proof, not the screen. A code that scans perfectly from a monitor can fail on cardboard. Print at final size, on the actual stock, and scan it with at least three phones — including one older Android — under the lighting it will actually live in.
Print-side details that decide it
- Use vector. Send SVG or EPS to the printer. A raster PNG scaled up produces soft module edges, which is exactly what a camera struggles with.
- Keep contrast high. Dark pattern on a light background, ideally near black on white. Light-on-dark inverted codes work on modern phones and fail on plenty of older ones.
- Prefer matte. Gloss varnish under a downlight or low sun produces glare that blanks out part of the pattern.
- Watch curved surfaces. Below about 5 cm diameter — a bottle neck, a slim tube — the curvature distorts the pattern enough to matter. Move the code to a flat panel.
- Mind absorbent stock. Flexographic printing on corrugated board spreads ink and closes module gaps. Size up and proof it.
- Say what the scan gives them. "Scan for the menu" outperforms a bare code every time. It is not a size issue, but it decides whether the size mattered.
Error correction and logos
QR codes carry redundant data at one of four levels, from about 7% recoverable at level L to about 30% at level H. Higher correction means a denser pattern for the same content, so it is a trade rather than a free win.
If you are embedding a logo, you need the headroom: level H, with the logo kept under roughly 20% of the code’s area and centred, where the redundancy is best distributed. If there is no logo and the print quality is good, level M is a sensible default. There is more on this in QR code design best practices.
Once the sizing is settled, the dynamic QR code generator will give you print-ready vector output with the correction level and quiet zone already handled.