QR code error correction levels, the four choices and when to use each
Every QR code carries a slice of redundant data so a scanner can still decode it when part of the symbol is damaged, smudged or covered by a logo. The four levels, named L, M, Q and H, set how much of that slice the code reserves, and the choice you make also fixes how dense the final pattern looks. This guide explains the four levels using the recovery figures defined in ISO/IEC 18004:2024, shows how much overlay a logo can take per level, and links to the QR code generator so you can set the level when you build one.
The four levels at a glance
QR codes use Reed-Solomon error correction, the same family of codes used on CDs and DVDs. The QR specification, ISO/IEC 18004, names four discrete settings. Each one reserves a fraction of the codewords (the 8-bit data units inside the symbol) for recovery, and that fraction is what the scanner can lose before the message dies.
| Level | Letter on tools | Codewords recoverable | Typical use | Logo cushion |
|---|---|---|---|---|
| Low | L | ~7% | Clean digital screens, posters under glass | Small or none |
| Medium | M | ~15% | General print, business cards, packaging | Small (5-10% area) |
| Quartile | Q | ~25% | Outdoor signage, scuffed labels, industrial | Medium (15-20% area) |
| High | H | ~30% | Branded codes with a centre logo, harsh environments | Large (up to ~25% area) |
Why the levels exist: Reed-Solomon, in one paragraph
A QR code splits its payload into data codewords (your URL, text or other bytes) and error correction codewords (extra bytes computed from the data). Reed-Solomon can recover the original message as long as the unreadable codewords stay under a known limit. ISO/IEC 18004 fixes that limit per level: about 7%, 15%, 25% and 30% of the total codewords for L, M, Q, H. The encoder uses Galois field arithmetic to compute the correction codewords; the decoder runs the same arithmetic in reverse to repair losses up to the cap.
The practical effect is mechanical. A higher level shoves more correction codewords into the symbol, which means the same payload needs a larger QR version (more modules per side) to fit. Density rises; recovery rises with it.
How density changes with the level
A QR symbol has 40 possible versions in ISO/IEC 18004, from version 1 (21 by 21 modules) to version 40 (177 by 177). The version that fits your payload depends on three things: the encoding mode (numeric, alphanumeric, byte, kanji), the byte length of the data, and the error correction level. Push L to H without changing the payload and the symbol typically jumps up one or two versions, which means more, smaller modules per centimetre once printed.
What that means for a 50-character URL
A short URL in byte mode fits in a low version regardless of level. A long, query-parameter-heavy link at H may demand a noticeably larger symbol than the same link at L, with the side count climbing in roughly 4-module steps as the version increases. If your printed area is fixed, ramping up the level can force you to either shorten the URL or accept smaller modules. Smaller modules then hit the 10:1 distance rule faster: scanners need a minimum module size at a given scan distance.
When density bites
Density only becomes a problem when the symbol shrinks to the point a typical phone camera cannot resolve individual modules. On a business card at 2.5 cm wide, an H-level code carrying 200 characters can become unfriendly to older cameras under cafe lighting. On a billboard, density is irrelevant; pick H and move on.
Logos and the cushion math
A branded QR code with a logo in the centre works because the logo covers data that error correction recovers from the surrounding modules. The percentage you can safely cover is bounded by the level, but with two qualifications: the logo must sit centrally (the finder patterns at the three corners cannot be touched), and the covered area should be a clean rectangle or circle, not a ragged silhouette.
| Level | Codeword recovery | Recommended logo overlay | Notes |
|---|---|---|---|
| L | ~7% | Avoid; small mark only | Any meaningful logo risks decode failure. |
| M | ~15% | Up to ~8% of the symbol area | Small monogram or icon. |
| Q | ~25% | Up to ~15% of the symbol area | Most common choice for marketing codes. |
| H | ~30% | Up to ~25% of the symbol area | Default for any code with a logo in the middle. |
Tools that print the recoverable percentage as a hard overlay limit are oversimplifying. The level tells you what the symbol can lose; the logo placement decides what it actually loses. Cover the three large finder patterns and even H fails. Cover only the middle data area and Q usually survives. The QR code with logo tool sets H by default for exactly this reason.
Quiet zone is non-negotiable
ISO/IEC 18004 requires a 4-module light border around the symbol called the quiet zone. Logos, captions and decorative frames must stay outside it. A QR code printed flush against a busy background, or with a logo eating into the quiet zone, often fails to scan even at H. The redundancy is for the data area, not the boundary.
Picking a level by scenario
- Static URL on a clean website, app screen or PDF: L. Density is minimised, scanners read it instantly, and there is nothing to damage it.
- Restaurant menu QR, parking sign, payment poster: M. Some smudge and reprint tolerance, no logo or a tiny one, payload is short.
- Outdoor signage, labels on machinery, anywhere the print might scuff: Q. The extra recovery is cheap insurance.
- Any code with a central logo, plus codes printed on curved or textured surfaces: H. The logo eats redundancy; H gives you headroom.
If you generate a UPI QR code for an in-store payment sticker, pick Q or H so a torn corner or finger smudge does not break the scan. A vCard QR code on a business card is short enough that H rarely costs you density.
Common mistakes the level cannot save you from
- Inverted contrast. ISO/IEC 18004 expects dark modules on a light background. Light-on-dark QR codes work on some scanners and fail on others; do not assume H bails you out.
- Low contrast colour combinations. A pale grey on white symbol can defeat any level, because the camera cannot tell modules from background.
- Compression artefacts. A QR code saved as a low-quality JPEG can blur module edges and break scanning. Use SVG for print and PNG with no quality loss for digital.
- Reflective laminates. Glossy surfaces under direct light reflect the camera flash back as a white spot over part of the code. The fix is matt lamination, not a higher level.
- Dynamic curves and damaged labels. A symbol wrapped around a curved bottle can read at H if the curve is gentle; sharp curves still defeat redundancy.
Setting the level when you generate a code
- Decide where the code will live, on a screen, on print, on packaging or outdoors. That narrows the level immediately.
- Decide whether the code carries a logo. If yes, pick H and design around the centre.
- Generate at SVG for print and PNG for screens with the QR code generator, then check the file at the final print size before committing to a run.
- Test scan with at least two phones (one iOS, one Android), in low light and at the intended scan distance. The standard does not promise universal reads; in-the-wild testing does.
- Re-encode at a higher level if any test scan stutters, even if the level you started with looked theoretically fine.
For long URLs that force the symbol up several versions, consider a dynamic QR code so the printed payload is a short tracking link, not the full destination.
Frequently asked questions
Related guides
- Minimum QR size for print
The print width a QR code needs at a given scan distance, plus module size, DPI and quiet-zone math you can check against any layout.
- Static vs dynamic QR codes
How dynamic QR codes work, what they cost in privacy and dependency, and the cases where a free static code is the better answer.
- QR payload cheatsheet
Every QR URI scheme imgkilo supports, with field syntax, source RFCs, and the per-scheme gotchas that break scans.
Related tools
- QR code generator
Pick the error correction level when you generate a code.
- QR code with logo
Overlay a logo, default H for safe recovery.
- Minimum QR size for print
Pair the right level with a scannable module size.
- Static vs dynamic QR codes
Why a redirect can let you ship at a lower level.
- vCard QR code generator
Business card payloads usually want H.
- UPI QR code generator
Payment stickers want Q or H for scuff tolerance.