Everyone wants their QR code smaller. Product designers want it off the packaging. Print shops want it out of the bleed area. Marketers want it subtle. The answer is almost always the same: you can go smaller than you think, but smaller than the formula allows and nothing scans.
Here is the rule I'd actually tattoo on a designer's arm:
Minimum QR size = scan distance ÷ 10.
A QR code that will be scanned from 30cm away (a person holding a phone at reading distance) needs to be at least 3cm on each side. A QR code on a billboard scanned from 10 meters away needs to be at least 1 meter. That's the working ratio, and it's conservative enough to survive real-world conditions - a slightly dirty scanner lens, an angled scan, a hand that's not quite steady.
The real formula, if you want it
The scannable limit of a QR code is a function of the module size - the width of one of the little squares. Camera scanners need each module to project onto at least 3 pixels in the captured image. So:
minimum module size (mm) = scan distance (mm) × 0.001
A 40-module-wide QR code (Version 6) at 0.4mm per module is 16mm square. At 400mm scan distance that works. At 1 meter it doesn't.
That's where the 10:1 rule comes from. It's module-size math, wrapped in a conservative buffer for real-world conditions, simplified into something you can explain in a design review.
How much data you're encoding changes everything
A QR code with 20 characters uses a much smaller grid (Version 1, 21x21 modules) than a QR code with 300 characters (Version 15, 77x77 modules). At the same physical size, the 300-character code has modules that are nearly 4x smaller, which means it needs 4x the camera resolution to read.
| QR Version | Module grid | Numeric capacity (max) | Alphanumeric capacity (max) | Min size at reading distance (300mm) |
|---|---|---|---|---|
| 1 | 21 x 21 | 41 | 25 | ~15mm |
| 3 | 29 x 29 | 127 | 77 | ~20mm |
| 6 | 41 x 41 | 322 | 195 | ~28mm |
| 10 | 57 x 57 | 652 | 395 | ~38mm |
| 15 | 77 x 77 | 1250 | 758 | ~50mm |
The lesson: shorten your URL before you shrink your QR code. A 30-character bit.ly link generates a Version 2 code (25x25 modules). A 90-character tracking URL generates a Version 5 (37x37). Shorter URL = smaller grid = smaller printable size for the same scan distance. Use a URL shortener, strip UTM parameters, or route through a redirect.
Error correction is a size lever
QR codes have four error correction levels - L (7%), M (15%), Q (25%), H (30%). Higher correction means the code can recover from more damage but also needs more modules, which means a bigger grid for the same data.
- L (7%) - indoor, controlled environments, clean labels, no wear. Smallest code for the data.
- M (15%) - the sensible default. Tolerates minor smudging and printing variance.
- Q (25%) - outdoor signage, environments with wear, any code you expect to get dirty.
- H (30%) - codes with a logo overlaid in the center (the logo is treated as damage the correction absorbs), restaurants, food packaging, industrial labels.
If you want a smaller code and you're printing indoor and clean, drop to L. If you're putting a QR code on a coffee truck that's going to get hit by rain, use Q or H and size accordingly. Our QR code generator lets you pick the correction level explicitly - don't accept the default without thinking about where the code will live.
The quiet zone nobody respects
A QR code needs 4 modules of blank space on all four sides. This is non-negotiable and designers violate it constantly. A 25mm QR code with a 1mm module needs 4mm of clear space on each side - which means the printable area isn't 25mm, it's 33mm.
The quiet zone must be blank. Not a faint gradient, not a pattern at low opacity, not the edge of a photograph, not another graphic element encroaching from the side. Every smartphone scanner in the last decade tolerates some violation, but rejecting 5% of your scans because the quiet zone touches a product photo on the left side is an own goal.
The realistic minimums I use
Short URL, good lighting, held at reading distance: 20mm x 20mm is the floor. Below that and even a shortened URL starts to fail for 10-15% of scans because phone cameras struggle with the sub-pixel resolution and autofocus hunting.
For printed marketing materials (flyers, business cards, menus): 25mm minimum, 30mm preferred.
For retail packaging scanned at a checkout: 20mm minimum, and use EAN-13 for the actual SKU. QR codes aren't meant to be the POS scan - they're for consumer engagement.
For shipping labels scanned from 50-100cm with a dedicated scanner: 40mm minimum.
For posters and signage scanned from 2+ meters: 200mm minimum, and please test it from the actual viewing distance before you print 500 copies.
The mistake I see most
A marketing team asks a designer to put a QR code on the back of a 3.5" x 2" business card. The designer, trying to preserve whitespace, sizes it at 12mm. It encodes a 100-character URL with UTM tracking at error correction level H (because the brand guide says add a logo overlay). It generates a Version 6 grid at ~0.3mm per module. In fluorescent office light with a steady hand, it scans. At a trade show under a colored spotlight, held by someone in conversation, it scans maybe 30% of the time.
The fix: shorten the URL (drop to Version 2), skip the logo overlay (drop to level M), and size up to 22mm. Same amount of information. 3x the real-world scan reliability.
Generate it right the first time
Use the QR code generator - it exposes error correction level, module size, and quiet zone explicitly so you can dial the code to its real use case. For batch runs (menu QRs per table, serial-numbered asset tags, personalized marketing codes), the QR batch generator takes a CSV of URLs and outputs one PDF per code or a single print sheet.
And if you're putting QR codes on anything industrial, read QR vs Data Matrix first. For small-format industrial marking, Data Matrix is usually the right call and QR is the wrong one.