What I tested
40 QR codes generated using the free QR code generator, then printed on standard 80 gsm office paper and scanned under:
- Direct light (fluorescent office overhead)
- Indirect light (shaded indoor, a meter from a window)
- Low light (dim room, phone flash on)
Devices: iPhone 15 Pro (native camera), Samsung Galaxy S22 (native camera), Google Pixel 7 (Google Lens). Each code was scanned 5 times per lighting condition (15 attempts per code, 600 total scans). A scan "succeeded" if the device recognized and decoded the code in under 3 seconds.
The four error correction levels explained
QR codes have four error correction levels — L, M, Q, H — that determine how much of the code can be damaged or obscured while still decoding:
| Level | Name | Data recovery | Code density impact |
|---|---|---|---|
| L | Low | ~7% of codewords | Smallest, least dense |
| M | Medium | ~15% of codewords | Standard default |
| Q | Quartile | ~25% of codewords | Moderately denser |
| H | High | ~30% of codewords | Most dense, harder to scan small |
Higher error correction adds redundancy modules, which makes the code physically denser (more squares per unit area). This is the tradeoff: better damage resistance at the cost of scan difficulty when printed small.
What the scan rate data showed
Size is the most important variable
Codes smaller than 2 cm × 2 cm failed on 40–60% of scan attempts in indirect light. At 1.5 cm × 1.5 cm, failure rates climbed above 70% in low light even on the Pixel 7, which has excellent computational photography.
The reason: at small sizes, individual QR modules (the black squares) become only 1–2 pixels wide on the phone's camera sensor. The camera's autofocus and image processing struggle to distinguish adjacent modules cleanly — the code looks blurred before the decoder even processes it.
Error correction Level H improved scan rates on damaged codes
For codes tested with simulated damage (a 5mm black marker blot over a random area), Level H codes decoded successfully 91% of the time vs 43% for Level L codes. But for undamaged codes at small sizes (under 2 cm), Level H codes had lower success rates than Level M because the increased density made modules too small.
The implication: Level H is the right choice for print contexts where physical damage is likely (packaging, outdoor signage, labels). It is the wrong choice for small codes on digital screens where damage is not a factor.
Inverted colors fail significantly more often
White-on-dark QR codes (white foreground on a dark background) failed 34% more often than standard black-on-white across all three devices. This is a known limitation of most QR decoders — the Reed-Solomon algorithm expects dark modules on a light background. Some devices corrected for it; the Galaxy S22 showed the largest disparity (42% lower success rate for inverted codes).
The quiet zone is non-negotiable
The quiet zone — the white border around the code — must be at least 4 module widths wide. In every case where I cropped the quiet zone to 1–2 module widths, the iPhone failed to detect the code entirely. The quiet zone is not decorative; it is a required feature of the QR spec that tells the decoder where the code boundary is.
Recommended settings by use case
| Use case | Min print size | Error correction | Color |
|---|---|---|---|
| Website URL (short, clean) | 2.5 cm × 2.5 cm | M | Black on white |
| Business card | 1.5 cm × 1.5 cm | H — high damage risk | Black on white only |
| Restaurant table/wall menu | 5 cm × 5 cm | M | Any high-contrast |
| Packaging or shipping label | 3 cm × 3 cm | H — abrasion/crease risk | Black on white |
| Event poster (viewed from 1 m+) | 8 cm × 8 cm | Q | High contrast only |
| Digital screen / presentation | 180 px × 180 px on screen | L — no damage risk | Flexible (screen renders cleanly) |
| WiFi credentials (guest network) | 4 cm × 4 cm | H — often handled/touched | Black on white |
URL length matters more than most people realize
A 30-character URL encoded at Level M produces a Version 3 QR code (29 × 29 modules). A 200-character URL at Level H produces a Version 15 code (77 × 77 modules). At the same print size, that's 7× more modules per unit area — far harder to scan.
The single most impactful thing you can do for scan reliability on long URLs: shorten the URL before encoding. Going from 150 characters to 30 characters drops the code from Version 12 to Version 3 — smaller, sparser, and significantly more scannable at small print sizes.
Practical conclusions
- Use black on white. Every other color combination reduces scan reliability. If branding requires color, keep the foreground dark and background light — never invert.
- 2.5 cm is the safe minimum for print. Below 2 cm, expect failures in anything other than ideal lighting.
- Match error correction to damage risk, not to "safety." Level H on a digital screen is unnecessary and makes the code denser with no benefit. Level L on packaging is asking for scan failures when the label gets wet or creased.
- Always keep the full quiet zone. Cropping it to save space on a business card is the single fastest way to make your QR code stop working.
- Shorten URLs before encoding. A 30-character URL is always more scannable than a 150-character one, at every size and lighting condition.
Generate and test your QR code with the free QR code generator. To verify what a generated code encodes, use the QR code decoder — upload the PNG or SVG and confirm the output before printing.