Most guides about QR code error correction either quote the four percentages with no context or explain Reed-Solomon at a PhD level that leaves readers more confused than before. Neither helps when you need to decide which level to pick before hitting "generate." QR code error correction levels (L, M, Q, H) control how much physical damage a code can survive before becoming unreadable, and the algorithm behind them, Reed-Solomon, is the same math that saves data on scratched CDs and corrupted storage drives.
TL;DR
- Four ECC levels: L (7% recovery), M (15%), Q (25%), H (30%). M is the ISO default for most print use cases.
- Reed-Solomon works by appending parity codewords derived from polynomial math over GF(256). Scanners use those extra codewords to reconstruct damaged data.
- Use Level H whenever you embed a logo — a centered logo covers ~10–20% of the code, and Level H is the only level with enough headroom.
- Higher ECC = lower data capacity. At Level H, a QR code holds ~30% less data than the same version at Level L.
What Error Correction Actually Does in a QR Code
A QR code is not a simple barcode. It encodes data as a matrix of black and white modules, and it deliberately includes more data than the minimum needed to reproduce the original message. That extra data is the error correction payload — what lets a scanner reconstruct a URL even when a chunk of the code is obscured, torn, or dirty.
Error correction doesn't work by "guessing" the missing parts. It works because the original data was encoded as a mathematical structure, and the parity codewords appended to it constrain what the full dataset must look like. If modules are missing, the scanner solves a system of polynomial equations to fill in the gaps. Deterministic, not probabilistic.
The four levels (L, M, Q, H) define how many parity codewords are added. More parity codewords means more recovery headroom, but fewer modules are left for actual data. That trade-off is the entire decision framework.
The Four ECC Levels: Recovery Percentages and What They Mean
ISO/IEC 18004, the international QR code standard, defines four error correction levels with these recovery capacities:
| Level | Name | Data Recovery Capacity | Typical Use Case |
|---|---|---|---|
| L | Low | ~7% | Digital screens, controlled environments |
| M | Medium | ~15% | General print: flyers, posters, packaging (ISO default) |
| Q | Quartile | ~25% | Industrial printing, high-wear environments |
| H | High | ~30% | Branded QR codes with logos, outdoor signage, harsh conditions |
The percentages refer to the share of codewords in the data block that can be erased or corrupted before the code becomes unreadable. A 7% limit means roughly 1 in 14 data codewords can be missing; 30% means roughly 3 in 10.
Level L — Low (7%)
Level L produces the smallest QR code for any given payload because it adds the fewest parity codewords. On a clean screen — a phone displaying an event ticket or a monitor showing a conference room URL — it's fine. The fragility only shows up when the code is printed and handled. Even moderate printer smearing or a minor crease can push past the 7% threshold, producing scan failures that are genuinely hard to diagnose because there's no visible error message: the scanner just won't read it.
Level M — Medium (15%)
Level M is the ISO/IEC 18004 recommended default, and there's a good reason it stuck. It handles normal print degradation — toner wear, minor wrinkling, indirect lighting — without meaningfully enlarging the code. For most applications (business cards, restaurant menus, product packaging) where the code is clean and unadorned, Level M is the right call. Most commercial QR generators default to it.
Level Q — Quartile (25%)
Level Q is the practical ceiling for codes that need durability without a logo. Think event wristbands, warehouse shelf tags, or outdoor menu boards sitting through months of variable weather. A 25% recovery margin handles significant physical degradation. The trade-off is a visibly denser code: at Level Q, a QR code encoding a typical 50-character URL needs a larger version (more modules) to stay readable at small print sizes. Worth checking before sending to print.
Level H — High (30%)
Level H exists primarily for one scenario: branded QR codes with a logo overlaid in the center. A centered logo typically covers 10–20% of the module area. Level H's 30% recovery capacity is the only level that handles a logo reliably, leaving 10–20% of headroom for real-world wear on top of the logo coverage.
It's also the right choice for industrial QR codes on metal parts subject to scratching, outdoor installations with UV and moisture exposure, and codes that will be laser-etched or chemically marked on surfaces where module contrast degrades unevenly.
Reed-Solomon Error Correction: How the Math Works
Reed-Solomon (RS) codes were developed by Irving Reed and Gustave Solomon at MIT Lincoln Laboratory in 1960. The same Reed-Solomon error correction logic appears in CD and DVD players, RAID storage systems, deep-space communications (Voyager used RS codes for its transmissions from 4 billion miles out), and every QR code ever generated.
The core idea: treat your data not as a sequence of bits, but as coefficients of a polynomial. Evaluate that polynomial at a fixed set of points and record the results as extra "check symbols." If some original data points are lost or corrupted, the check symbols constrain the shape of the polynomial enough to recover the missing values. It's closer to solving a system of equations than anything resembling "error guessing."
How QR Code Scanners Use Reed-Solomon
QR codes use Reed-Solomon over GF(256), a Galois Field with 256 elements where each element maps to one byte of data. Here's what happens during encoding and decoding:
- Encoding: The QR generator takes the data codewords and computes a set of error correction codewords (ECCs) using a generator polynomial. These ECCs are appended to the data block before the final matrix is assembled.
- Scanning: The scanner reads as many modules as it can. Unreadable modules are treated as "erasures" — known-missing positions, which are easier to correct than unknown errors.
- Reconstruction: The RS decoder uses the available data codewords plus the ECC codewords to reconstruct any missing data. Erasures cost one correction symbol each; errors (wrong value in a readable position) cost two. Level H adds enough ECC codewords to handle up to 30% of the total codeword count as erasures.
This is why branded QR codes with logos scan reliably. The logo creates predictable erasures in the center of the code (the finder patterns and timing patterns are always in known, logo-free positions), and the RS decoder uses the surrounding ECC codewords to fill them in. The logo isn't punching a hole in the data — it's just creating erasures the algorithm already knows how to handle.
Capacity Trade-Off: What Higher ECC Costs You
Every ECC codeword displaces a data codeword. For a Version 10 QR code (57×57 modules), usable data capacity at each level is:
- Level L: 346 binary codewords
- Level M: 272 binary codewords
- Level Q: 196 binary codewords
- Level H: 146 binary codewords
That's a 57% reduction going from Level L to Level H in the same physical code version. Encoding a long URL (say, 120 characters) at Level H requires a larger code version than Level L — physically bigger on paper, or more pixels on screen.
For short URLs (under 50 characters), this is invisible: even Level H handles the payload comfortably at small sizes. Long URLs, vCard data, or WiFi config strings are where you start to feel the constraint.
When Not to Use Level H
Level H is not automatically "better." Here are three situations where it actively hurts you:
- Small print sizes: Level H needs more modules for the same data. Under roughly 2 cm (0.8 in), increased density reduces scanner reliability on older devices with low-resolution cameras.
- Text-heavy payloads: vCard codes, WiFi configs with WPA2 passwords, or codes with embedded email templates can hit version limits at Level H that Level M avoids entirely. Test at the smallest expected print size before committing to a design.
- Digital-only display: A screen-displayed QR code is never physically damaged. Level M (or even Level L) is sufficient and produces a cleaner, less dense matrix. Some scanner apps do pick it up faster.
The Practical Decision Framework
Use this decision tree:
- Does the code have a logo overlay? → Level H. No exceptions.
- Will it be exposed to physical wear, outdoor conditions, or industrial environments? → Level Q.
- Standard print (flyer, poster, business card, packaging) with no logo? → Level M (ISO default).
- Digital display only, never printed? → Level M is fine; Level L if code density matters.
Most guides get one thing wrong here: they recommend Level H for all branded applications regardless of whether a logo is present. If the code has brand colors but no logo actually covering modules, Level M or Level Q is enough. Level H is for when modules are physically covered or destroyed — not for codes that are simply "professional-looking."
Originally published on QR Nova. QR Nova lets you select ECC level before download and preview code density at your target print size — no subscription required.
Top comments (0)