QR error correction: what L, M, Q and H really buy you
Every QR code carries spare data that lets a scanner reconstruct modules that are dirty, damaged, or deliberately overwritten by a logo. That spare capacity comes in four levels — and picking the right one is the difference between a code that survives a scratched laminate and one that dies, or between a logo that fits and a code that got needlessly huge.
The four levels
- L (Low) — recovers up to ~7% of codewords. Smallest code for a given content.
- M (Medium) — ~15%. The default of most generators, and the right call for most clean prints.
- Q (Quartile) — ~25%. For codes that take abuse: outdoor, packaging, textured paper.
- H (High) — ~30%. Required headroom for center logos and pixel art drawn inside the code.
The mechanism is Reed–Solomon coding — the same math CDs and satellite links use. The percentages are of codewords (data bytes), which is roughly but not exactly a percentage of visual area: damage concentrated in one spot is worse than the same damage scattered.
What error correction can and cannot fix
- Fixes: scratches, dirt, folds through the data area, a logo covering the middle, art overwriting scattered modules, small print defects.
- Cannot fix: damage to the three corner finder squares (the code won't even be detected), a cropped quiet zone, low contrast, blur. No level compensates for printing too small.
The trade-off people miss
Higher levels aren't free: redundancy is extra data, so the code needs more modules. Jumping from L to H can push a long URL from version 4 (33×33) to version 6 (41×41) — smaller modules at the same print size, which itself hurts scannability. Two practical consequences:
- If you don't cover the code with art and it lives indoors on clean paper — M beats H. The bigger modules do more for reliability than the extra redundancy.
- If your content is long and you need H (logo on a packaging code), shorten the URL first. Every character you remove pays for redundancy you actually want.
Which level for which job
- Screen display, email signature → L or M (nothing will damage a pixel-perfect code).
- Business cards, flyers, menus (clean indoor print) → M.
- Outdoor posters, shop windows, laminated cards → Q.
- Packaging, kraft/textured stock, curved surfaces → Q or H.
- Any code with a logo, picture or pixel art inside → H, always. The artwork spends the correction budget; you need the full 30% to start with. (This is why HonestQR forces H for pixel-art codes and machine-verifies every render.)
How much logo can level H afford?
A center logo overwrites modules in one concentrated block — the worst case for Reed–Solomon. Keep the logo to ~20% of the code's area at most even at level H, leaving margin for real-world damage on top of the logo. Good generators enforce this; ours also runs a live decode check so you see immediately if a design crossed the line.
Set it in practice
- In the free generator, error correction sits in the advanced options — L/M/Q/H.
- Adding a logo or pixel art? The generator switches to H automatically and verifies the result decodes.
- Printing on difficult material? Pick Q/H manually, and print a proof.
FAQ
Does higher error correction make scanning faster? No — an undamaged M code and H code scan equally fast. The level only matters when modules are lost.
Can I change the level after printing? No — it's encoded in the format information of the printed code. Reprint to change it.
Which level do dynamic codes use? Same choices — static vs. dynamic is about what's encoded, not how it's protected. Dynamic codes encode short URLs, so they can afford H cheaply.
Is 30% damage a guarantee? It's an upper bound under ideal conditions and scattered damage. Treat H as "robust", not "indestructible" — and never sacrifice the quiet zone or finder corners.
Generate a free QR code that never expires
No signup. No subscription. Generated in your browser.
Open the free generator →