Guides

Making codes that actually scan

Practical guidance drawn from what the readability checker rejects most often. No publishing schedule and no filler — these get added to when there is something worth saying.

How big should a QR code be?

The single most common reason a printed code fails.

The working rule is one tenth of the scanning distance. Read at arm’s length, about 30 cm, means 3 cm across. A poster read from 3 metres needs 30 cm. A billboard at 20 metres needs 2 metres, which is usually the moment somebody discovers the code was an afterthought in the layout.

That rule assumes a moderately simple code. Density matters just as much: a short link might need 25 modules across, while a full contact card can need 100+. At the same physical size, each module in the dense version is a quarter the width — and module width is what a camera actually has to resolve. Two codes the same size on paper can behave completely differently.

This is the strongest practical argument for a dynamic code on anything space-constrained: it encodes a short link regardless of how much content sits behind it, so the pattern stays sparse and scannable.

Set the intended print width in the generator and the readability check accounts for it, warning you when the content is too dense to survive at that size.

Colour and contrast without breaking the code

Brand colours are fine. Pale ones are not.

A scanner needs to tell dark modules from light background. Aim for a contrast ratio of at least 4:1, and treat 3:1 as an absolute floor. The usual failure is a pale brand colour on white — it looks elegant on a monitor at 100% and disappears under shop lighting.

Gradients work provided the worst point still clears the threshold. A gradient running from navy to pale blue fails wherever it gets pale, even though the average looks fine. Our check evaluates the worst-case luminance across the gradient rather than an average, which is why it will sometimes reject something that looks acceptable.

Inverting — light modules on a dark background — usually works on modern phones but is not guaranteed: the specification assumes dark-on-light. If the code is going somewhere you cannot reprint, do not invert it.

Printing adds a further trap. Ink spread on uncoated stock thickens dark modules and closes up the gaps, and a code that decodes at 3.2:1 on screen can fail on newsprint. Keep more margin than you think you need.

Putting a logo in the middle

It works because of error correction — which means it has a budget.

QR codes carry redundancy so a damaged code still reads. At the highest level, roughly 30% of the symbol can be missing. A centre logo works by deliberately spending that budget.

Which means it is a budget, not a free space. Keep the logo to about 20–25% of the code’s area at the highest error-correction level. Past that you are not just risking the scan — you are consuming the tolerance that lets a scuffed, folded or partly shadowed code still work in the real world. A code that decodes perfectly on your screen with a 35% logo has no margin left for a fingerprint.

Two practical points. Keep the logo central: the three corner finder patterns and the alignment patterns must stay completely clear, and damage concentrated in one region is harder to recover than the same amount spread out. And give the logo a small quiet margin against the background colour rather than letting it butt directly against modules.

The generator raises the error-correction level automatically when you add a logo, and refuses the download outright if the result stops decoding.

The white border is not optional

Cropping it is the fastest way to break a code that worked.

The margin around a QR code — the quiet zone — is part of the specification, not padding. Scanners use it to work out where the symbol starts and ends. The standard calls for four modules’ width on every side.

It gets removed constantly, usually by a designer tightening a layout, or by placing the code hard against a coloured panel or photograph. The code still looks complete, which is exactly why the failure is confusing: nothing appears to be missing.

Our exports include the quiet zone by default. If you are placing a code on a coloured background, make sure the quiet zone is filled with the code’s own background colour rather than the surrounding artwork.

Static or dynamic: deciding before you print

The one decision you cannot revisit afterwards.

A static code holds its content in the pattern. It works forever, needs no service behind it and costs nothing — but can never be changed, and reports nothing.

A dynamic code holds a short link you control. You can change where it leads after printing, and see how often it was scanned — at the cost of depending on a redirect service continuing to run.

Ask one question: could the destination ever change? For a guest Wi-Fi password, a phone number or a plain-text label, static is the better answer and the free tools produce it. For a menu, a property listing, a campaign, packaging with a year-long lead time, or anything you want to measure, static is a decision you will regret at the next reprint.

Be sceptical of anyone offering to “convert” a static code to dynamic. The destination is physically encoded in the pattern; changing it means changing the pattern, which means reprinting.