I printed 500 event flyers with a QR code that linked to the registration page. On the day, half the attendees could not scan it β the code was too small and printed over a light gray background. The scan failure rate was over 40%. I reprinted them the next day with a white box behind the code. Scan rate hit 98%. The difference was three specific parameters I had ignored.
Generate QR codes locally β no upload, no tracking.
Set error correction level, size, and color. Your URLs stay in your browser.
Open QR Code Generator βHow QR Codes Actually Work
A QR code encodes data as a grid of dark and light squares called βmodules.β The scanner maps the contrast pattern across the grid to reconstruct the original data. Three square finder patterns in the corners tell the scanner where the grid starts, ends, and which way it is oriented.
The data is encoded using Reed-Solomon error correction β the same algorithm used in CDs and DVDs. This is what allows a partially obscured or damaged QR code to still scan correctly. The amount of redundancy built into the code is controlled by the error correction level you choose at generation time.
Error Correction Levels
The ISO/IEC 18004 QR Code standard defines four error correction levels. Higher correction means more redundant data encoded in the grid β which means a larger, denser code for the same payload.
| Level | Data Recovery | Code Density | Best For |
|---|---|---|---|
| L β Low | 7% | Smallest | Clean digital displays, controlled environments |
| M β Medium | 15% | Moderate | Standard printed flyers, business cards |
| Q β Quartile | 25% | Dense | Industrial environments, product packaging |
| H β High β | 30% | Most dense | Logo overlays, outdoor signage, damaged surfaces |
For most use cases, Level M is the right default. Use Level H specifically when you are overlaying a logo in the center of the code β the logo obscures modules, and Level H's 30% redundancy provides enough buffer to reconstruct the obscured data.
Contrast: The Most Commonly Ignored Parameter
Camera scanners β whether a phone camera or a dedicated barcode reader β use contrast detection to identify module boundaries. If the contrast between dark and light modules is too low, the scanner cannot distinguish where one module ends and another begins.
ISO/IEC 18004 requires a minimum 4:1 contrast ratio. In practical terms:
| Color Combination | Approx. Contrast Ratio | Will It Scan? |
|---|---|---|
| Black on white | 21:1 | Yes β ideal |
| Dark navy on white | ~15:1 | Yes |
| Dark gray (#555) on white | ~5.7:1 | Usually β test first |
| Medium gray (#888) on white | ~3.5:1 | Unreliable β fail likely |
| Black on dark background | Varies | Will fail |
| White on black (inverted) | 21:1 | Depends on scanner firmware |
Inverted QR codes (white modules on black background) have the right contrast ratio but some older scanner firmware does not handle the inversion correctly. Test on three different phones before using inverted codes in production.
Module Size and Minimum Physical Dimensions
Each dark or light square in the grid is called a module. The minimum module size a scanner can resolve depends on the camera resolution and distance. ISO/IEC 18004 defines the minimum module size as 0.25mm β but that assumes ideal optics at close range.
For real-world print use, the practical minimum physical size is 2.5cm Γ 2.5cmfor a short URL encoded at Level M. Below that, budget Android phones (with 5MP cameras) struggle at typical scanning distances of 15β20cm.
For outdoor signage scanned from 1β2 metres away, the code needs to be at least 8β10cm Γ 8β10cm. Scale up proportionally for greater distances.
The Quiet Zone β Often Stripped by Designers
A QR code requires a quiet zone β a blank white border around the entire code β of at least 4 module widths. Scanners use this margin to locate the finder patterns. If text or imagery runs too close to the edge of the code, the scanner may fail to find the boundary.
This is the most common design error I see in branded QR codes: a designer clips the quiet zone to make the code fit a layout. When the code goes to print, it fails. Always maintain the quiet zone. If space is tight, reduce the payload (use a URL shortener) rather than shrinking the quiet zone.
Why Your QR Code Fails β Common Causes
Logo Overlay Without Level H
Adding a logo to the center of a QR code is common in brand design. The center of a QR code carries real data β the logo obscures those modules. If you use Level L or Level M error correction, you may have obscured more data than the code can recover.
Rule: if you add a logo overlay, use Level H. Limit the logo to no more than 25β30% of the total code area. Test on five different phones.
Long URLs Create Dense, Hard-to-Scan Codes
The longer the URL, the more modules the code needs. More modules means smaller individual modules at the same physical size. A URL with tracking parameters 70 characters long creates a much denser code than a 25-character short URL.
# These encode to very different QR complexity levels: # Short (14 chars) β small, low-density code https://filemint.dev # Long with tracking (98 chars) β dense, harder to scan at small sizes https://filemint.dev/tools/qr-generator?utm_source=flyer&utm_medium=print&utm_campaign=event_2026 # Solution: use a URL shortener for print QR codes # This keeps the code sparse even at small physical sizes
Print Color Shift
Digital proof looks fine. The printed piece fails to scan. This happens when the printer's CMYK profile shifts the dark modules to a lighter tone β a common issue with budget printing services using low-ink settings. Request a print proof before the full run. Test the proof with three phones before signing off.
Lamination and Gloss Cause Glare
Glossy laminate reflects light directly into the camera, washing out the contrast between modules. Matte laminate or no laminate is safer for QR codes on printed materials. If gloss is required for the overall design, test scanning at different angles β the user will naturally tilt to find a glare-free angle, so this may be acceptable.
Before You Print: A Practical Checklist
- βError correction: Level M for standard print. Level H if adding a logo.
- βMinimum size: 2.5cm Γ 2.5cm for hand-held scanning. 8cm+ for wall signage.
- βContrast: At least 4:1 ratio. Black on white is always safe.
- βQuiet zone: 4 module widths of clear space around all edges.
- βURL length: Use a short URL. Under 30 characters produces a much sparser code.
- βTest devices: Test on a budget Android (not just your iPhone). Cheap cameras are the constraint.
- βPrint proof: Get a physical proof before a full run and test the proof in the intended lighting conditions.
If you are building QR codes programmatically for a web app, see our UUID versions guide for generating unique, non-guessable identifiers for each QR destination URL β a pattern that prevents destination enumeration attacks. For the broader set of browser-based developer tools we use at FileMint, our client-side tools guide explains why every tool on this site runs without a server.
Generate QR codes locally.
Set error correction level, custom colors, and size. Generated in your browser β no server, no tracking.
Open QR Code Generator β