What does error correction actually do?
It lets a damaged code still decode. When a QR code is generated, the encoder adds redundant data alongside your content using Reed–Solomon coding — the same family of mathematics used on CDs and in deep-space telemetry. If part of the symbol is scratched, smudged, covered or misprinted, the scanner reconstructs the missing data from the redundancy.
That redundancy is why a QR code can carry a logo in the middle, survive a coffee ring, and still work on a label that has been outdoors for two winters.
It is also why the level you choose is a real engineering decision rather than a “higher is safer” slider — which is what most of this page is about.
The four levels, and what the percentages mean
ISO/IEC 18004 defines four levels. The level is encoded into the symbol itself, in the format information beside the finder patterns, so a scanner knows which level to decode against before it reads any data.
| Level | Recovery capacity | Use when |
|---|---|---|
| L — Low | ~7% of codewords | Clean digital display, space is tight, nothing will obscure it |
| M — Medium | ~15% of codewords | The sensible default for most print work |
| Q — Quartile | ~25% of codewords | Industrial labels, dirty environments, a small logo |
| H — High | ~30% of codewords | A centre logo, or outdoor signage that will weather |
7 / 15 / 25 / 30%
Recovery capacity for levels L, M, Q and H. ISO/IEC 18004 Table 8 states these as approximate percentages of total codewords — Denso Wave footnotes the same figures as a “data restoration rate for total codewords”.
Why codewords, not area, is the catch
The percentages count codewords, not picture area — and the difference matters the moment you put something on top of a code.
A codeword is a block of eight modules’ worth of data. The symbol is a sequence of them, and error correction can repair a certain number per symbol. Two consequences follow:
- One flipped module corrupts a whole codeword. A single module read as light when it should be dark does not cost you one module of budget; it costs the entire codeword that module belonged to.
- A misread costs double. The standard is explicit that an error whose location the decoder does not know — a substitution rather than a known erasure — requires two error correction codewords to correct, not one.
What higher correction costs you
Redundant data is still data. It occupies the grid, so raising the level grows the symbol — and at a fixed printed size, a bigger grid means smaller modules.
That is the trap: higher error correction can make a small code scan worse. You have bought the ability to recover from damage that is not occurring, and paid for it in module size, which is the variable that actually decides whether a camera can read the code at all.
| Level for a 100-character URL | Grid | Module size at 3 cm |
|---|---|---|
| L — Low | 37 × 37 | 0.81 mm |
| M — Medium | 41 × 41 | 0.73 mm |
| Q — Quartile | 45 × 45 | 0.67 mm |
| H — High | 53 × 53 | 0.57 mm |
Across the whole range that is a 30% reduction in module width for redundancy you may never use. On a 3 cm business card code it is survivable; on a 2 cm label it is the difference between working and not. The sizing guide covers where those thresholds sit.
Which level should you choose?
Match the level to the damage you actually expect:
- M for most print work. Posters, flyers, menus, business cards, packaging. It is the default for a reason.
- H when a logo sits on the code. You are deliberately destroying part of the symbol, so you need the budget. Print the code larger to compensate for the denser grid.
- Q or H outdoors and in industrial settings. Sun fade, dirt, scuffing and partial occlusion are real there, and the code is usually large enough to absorb the extra density.
- L only on a clean screen where you control the rendering and space is genuinely tight.
One rule overrides all of the above: if raising the level pushes your modules below about 0.4 mm at the printed size, you have made the code worse. Enlarge the print or shorten the content instead.
Next: adding a logo without breaking the scan, which is where this budget actually gets spent, and the print guide for everything else that decides whether a code survives contact with paper.