← Blog

What makes a good QR code (that people actually scan)

30 May 2026

Most QR codes fail quietly. Nobody scans them, and nobody tells you why. The code printed fine. The link worked when you tested it on your own phone. The campaign still got nothing.

Nearly always, it's one of four things. The code was too crammed. It couldn't cope with where you stuck it. It was too small for the cameras aimed at it. Or nobody had a reason to bother.

Fix those and a code just works. Cheap phone, bad light, first try. Let's take them one at a time.

1. Keep the payload short

A QR code stores your data as a grid of little black and white squares — modules. Cram in more data and it needs more of them, so the grid gets busier. Same print size, smaller squares, and now a camera has to pick out finer detail to read it. That's the gap between an instant scan and someone waggling their phone at a wall.

The fix is simple: shorten what the code carries. Nothing else helps as much.

None of this assumes a web address, by the way. A code doesn't have to hold a link at all — it can carry WiFi credentials, a contact card, or a phone number. Whatever's inside, shorter wins.

2. Match error correction to the environment

QR codes carry a bit of built-in backup called error correction. It lets a scanner rebuild the data when part of the code is missing or scuffed. There are four levels:

More isn't automatically better. Every extra bit of backup adds modules, and you've just seen what that does. Pick the level for where the code actually lives:

Putting a code somewhere it'll get handled, scuffed, or wrapped round a bottle? The extra headroom of Q or H costs you almost nothing. Same thinking behind codes that scan at a retail till and labels printed small on a gallery wall.

3. Size it for the worst camera that'll scan it

Rough rule: make the code about a tenth of the distance people scan it from. Scanning from 40 cm away? That's a 4 cm code, minimum. A poster read from two metres wants a 20 cm code — far bigger than most people print.

Then build for the worst case, not your own handset:

The recipe never changes: short payload, decent size, strong contrast. The code that gets waved at and given up on is the small, dense, washed-out one.

And leave the quiet zone alone — the empty margin round the code. Scanners use it to find the edges. Pack text or artwork right up against it and you'll get failures that look like nothing's wrong. Keep a clear border, roughly four modules wide.

4. Give people a reason to scan

A bare code tells you nothing. People won't lift their phone unless they know what's coming. The codes that pull their weight sit next to a few words — a verb and a payoff:

Keep it short. Put it right by the code. Make the promise specific. "Scan me" is not a reason. "Scan for the audio guide" is.

The rest of the checklist

Those four do most of the work. A handful of details stop a good code being wrecked by something silly:

Getting it right at scale

One code, and all this fits in your head. The trouble starts at a hundred — a code per SKU, ticket, or table, each following the same rules.

That's what bulkqr is for. Set the design once — size, error correction, colour, a logo — and it lands on the whole batch. Up to 100 codes are made right in your browser, so nothing's uploaded, and you download them as a ZIP or lay them out as printable labels. Every code inherits the same sane defaults, so you're not re-checking contrast a hundred times over.

Nail the four, test one on a cheap phone, and let the rest follow.

Ready to make some? Generate your first batch — no account needed.