A QR code that won't scan is worse than no QR code at all. It wastes print budget, breaks user trust, and silently drops every conversion it was supposed to drive. Three levers control whether a QR code scans reliably every time: error correction level, physical size, and contrast. Get all three right and even a slightly damaged or coloured code scans instantly. Get one wrong and no camera app will recover it for you.

This article covers each lever with specific, actionable numbers — plus a quick checklist at the end you can paste into a print brief. To build and test a code while reading, use the QR Code Generator on this site: it runs entirely in your browser and lets you tune error correction, size, and colours before you export.

Error Correction (L / M / Q / H)

QR codes use Reed-Solomon error correction, which adds structured redundancy to the encoded data. If part of the code is damaged, dirty, or obscured, the decoder can reconstruct the missing information — up to a limit that depends on the error correction level you chose.

There are four levels:

  • L (Low) — ~7% recovery. The smallest, densest code for a given URL. Use only when display space is very tight and the code will always be shown cleanly on a backlit screen.
  • M (Medium) — ~15% recovery. A good default for most digital and print uses. Moderate density, reliable in typical conditions.
  • Q (Quartile) — ~25% recovery. The right choice when a small logo or graphic overlaps the code, or when printing on textured or matte surfaces that may scatter light unevenly.
  • H (High) — ~30% recovery. Maximum redundancy. Use in harsh environments — industrial labels, outdoor signage, product packaging that will be handled roughly. Also required when a large logo is embedded in the centre of the code.

The trade-off is density: higher correction means more modules for the same data, which means a denser code that requires more physical size and contrast to scan reliably. Stepping from M to H for the same URL increases the total module count by roughly 80%, so the code gets visually busier. That is the right trade when a logo overlaps or the environment is punishing. It is the wrong trade on a business card with a long URL and no logo — M gives you a cleaner, more scannable code.

Horizontal bar chart comparing QR error correction levels: L recovers about 7 percent of damaged data, M about 15 percent, Q about 25 percent, H about 30 percent. Higher correction adds redundancy but a denser code.
Error correction levels L/M/Q/H and the maximum share of damaged modules each can recover.

If you plan to embed a logo, keep it under 10–15% of the total code area at level Q, or under 20–25% at level H. Larger logos exceed what Reed-Solomon can recover even at maximum redundancy.

Size and Scan Distance

The physical size of a QR code determines how many pixels a scanner camera can allocate to each module (the individual black and white squares). If a module is smaller than the camera's resolution at the scanning distance, the decoder cannot distinguish modules from each other and the read fails.

The classic rule of thumb is:

Minimum code width ≈ scanning distance ÷ 10

At a 30 cm phone-in-hand distance, that gives 3 cm minimum. In practice, most sources cite 2 cm as an absolute floor for phone-reading at arm's length — but 3 cm is safer and leaves margin for non-ideal angles and lighting. For print applications:

  • Business card / small flyer: 2–3 cm. Keep the URL short and error correction at M.
  • A4 poster: 4–6 cm minimum; 8–10 cm is comfortable for a reader who won't walk right up to it.
  • Retail shelf tag: 2–3 cm, but test at realistic shelf distance (30–60 cm) before mass printing.
  • Billboard or large signage at 5 m: 50 cm minimum per the 1:10 rule. These codes need high contrast and level M or Q.

URL length matters here too. Every additional character in the URL pushes the QR to a higher "version" — a denser grid with more modules. A version 1 code (the simplest) is 21×21 modules; a version 40 code (maximum data) is 177×177. More modules at the same physical size means smaller modules, which need better resolution to read. Shortening your URL is the single easiest way to get a smaller, cleaner, more scannable code. If your destination URL is long, use a URL shortener or a custom short domain — the static vs dynamic QR codes article covers how dynamic codes solve this by encoding a fixed short redirect rather than the final URL.

The Quiet Zone

The quiet zone is the blank white border that surrounds every QR code. It is not decorative — it is required. QR decoders use it to locate and orient the code within the camera frame. The standard specifies a minimum of 4 modules of empty space on all four sides.

On a 3 cm code with 29 modules (version 3), four modules equals about 4 mm. That is not a lot of space. When codes are placed in designs, the quiet zone is often cropped, bled, or covered by background imagery — and that is one of the most common reasons a code fails to scan in print.

A simple rule for briefs: add a white margin equal to at least 10% of the code's total width on each side, and never let any design element intrude into it. If the code sits on a coloured background, include the quiet zone as white within the code's bounding box, not as background colour — scanners expect white, not a brand colour.

Contrast and Colour

QR decoders are optimized for dark modules on a light background. This is not an arbitrary convention: scanner algorithms use thresholding to classify each module as "dark" or "light", and the threshold is calibrated for near-black on near-white. Specific rules:

  • Never invert the code. Light modules on a dark background fail on many consumer camera apps and iOS's native QR reader. The finder patterns (the three corner squares) are particularly sensitive to inversion.
  • Maintain high contrast. The ISO/IEC 18004 standard recommends a minimum print contrast of 70% (reflectance difference between dark and light modules). In practice, stay close to black-on-white; if you must use brand colours, keep the foreground dark enough that it reads as near-black in dim light and on aged print.
  • Avoid pastel-on-pastel combinations. Dark blue on dark green, or light yellow on white, are common design errors. Desaturate the code in image editing software and confirm it still reads as high-contrast greyscale.
  • Coloured codes work — with caution. Dark red, dark blue, or dark green modules on a white background are generally fine. The background can be a light tint. What fails is any combination where the reflectance difference shrinks below roughly 50%.

If you use a coloured QR code, always test it — not just in a well-lit studio, but in the ambient light where it will actually be used (a dim restaurant, a bright trade show floor, a warehouse under fluorescent lights). The same code can scan easily in one environment and fail completely in another.

Data Length: Why Short URLs Matter

Every character encoded in a QR code adds modules to the grid. Numeric-only content packs in most efficiently (up to ~3 digits per module), then alphanumeric (URLs in uppercase), then full byte encoding (mixed-case URLs). Most destination URLs use byte encoding, which is the least efficient mode.

A 20-character URL at level M fits in a version 2 code (25×25 modules). A 100-character URL at the same level requires a version 9 code (53×53 modules) — more than four times the module count printed at the same physical size, meaning each module is less than a quarter as large. That directly reduces scannability at any given print size.

Practical advice: before generating a code for print, run the actual destination URL through a shortener and compare the resulting code sizes. If the code drops from version 9 to version 2, you have a meaningfully more reliable code — and you can print it smaller, or use the saved space for a logo without blowing past the error-correction budget.

For codes that need to be updatable without reprinting, a dynamic QR code always encodes a short fixed-length redirect URL regardless of how long your actual destination is — keeping the code at a low, dense-friendly version.

Test Before You Print

This cannot be stated strongly enough: always test a QR code at its actual printed size before committing to a print run. Reprinting is expensive. Testing is free.

A practical test protocol:

  1. Export the code at the intended physical size (not screen size) and print one copy.
  2. Scan with at least two different phones — Android and iOS behave differently, especially for coloured or low-contrast codes.
  3. Test in the real lighting conditions: hold the phone at the actual reading distance, in the ambient light of the deployment location.
  4. Scan at a slight angle (15–30°) — a code that only works head-on will fail for most real-world users.
  5. If it fails any of those tests, diagnose with the checklist below before reprinting at all.

For quick digital testing before print, the QR Code Generator lets you preview and scan from the screen directly — useful for confirming the URL is correct and the code decodes, but not a substitute for a printed test at final size.

Want to know more about who can read your QR data and whether tracking is involved? See QR codes without signup or tracking.

Quick Checklist

  • Error correction level: M for most uses, Q or H if a logo overlaps or surface is rough
  • Physical size: minimum 2–3 cm for phone-in-hand; apply the 1:10 rule for longer distances
  • Quiet zone: at least 4 modules of white space on all four sides — never crop it
  • Contrast: dark foreground on light background; no inverted codes
  • URL length: shorten the destination URL to reduce module density
  • Logo size: under 15% of total code area at level Q, under 25% at level H
  • Test: two phones, real lighting, actual print size, at a slight angle

Frequently Asked Questions

Which error correction level should I use?

Use M (15% recovery) for most digital and print applications — it balances density with reliability. Step up to Q (25%) or H (30%) when a logo or graphic overlaps the code, or when the code will be printed in a rough environment like a warehouse, outdoor sign, or product label that may get scratched. Use L (7%) only when data capacity is extremely tight and the code will always appear cleanly on a backlit screen.

What's the smallest a QR code can be?

For a phone held at roughly 30 cm, aim for a minimum printed width of 2 cm (about 0.8 inches). For greater distances, apply the 1:10 rule — the code should be at least 1/10th as wide as the maximum scanning distance. These are minimums; more space always helps, especially when the URL is long and the QR version is high.

Why won't my QR code scan?

The most common causes:

  • The quiet zone is missing or too narrow — scanners need at least 4 modules on every side
  • Contrast is too low — avoid any light-on-dark or pastel-on-pastel combination
  • The code is physically too small for the scanning distance
  • A logo overlay is too large for the error correction level in use
  • The URL is very long, creating a high-version code that needs more physical size

Test at actual print size with at least two different phones in the real lighting before diagnosing further — many "broken" codes scan fine once printed correctly.