QR Code Error Correction: What L, M, Q, and H Mean
A QR code carries a hidden backup of its own data. Error correction lets a scanner rebuild the message even when the code is smudged, torn, or covered by a logo, and the level you choose (L, M, Q, or H) decides how much damage it survives. Picking the right level takes about a minute and costs nothing to understand.
What the Four Levels Actually Mean
A QR code is a grid of black and white modules. During generation, a Reed-Solomon encoder appends extra parity modules that duplicate — in a mathematically scattered way — the information already in the grid. If a scanner finds modules missing or unreadable, it uses that redundancy to reconstruct the original data.
The standard defines four redundancy levels, named with slightly odd letters (Q stands for Quartile):
| Level | Redundancy name | Data recoverable | Typical use case | |---|---|---|---| | L | Low | up to ~7% | Screens and short-lived displays where you want maximum data capacity | | M | Medium | up to ~15% | General printing: flyers, tickets, receipts | | Q | Quartile | up to ~25% | Retail labels, packaging, anything that may get scuffed | | H | High | up to ~30% | Codes with a logo in the middle, outdoor or industrial use |
The same payload encoded at a higher level needs more modules. On Version 2 symbols (25×25 modules), a numeric string that fits at level L takes noticeably more room at level H: capacities run 77 / 63 / 48 / 38 digits across L / M / Q / H for that version. More modules at the same physical size also means each module is printed smaller, which is the real trade-off you are making.
One nuance people miss: the percentages describe how many codewords can be reconstructed, not literally "you may cover 30% of the area." Damage spread across the symbol is handled better than one giant wipeout, because the parity data is interleaved across the grid — though a single region is also fine as long as it stays under the budget. This is exactly why a logo overlay works: a centered mark covering well under 30% of a high-level code leaves enough scattered codewords intact.
Step-by-Step: Choose the Right Level
- Start with the medium the code will live on. On screens — websites, slide decks, app onboarding — scanning conditions are perfect, so M is a sensible default and L is acceptable when you need to squeeze in a long payload. Save the redundancy budget; you do not need it.
- Move up for anything printed on paper. Print gets folded, creased, highlighted, and coffee-stained. Use M for short-lived print like tickets and Q for flyers, posters, and brochures that will be handled a lot.
- Use H when the code will be abused or decorated. Product labels exposed to friction, oil, or weather; stickers on machinery; codes printed small on courier boxes; and above all, any code with a logo in the center — that rule of thumb exists precisely because H tolerates ~30% damage.
- Check the quiet zone before blaming the level. The blank margin around the symbol (four modules wide is the spec) matters more than most settings. If a code will not scan, a missing quiet zone or poor contrast is a more common culprit than error correction.
- Keep contrast and size sane. Dark modules on a light background, at least 2×2 cm for close scanning distances, and a scale where each module is at least a few printed pixels or a fraction of a millimeter. A perfect level choice cannot rescue a washed-out print.
- Test with real devices before mass production. Print one sample at actual size, scan it with two or three different phones — including an older, lower-resolution camera — from the distance people will actually use. If it scans instantly with margin to spare, you can even consider stepping the level down; if it barely scans, step up.
Common Variations, Answered
Does a higher error correction level make the code harder to scan?
Indirectly, yes — but not because of the math. Higher redundancy means more modules in the same footprint, so each module shrinks. At a fixed print size, an H-level code of a long URL may become too dense for a cheap camera to resolve, while the same URL at M scans instantly. The redundancy itself makes scanning more forgiving; the density is what bites. The fix is usually a shorter URL or a larger print size, not a lower level.
Can I put a logo on any QR code?
Only safely at level H, and only if the logo stays within roughly 30% of the symbol area — practically, keep it under about a quarter. The code's redundancy absorbs the covered modules, but you must re-test after design changes: an SVG export with different stroke thickness or a JPEG with heavy compression can quietly destroy module contrast under the logo. If a client insists on a big, opaque logo over a low-level code, regenerate at H instead of arguing with the printer.
Can I change the error correction level after a code is printed?
No. The level is baked into the symbol itself — the pattern of parity modules reflects it — so an existing print cannot be upgraded. You can, however, always generate a new symbol from the same encoded text at a different level: the encoded payload is identical, only the layout changes. Scan the old code, copy the raw string, regenerate, and replace the artwork. That is also the cheapest way to fix a code that is failing in the field.
Generate and Test One in a Minute
The level choice only exists because QR codes are allowed to fail gracefully — choose deliberately instead of accepting the default. Open the free QR Code Generator, paste your link, pick the error correction level that matches where the code will live, and test the preview with your phone before printing anything. If the code will point guests at a Wi-Fi network or a portal login, pair it with a memorable-but-strong credential from the Password Generator — a resilient code deserves a resilient password behind it.