Developer
How QR Code Error Correction Works
A QR code can lose a real chunk of itself and still scan — here's the mechanism that makes that possible, and the trade-off it costs.
Published by UseKitl · Last reviewed 7 September 2026
A QR code printed on a shipping label, a menu or a poster gets scuffed, curled, partially covered or badly lit. Despite that, it usually still scans. That resilience is not luck — it's built into the symbol format itself, using the same category of error-correcting code used in CDs and satellite communication, deliberately added on top of the data so a damaged copy can still be reconstructed exactly.
How the redundancy works
Before the data is arranged into the familiar grid of modules, the encoder runs it through Reed–Solomon error correction — a scheme that adds carefully calculated redundant codewords alongside the actual data. A scanner reading a damaged symbol doesn't need every module intact; it needs enough of the mathematical structure to reconstruct what should have been there, similarly to how a damaged sentence with enough context can still be read correctly even with a few letters missing.
The four error correction levels
| Level | Approx. damage tolerated | Typical use |
|---|---|---|
| L (Low) | ~7% | Clean digital display, maximum data capacity |
| M (Medium) | ~15% | General-purpose default, most print use |
| Q (Quartile) | ~25% | Labels and packaging exposed to wear |
| H (High) | ~30% | Small codes, or codes with a logo overlaid in the centre |
Redundancy isn't free — it uses space inside the symbol that could otherwise hold data, so higher error correction produces a denser symbol for the same content. Encoding the same 40-character URL at level M produces a smaller symbol than encoding it at level H, purely because H has to reserve more of the grid for redundancy rather than data. That is the entire trade-off in one sentence: more damage tolerance costs more density.
Version and size
A QR symbol's "version" determines its grid size — version 1 is 21×21 modules, and each version up adds 4 modules per side, up to version 40. The encoder picks the smallest version that fits the data at the chosen error-correction level, which is why the same content can produce a noticeably different physical symbol depending only on which level you select. Shorter content and lower error correction both push the version down; longer content or higher error correction both push it up.
Choosing a level for where the code will live
- On a screen, in an email, or anywhere the image file itself won't degrade: level L is fine and keeps the symbol as simple (and fast to scan) as possible.
- General print use — flyers, posters, business cards: level M is a sensible default and is what most generators, including this site's, use unless told otherwise.
- Anything that will be handled, creased, exposed to weather, or printed small: level Q or H is worth the density cost.
- A code with a logo placed over the centre needs level H (or a generator that explicitly accounts for the covered area) — the logo is, functionally, deliberate damage.
Testing a QR code before it goes to print
- Scan it at the actual physical size it will be printed at, not zoomed in on a screen — small, dense symbols are the ones that fail in the field.
- Check contrast: QR readers rely on a clear light/dark distinction, and low-contrast colour schemes are a common cause of scan failures that testing on a bright monitor won't reveal.
- Preserve the quiet zone — the blank margin around the symbol, four modules wide per the specification. Cropping it tight to the artwork is one of the most common causes of an otherwise-correct code failing to scan.
- If printing small or on a curved or textured surface, test at level Q or H rather than assuming the default level will hold up.
PNG vs SVG for the exported file
Download PNG for on-screen use — it's a fixed-resolution raster image, which is exactly what most digital placements need. Download SVG for anything that will be printed or resized, because it's a vector format that scales to any physical size without softening the module edges — soft edges at large print sizes are a common, avoidable cause of a code that scans fine on a monitor but fails on a poster.
Limitations
- Very long input produces dense symbols regardless of error-correction level — for a lot of content, a shortened URL or a smaller payload is a better fix than raising the error correction.
- A QR code is static once printed. The destination can't be changed and there's no built-in scan tracking.
- Error correction tolerates physical damage; it does not tolerate low contrast, inverted colours or heavy stylistic overlay, all of which break scanning on many readers regardless of the level chosen.
Sources
- ISO/IEC 18004 — QR Code bar code symbology specification — the base specification the encoder follows; no free public copy exists (ISO standards are sold, not published openly), so it is cited by name rather than a guessed URL
Found an error or something outdated in this guide? Report a correction.