QR Code Error Correction
The four error-correction levels explained, with guidance on when each makes sense and why logos need the highest.
On this page
What error correction does
QR codes use Reed–Solomon error correction to rebuild data that's damaged or obscured. The more correction you add, the more damage the code tolerates — but the more modules it needs, making the code denser.
The four levels
| Level | Recovery | Best for |
|---|---|---|
| L | ~7% | Clean digital display, maximum capacity |
| M | ~15% | General use (default) |
| Q | ~25% | Printing in busy or industrial settings |
| H | ~30% | Codes with a logo or likely wear |
Why logos need level H
Placing a logo over the center of a code destroys some modules. Level H can recover about 30% of the data, which is usually enough to keep a modestly sized centered logo readable. Always verify a logo code before printing.
The capacity trade-off
Higher correction means fewer modules are available for your actual content, so the code either holds less data or grows larger and denser. If your data is long, a lower level keeps the code scannable; if durability matters more, raise the level and accept a bigger code.
Choosing a level
Use M for most on-screen and clean-print uses, Q for signage exposed to wear, and H whenever you add a logo or expect scratches, folds or smudges.
Choosing a level: the table
The four levels are defined in ISO/IEC 18004. Each buys damage tolerance by spending capacity — the same symbol size holds less data at a higher level, or grows to hold the same data.
| Level | Recoverable | Capacity cost | Choose it for |
|---|---|---|---|
| L Low | ~7% | Smallest symbol | Screens, clean digital use, very long payloads that will not fit otherwise |
| M Medium | ~15% | Slightly larger | Most print. The sensible default for a poster or a flyer |
| Q Quartile | ~25% | Noticeably larger | Labels that get handled, packaging, anything outdoors |
| H High | ~30% | Largest | A logo in the middle, industrial surfaces, small print runs where a failure is expensive |
The trade is not free in either direction. Raising L to H on the same content can push the symbol to a higher version with more, smaller modules — so a code that is more damage-tolerant in theory can be less readable in practice if it is printed at the same physical size. If you raise the level, check the module size has not fallen below what your print process holds.
A worked example
A 60-character URL at level M produces a version 4 symbol: 33 × 33 modules. The same URL at level H needs version 6: 41 × 41 modules — 24% more modules across the same width if the printed size does not change.
Printed at 30 mm, the M version has 0.91 mm modules and the H version 0.73 mm. At 300 dpi both are fine. On a 203 dpi thermal printer, 0.73 mm is 5.9 dots against 7.4 — still workable, but the margin has shrunk by a fifth. Print the same code at 20 mm and the H version's modules fall to 0.49 mm, under 4 dots, and the extra error correction is now paying for damage the printer itself is causing.
The rule that follows: raise error correction and physical size together, or not at all.
What error correction cannot fix
- A missing quiet zone. The decoder never finds the symbol, so there is nothing to correct.
- Damage to the finder patterns — the three corner squares — or the timing patterns between them. These locate and calibrate the grid before error correction runs.
- Poor contrast. If modules cannot be told apart, the decoder is not reading damaged data, it is reading no data.
- Modules too small for the camera. Below roughly 0.4 mm a phone camera cannot resolve them at all.
- Damage above the level's budget. At H, past about 30% the symbol simply fails — there is no graceful degradation.
Check your own settings against this in the generator: change the level and watch the module count and the scan-reliability rating move together.
Written and maintained by the QRBarcodeTools Editorial Team · Last reviewed 2026-08-12 · How we write and check these guides