QR Code Error Correction Levels Explained (L, M, Q, H)
What L, M, Q and H actually do, how much damage each survives, and why the highest setting is usually the wrong choice. With real capacity figures from the ISO standard.
Every QR code carries redundant data so it can still be read when part of it is damaged, dirty or covered. You choose how much redundancy with the error correction level: L, M, Q or H.
The trade-off is simple. More redundancy means more resilience, but also more modules — the little squares — which means either a physically bigger code or smaller, harder-to-scan modules in the same space.
| Level | Recovers up to | Best for |
|---|---|---|
| L | ~7% | Screens, long URLs, clean environments |
| M | ~15% | The sensible default for almost everything |
| Q | ~25% | Print, packaging, anything handled or outdoors |
| H | ~30% | Codes with a logo overlaid, industrial settings |
How it actually works
QR codes use Reed–Solomon error correction — the same family of maths behind CDs and deep-space radio. The encoder adds check symbols alongside your data. The decoder can use those to reconstruct missing or corrupted parts, up to the level's limit.
Two clarifications that matter in practice:
The percentage is of codewords, not area. "30% recovery" doesn't mean you can cover 30% of the visual square. Damage concentrated in one blob is harder to recover than the same amount scattered as speckles.
Some parts aren't protected at all. The three big squares in the corners (finder patterns), the alignment patterns and the timing lines are structural. Obscure a finder pattern and no error correction level will save you — the scanner can't locate the code in the first place.
What it costs you
Redundancy competes with your data for space. Here's the real capacity of a QR code at the same physical size, measured directly from the standard:
Version 5 — a 37 × 37 module code
| Level | Numeric | Alphanumeric | Bytes (URLs, text) |
|---|---|---|---|
| L | 255 | 154 | 106 |
| M | 202 | 122 | 84 |
| Q | 144 | 87 | 60 |
| H | 106 | 64 | 44 |
Going from L to H at a fixed size costs you 58% of your capacity.
Flip it around: keep the data fixed and the code grows instead. A 47-character URL needs a 37 × 37 code at Q, but 41 × 41 at H. Squeeze both into the same printed square and the H version's modules are 8% smaller — and small modules are exactly what makes scanners struggle. On a denser payload the gap widens sharply: a full vCard goes from 61 × 61 at M to 81 × 81 at H, shrinking each module by 22%.
That's the trap. Cranking error correction to H can make a code harder to scan, not easier.
Choosing
Use M for almost everything. It's the default here for good reason. 15% recovery handles realistic wear — a scuff, a fingerprint, a slight fold — without meaningfully inflating the code.
Use L when the code lives on a screen and never gets printed. A web page, an app, an email signature. Nothing will damage it, so redundancy buys you nothing and costs you module density. Also useful when a long URL is pushing the code larger than you'd like.
Use Q for print you can't reprint cheaply. Packaging, business cards, outdoor signage, table cards in a restaurant. These get handled, rained on, scuffed in pockets. The extra resilience is worth the size.
Use H only for a specific reason:
- You're putting a logo in the middle. This is the main legitimate use. The logo is the damage — you're deliberately destroying part of the code and relying on error correction to compensate. Keep the logo under about 20% of the code's area even at H, and never let it touch a corner pattern.
- Genuinely hostile environments — factory floors, shipping labels, anything abrasive.
Otherwise H is usually a mistake made from the reasonable-sounding but wrong assumption that maximum redundancy means maximum reliability.
The logo case, specifically
If you're overlaying a logo:
- Set error correction to H.
- Keep the logo centred — the middle is the safest region.
- Cap it at roughly 20% of total area, not 30%. The theoretical limit assumes perfect conditions you won't have.
- Give the logo a solid background (usually white) rather than letting it sit transparently over modules.
- Test aggressively — multiple phones, in poor light, at an angle, from a distance. Then test the printed version.
Every percentage point you spend on the logo is resilience you no longer have for real-world damage.
Reading the version number
Our generator reports a version alongside the code — v1 through v40. That's the size of the matrix, not a software version:
modules = version × 4 + 17
So v1 is 21 × 21 and v40 is 177 × 177. Watch this number as you change error correction: it's the fastest way to see what a setting is actually costing you. If bumping from M to H pushes you from v4 to v6, your modules just got noticeably smaller at the same print size.
Quick reference
- Screen only, short link → L
- General use, unsure → M
- Printed, handled, outdoors → Q
- Logo overlay or industrial → H
- Code looks too dense → drop a level, or shorten the URL
Shortening the URL is almost always better than lowering error correction. A 30-character link at Q beats a 90-character link at L in every practical respect.
Our generator shows the version, module count and recovery percentage live as you adjust the setting, so you can see the trade-off instead of guessing at it.