
QR Code Error Correction Explained: Choosing the Right Level for Print
QR codes support four error-correction levels — L (~7% damage tolerance), M (~15%), Q (~25%), and H (~30%) — and level H is the right default for anything printed, since it's specifically calibrated to absorb ink bleed, scratches, and lamination glare that a screen-only code never faces. Every QR code carries more data than it strictly needs to encode its destination; that extra redundancy is what lets a scanner reconstruct the correct result even when part of the code is damaged or obscured.
What error correction actually does
QR codes use a method called Reed-Solomon error correction, the same general family of error correction used in things like CDs and satellite communication. In practical terms: the code encodes your data along with extra redundant information, structured so that a scanner can still calculate the correct result even if a meaningful portion of the pattern is missing, smudged, or covered — a logo placed in the center, a scratch, a spot of ink bleed.
The amount of redundancy is configurable, and more redundancy means more tolerance for damage — at the cost of a denser, more visually complex pattern, since encoding the same data plus more redundancy requires more modules.
The four standard levels
QR codes support four standard error correction levels, each named with a letter:
- L (Low) — roughly 7% of the code can be damaged and still scan correctly.
- M (Medium) — roughly 15% tolerance.
- Q (Quartile) — roughly 25% tolerance.
- H (High) — roughly 30% tolerance, the maximum standard level.
Each step up trades a denser pattern (more small modules packed into the same physical size) for a meaningfully higher tolerance for real-world damage. For a code that will only ever be viewed on a screen — displayed in a slide deck, shown in an email — a lower level is perfectly adequate, since there's no ink bleed, scratching, or lamination glare to plan around.
Why level H is the right default for print
Anything that gets physically printed is exposed to a category of damage a screen-only code never faces: ink bleed on absorbent paper stock, minor scratches from handling, dust or grime accumulating over the weeks or months a poster or sign stays up, glare from lamination under uneven lighting. Level H's roughly 30% tolerance is specifically calibrated to absorb that kind of real-world wear without the code failing.
This is why our generator defaults to level H for every export rather than asking users to choose — for the overwhelming majority of use cases (business cards, menus, packaging, signage, invitations), the modest increase in pattern density is a trivial cost against the real benefit of a code that keeps working after weeks in someone's wallet or months on an outdoor sign.
When a lower level might make sense
There are narrow cases where a lower level is a reasonable, deliberate choice rather than an oversight. If a QR code needs to encode an unusually long URL (rather than a short link) and physical space is extremely constrained — a tiny product label, for instance — a lower error correction level keeps the pattern simpler and easier for a camera to resolve at very small sizes, trading damage tolerance for base scannability at that scale.
In practice, this trade-off matters most at the extreme end of "very small and very long URL" simultaneously. For the vast majority of cases — a normal-length link at a normal print size — level H remains the safer default with no meaningful downside.
How this interacts with adding a logo
A common design request is placing a logo in the center of a QR code. This works precisely because of error correction: a scanner can reconstruct the covered portion using the redundant data encoded elsewhere in the pattern, as long as the logo doesn't cover more of the code than the chosen error correction level can tolerate. Level H's roughly 30% headroom is what makes a reasonably sized center logo viable at all — at a lower level, the same logo placement risks pushing the damaged area past what the code can recover from.
Putting this into practice
If you're printing QR codes for packaging, signage or anything that needs to survive real handling, our guide on why QR codes fail after printing covers the other side of this — resolution and contrast — alongside error correction as one part of a print-ready workflow.
Every code from this generator uses level H by default, so this isn't a setting you need to configure — it's simply how the generator behaves out of the box, matched to what holds up best under real-world print conditions.
The four levels at a glance
| Level | Damage tolerance | Best for |
|---|---|---|
| L (Low) | ~7% | Screen-only codes with no print exposure |
| M (Medium) | ~15% | Light digital/print mix, minimal handling |
| Q (Quartile) | ~25% | Print with moderate handling risk |
| H (High) | ~30% | Any printed code, especially with a center logo |
Quick answers
What error correction level should I use for a printed QR code? Level H (~30% tolerance) — it's specifically calibrated to absorb ink bleed, scratches, and lamination glare that only affect printed codes, not ones only ever viewed on a screen.
Does a higher error correction level make a QR code harder to scan? No, but it does make the pattern denser (more, smaller modules), which can matter at very small print sizes with unusually long URLs — a narrow edge case, not a general concern.
Why does adding a logo require a higher error correction level? A logo covers part of the code's surface, and the scanner reconstructs that covered area using the redundant error-correction data. Level H's ~30% headroom is what makes a reasonably sized center logo viable without breaking the scan.
Is level H always the safest choice, even for screen-only codes? It's never wrong, but it's not necessary — a lower level is perfectly adequate for a code that will only ever be displayed on a screen, since there's no ink bleed or physical wear to plan around.