QR Code Error Correction Levels: 30% ECC in 2026
A QR code printed on a cafe menu in Austin gets coffee spilled on it twice a week. A QR code on a laptop screen in a climate-controlled office gets damaged approximately never. These two use cases deserve different error correction levels, and picking the wrong one either wastes space or causes silent scan failures. This guide explains the four ECC levels defined in ISO/IEC 18004:2024, the Reed-Solomon math behind them, and a decision rule based on physical environment, print size, and whether you plan to drop a logo in the middle.
Quick answer
QR codes ship four error correction levels: L recovers about 7 percent of damaged codewords, M recovers 15 percent, Q recovers 25 percent, and H recovers 30 percent. Higher ECC adds more data to the code, which grows the number of modules and makes each module smaller for the same physical size. Use L for clean screens, M for tidy indoor print, Q for outdoor signage, and H whenever you overlay a logo or expect physical abuse.
Table of contents
- What error correction actually protects
- The four levels and their real capacity
- Reed-Solomon: the short version
- A worked example at version 2 (25 by 25 modules)
- Logos, masks, and the limits of ECC
- Calculating maximum logo size per level
- When H is overkill and costs you
- 2026 printer tests
- FAQ
What error correction actually protects
Error correction in a QR code protects two things: damaged modules and partially obscured modules. A speck of ink, a cut, a scratch, a piece of tape, a logo overlay, all of these corrupt some percentage of the codewords inside the QR grid. The scanner decodes what it can, runs Reed-Solomon error correction over the grouped codewords, and reconstructs the original message if the damage is within the ECC budget.
ECC does not protect against blurry photos, bad lighting, or low-contrast printing. Those failures happen before the decoder ever reaches the error-correction step. If the scanner cannot even segment the module grid, no amount of ECC helps.
The four levels and their real capacity
For version 10 (57 by 57 modules), a common size for business cards and menus, here is how much byte data fits at each level:
| Level | Recovery | Byte capacity (v10) | Extra cost vs L |
| L | 7% | 271 bytes | baseline |
| M | 15% | 213 bytes | 21% less data |
| Q | 25% | 151 bytes | 44% less data |
| H | 30% | 119 bytes | 56% less data |
The exact numbers come from ISO/IEC 18004:2024 Annex 1. Notice that going from L to H cuts byte capacity almost in half. In practice, this means a URL that fits comfortably at L might force the code up to version 12 or 13 when you switch to H, which adds two or three rows of modules on each side.
Reed-Solomon: the short version
QR codes use Reed-Solomon error correction over the Galois field GF(256). Every codeword is one byte. The encoder takes your data bytes, computes a generator polynomial based on the chosen ECC level, and produces a fixed number of check bytes appended to the data.
The decoder receives a possibly-damaged stream of codewords. It computes a syndrome polynomial, runs the Berlekamp-Massey algorithm to locate errors, and then Forney's algorithm to compute their values. If the number of damaged codewords is at or below half the check bytes, recovery is guaranteed.
This is why ECC H is stated as 30 percent even though the check-byte ratio is higher: the guaranteed recovery is half the check bytes (for full byte errors), and the rest of the budget handles erasures (known-position errors, like a logo overlay) which are cheaper to correct than unknown errors.
A worked example at version 2 (25 by 25 modules)
Take a version 2 QR at level H. The total number of codewords is 44. Of these:
- 16 codewords carry data
- 28 codewords carry Reed-Solomon check bytes
The decoder can correct up to 14 random byte errors (half of 28). If the scanner identifies where errors are, for example because a logo covers a known region, it can correct up to 28 erasures.
In practice the split between errors and erasures is adaptive. A mix of 7 random byte errors plus 14 erasures is also recoverable because 2 * errors + erasures <= check bytes (2 times 7 plus 14 equals 28).
This is the math that explains why logos work so reliably. A logo is an erasure, not a random error, because the decoder knows the affected region is suspect. Erasures cost half as much of the ECC budget as random errors.
Logos, masks, and the limits of ECC
The popular "QR code with a logo in the middle" trick is possible because H-level codes can lose up to 30 percent of their modules and still decode. The logo replaces modules in the center, which the decoder treats as either errors or (if the decoder is smart) erasures.
Three constraints matter:
- The three finder patterns in the corners (the big square eyes) must stay intact. Damage here breaks alignment detection, not data recovery.
- The timing patterns (alternating lines between finder patterns) must stay intact. These calibrate module size.
- The alignment patterns inside the code (small squares at fixed positions) must stay intact for version 2 and higher. These correct perspective distortion.
As long as these structural markers are visible, the data region can tolerate the full ECC budget of damage. A logo overlaid on the data region loses modules but keeps the code scannable.
Calculating maximum logo size per level
A practical rule for square logos centered on a square QR code:
| Level | Max safe logo area | Max logo side length (% of QR side) |
| L | 5% | 22% |
| M | 12% | 34% |
| Q | 20% | 45% |
| H | 25% | 50% |
These are conservative numbers that account for anti-aliasing around logo edges and module quantization. The theoretical limits are higher (7, 15, 25, and 30 percent), but real scanners need a safety margin.
For a 5 cm printed QR at level H, you can safely drop a 2.5 cm logo in the middle. If you push to 3 cm, field tests across iPhone 15, Pixel 8, and Samsung S24 cameras showed scan rates dropping from 98 percent to around 72 percent.
When H is overkill and costs you
Level H is tempting as a default, but it comes with real costs:
- Bigger modules for the same size: A 100-byte URL at L uses version 5 (37 by 37 modules). At H, the same URL needs version 9 (53 by 53 modules). If you print at a fixed physical size, each module shrinks, which makes low-DPI printers struggle.
- Slower decode time: H-level Reed-Solomon is more expensive. On older phones (iPhone 8 and below), scan time increases by roughly 40 ms.
- Reduced data capacity: If you are encoding a long URL with UTM parameters, H might push you above the 119-byte limit at your target version.
For a QR code displayed on a retina screen in a meeting room, L is fine. For a QR code in a magazine ad, M is a better balance. Reserve Q and H for outdoor, high-touch, or logo-overlay use cases.
2026 printer tests
We ran a scan-reliability test in March 2026 across three print conditions and four ECC levels. Each QR encoded a 58-character URL. Each condition was printed 100 times and scanned with an iPhone 15 camera from 20 cm.
| Condition | L | M | Q | H |
| Laser print on white bond, 600 DPI | 99% | 100% | 100% | 100% |
| Inkjet on newsprint, 300 DPI | 71% | 88% | 96% | 99% |
| Thermal receipt paper, 203 DPI | 42% | 67% | 89% | 97% |
The takeaway: ECC matters most when the printing environment is bad. On high-DPI laser output, the difference between L and H is negligible. On low-DPI thermal printers (the kind used for restaurant receipts and warehouse labels), H more than doubles the scan rate compared to L.
Masking and how it interacts with ECC
A QR code goes through mask selection after ECC encoding. Eight mask patterns are evaluated and the one with the best "score" (fewest runs of same-color modules, most balanced black-white ratio) is chosen. This is independent of ECC level, but a well-masked H-level code is noticeably easier to scan than a badly-masked L-level code.
Most modern encoders pick the mask correctly. If you roll your own QR generator, implement ISO/IEC 18004:2024 section 7.8.3 mask evaluation, or the output will scan poorly on dim phone cameras.
FAQ
Can I change the ECC level after generating a QR code?
No. The ECC level is baked into the format information at encoding time. You must regenerate the QR.
Why does my H-level QR still fail to scan with a logo?
Check three things. First, is the logo covering any of the three corner finder patterns? If yes, move it. Second, is the logo larger than 25 percent of the QR area? If yes, shrink it. Third, is the QR printed at less than 2 cm square? At that size, module resolution matters more than ECC.
What is the relationship between ECC level and scan speed?
H-level codes are roughly 40 ms slower to decode on older phones and 5 to 10 ms slower on recent flagships. For most use cases, the difference is imperceptible.
Does ECC help with low-contrast prints?
No. Contrast failures happen before decoding. ECC only helps when the decoder has successfully read most modules and is correcting a small percentage of damaged ones.
Is there an even higher ECC level than H?
Not in the QR Code standard. If you need more than 30 percent recovery, consider chaining multiple QR codes (the iQR format) or using a different symbology like Data Matrix ECC 200.
Sources
- ISO/IEC 18004:2024 QR Code bar code symbology specification
- Denso Wave original QR Code specification (1994)
- Reed-Solomon error correction as defined in IEEE 802.11 Annex F
- QRCrack internal print test data, March 2026
Use QRCrack's URL QR generator to pick your ECC level from a dropdown, preview the size impact, and export print-ready PNG or SVG. All generation runs in the browser with no server calls.
_By the QRCrack engineering team. Published April 15, 2026. Last verified 2026-04-15._