A QR code is only useful if a phone camera can read it in one try, in real lighting, at a real distance. Most scan failures come down to a handful of avoidable mistakes: too small, too little margin, too little contrast, or never tested on an actual phone before going to print. Here’s how to avoid all of them.
Size: match it to scan distance
The rule of thumb is a 10:1 distance-to-size ratio — a code needs to be roughly one-tenth as wide as the distance people will scan it from. A poster scanned from 3 meters away needs a code about 30 cm wide; a table tent scanned from arm’s length can be much smaller.
Whatever the distance, don’t go below about 2 cm (0.8 in) for anything scanned up close, like a receipt, business card, or table tent. Below that, even a good phone camera struggles to resolve the individual modules, especially in dim light or at an angle.
Quiet zone: leave a real margin
QR codes need a clear, empty border — the quiet zone — on all four sides, roughly 4 modules wide (a “module” is one of the small squares the code is built from). This border is how a scanner’s software finds the edges of the code in the first place.
Crop the code tight against a logo, text, or the edge of a business card, and the scanner can’t isolate it from the surrounding clutter — the code looks intact but simply won’t trigger a scan. When in doubt, give it more white space, not less.
Contrast: dark code, light background
Scanners look for a strong brightness difference between the modules and the background. Dark modules on a light background is the safe, reliable default.
Avoid:
- Low-contrast color pairs (light gray on white, pastel on pastel).
- Inverted codes (light modules on a dark background) — some scanners handle these fine, but many phone cameras and older scanning apps still fail on them, so it’s a real risk for no real upside.
If you want the code to match a brand color, tint the dark modules — don’t flip which side is dark and which is light.
Error correction: pick the level on purpose
Every QR code is built with one of four error correction levels, each recovering a different share of the code if part of it is damaged, dirty, or covered:
- L — recovers ~7%
- M — recovers ~15%
- Q — recovers ~25%
- H — recovers ~30%
Higher levels pack in more redundant data, which makes the code visually denser (more modules) for the same content. That density is exactly what lets you safely place a logo in the center — the extra redundancy covers the area the logo blocks.
As a default: use M for a plain code, and bump up to H any time you’re adding a logo or expect the printed code to take some wear.
Test on real phones before you print at scale
Simulators and desktop previews don’t catch everything a real camera does — autofocus hunting, glare, low light, a slight tilt. Before you commit to a print run:
- Scan it with the native camera app on a recent iPhone and a recent Android phone (not just a dedicated scanner app).
- Test at the actual size and actual distance it’ll be used from.
- Test under the actual lighting — a code that scans fine under office light can fail under a dim restaurant table lamp or direct sun glare.
A five-minute test on two phones is cheaper than reprinting a few hundred flyers.
Placement and a call to action
Put the code where someone can actually reach it comfortably with a phone — eye level on a poster, flat on a table, not on a curved bottle or behind glass. And label it. A short caption like “Scan me” or “Scan for the menu” tells people what happens next and measurably lifts how often the code gets used at all — an unlabeled square just reads as decoration.
This is exactly the kind of detail that matters for something like a restaurant menu QR code: printed once, sitting on every table, and only useful if guests actually notice it and know to scan.
Use a dynamic code so mistakes aren’t permanent
Even with perfect sizing, contrast, and testing, the destination behind the code will eventually need to change — a new menu, a new landing page, a typo you didn’t catch until after printing. A static code that’s already out in the world can’t be fixed; a dynamic code can, because it points at a redirect link you control instead of the destination itself. See dynamic vs static QR codes for the full comparison.
Dynamic codes also give you something static codes never can: real-time scan analytics, so you know whether the thing you printed is actually being used.
QRkode gives you dynamic, editable codes with real-time scan tracking, custom design and logo placement, and ready-made templates — free to start, no credit card. Create your first code and get the sizing, error correction, and quiet zone handled automatically.
Make a dynamic QR code, free
Editable destination, real-time scan analytics, no credit card.