Guide
QR error correction: what L, M, Q and H actually do
Reed-Solomon without the math, the density cost nobody mentions, and honest defaults per use case.
Last reviewed 2026-06-11
Every QR code carries spare data that lets a scanner rebuild damaged or hidden modules. How much spare data is the error correction level: L, M, Q or H. It's the setting people change last and blame first.
The levels aren't free, and the highest one isn't automatically the safest. Here's how to choose without superstition.
What error correction actually is
QR codes use Reed-Solomon coding, the same family of error correction that lets a scratched CD keep playing. The encoder adds redundant codewords alongside your data, and a scanner can reconstruct what's missing from what survives.
The four levels correspond to roughly how much of the symbol can be lost and still decode: L recovers about 7 percent, M about 15, Q about 25 and H about 30. Those are approximations across the whole code, and where the damage lands matters too. The three large corner squares and the timing lines between them are how a scanner finds and orients the code, so damage there hurts far more than the same damage mid-symbol.
The cost nobody mentions
Redundancy takes space. Moving from L to H on the same content can grow the module grid by several versions, which means finer modules at the same print size. On a small label, an H-level code can actually scan worse than an M-level one, because each module drops below what the camera resolves.
So the question isn't how much protection you want. It's where the damage will come from. Pixels on a screen don't get scratched.
Honest defaults
- On-screen use, email signatures, slides: M. Nothing will damage it, and the sparser grid scans faster.
- A code with a logo in the middle: H, no debate. The logo is damage you chose, and it spends most of the budget before the world adds any.
- Outdoor signs, kitchen menus, warehouse labels, anything handled or weathered: Q, or H if the data is short.
- Long data on a small print: shorten the data first. Dropping to L to make a dense code fit is solving the wrong problem.
Our own generator starts at H and, if you've lowered the level, snaps it back to H the moment you add a logo. Wasting a few modules is cheaper than a logo that breaks scanning on a printed run.
Logos spend your budget
A centered logo hides modules exactly the way wear does, just predictably. Keep it under about 20 percent of the code's area, leave white padding around it so it hides whole modules cleanly rather than clipping them, and always test the exported file rather than the on-screen preview.
If the code is also going somewhere rough, a logo plus outdoor wear can exceed even H. In that case, put the logo next to the code instead of inside it.
Common questions
Is H always the safest choice?
No. H buys damage tolerance by making the grid denser, and on small prints that density costs more than the tolerance is worth. A clean M-level code at 2 cm outscans a cramped H-level one.
Can a QR code with a torn corner still scan?
If the tear takes out one of the three large finder squares, usually not, regardless of level. Error correction rebuilds data modules, but the scanner has to find the code first.
Do the levels change what I can encode?
The content rules are the same; the capacity shrinks. A code that fits around 1,200 characters at L fits roughly half that at H. For typical URLs this never matters; for long vCards it can.