QR error correction levels — when to use L, M, Q, or H
QR codes carry 7, 15, 25, or 30 percent redundancy at levels L, M, Q, H. How to pick the right QR error correction level for print, outdoor, and screen.
Every QR code carries built-in redundancy so it can still scan when part of it gets damaged, smudged, or covered by a logo. Four levels exist — L, M, Q, H — corresponding to roughly 7%, 15%, 25%, and 30% data recovery. Most generators default to M without explaining the trade-off, and most posts on the topic stop at "use higher for outdoor". The real picture is more interesting: every step up in error correction makes the code denser, which makes it harder to scan at small print sizes. The right level depends on your environment, your print size, and whether you're putting a logo in the middle.
This post covers what error correction actually does (Reed-Solomon codes, briefly), the four levels at a glance, the conditions where each one wins, and the cases where higher correction backfires. By the end you should be able to pick L/M/Q/H with confidence rather than leaving it on the generator's default.
What error correction actually does
QR codes use Reed-Solomon error correction, the same family of codes that protects CDs, DVDs, satellite transmissions, and the data on every modern hard drive. The principle: encode the payload alongside extra "check" symbols computed from the payload. If a portion of the symbols arrives damaged or missing, the decoder can mathematically reconstruct the original data as long as enough check symbols survive.
For a QR code, this means: add redundancy modules to the printed grid such that a percentage of the printed area can be obscured, scratched, or replaced and the scanner still recovers the original URL. The percentage you choose is the error correction level.
The four levels are encoded into the QR's format information area near the corners — that's how a scanner knows which Reed-Solomon decoding to apply. The level is set at generation time and can't be changed without re-encoding the whole code.
Choosing the right level
The first instinct most people have is "higher is always safer". It isn't. Each step up in error correction makes the code carry more redundancy modules, which means more total modules, which means a denser printed grid for the same payload. Denser grids need either larger print sizes or higher-resolution cameras to scan reliably. Pushing from L to H roughly doubles the module count for the same content.
The honest framework is: pick the lowest level that survives the conditions you're actually printing into. The four common environments and their best-fit level:
- L (≈7%): Pristine on-screen QR codes, professional offset print on glossy stock with no expected wear. Marketing emails, app loading screens, conference slide decks.
- M (≈15%): Default for most digital and clean-print use cases. Posters, flyers, packaging that won't be subjected to heavy weather or dirt.
- Q (≈25%): Outdoor use, packaging that will go through warehouse handling, codes with a small (≤15% area) logo overlay, on-product stickers exposed to sun and fingerprints.
- H (≈30%): Logos covering 20–25% of the code area, tattoo-grade applications, harsh industrial environments, codes printed at sizes near the minimum-readable threshold.
If you're not sure, M is a defensible default. If you're going to put a logo in the centre, jump straight to H without thinking about it — the extra redundancy is exactly what lets the logo overlap work.
How error correction affects scan rate
Two competing forces show up in real scanning conditions. Higher correction makes the code more tolerant of damage, dirt, and partial occlusion. Lower correction makes the printed code less dense, which means each module prints larger at the same physical size, which makes scanning easier on cheap cameras and at long distances.
For pristine print on glossy stock, level L scans faster and from further away than H — the modules are simply bigger. For a sticker on a moving package or a printed code with coffee splashed across one corner, level H wins because L's marginal damage tolerance is too thin to absorb real-world wear.
The break-even point is roughly: if your print conditions guarantee less than 5% of the code surface gets damaged, L is the optimal choice. If you expect 10–25% damage, Q. If you expect 25%+ damage or a logo overlay, H. M is the soft-default for "I'm not sure but the conditions seem normal".
Higher error correction is not free — it's an exchange of redundancy for module count, and module count costs you scan reliability at small sizes.
Logo overlap and error correction
This is the case where higher error correction definitely earns its keep. Putting a logo in the centre of the QR overlaps modules that would otherwise be readable. The decoder has to recover those modules from the surrounding redundancy.
The honest math: a logo covering exactly the maximum-recoverable percentage will work in lab conditions but fail in any real-world scenario where the print also has minor damage, the camera angle is off, or the lighting is uneven. So the rule of thumb everyone learns the hard way is to leave a margin: put a logo at 60–70% of the theoretical maximum.
That gives you these comfortable maximum logo areas at each level:
- L: 4–5% of the code area (so a tiny dot — usually too small to bother)
- M: 9–10% (a small icon, no text)
- Q: 14–17% (a typical logomark)
- H: 18–22% (large logo with breathing room)
Most generators that advertise logo-friendly QR codes set the level to H by default for this reason — even if the logo only covers 10% of the area, having extra redundancy elsewhere protects against damage that's not the logo's fault.
If you're putting a logo in your code, see custom QR code shapes for the related question of what visual modifications are safe alongside the logo overlay.
When higher correction backfires
Three cases where L beats H reliably:
Small print sizes. A QR printed at 10×10mm has roughly 4 pixels per module at level L and 2 pixels per module at H. Once you cross below 1.5 pixels per module on a typical phone camera, the scan rate falls off a cliff. Use L for the smallest readable codes.
Long-distance scans (billboards, posters). From across a room or down a corridor, the angular size of each module is what determines whether the camera can resolve it. L gives you bigger modules; H halves their size. We covered this in detail in QR codes for outdoor advertising.
Pure on-screen display. Web QRs displayed in browsers have no print-loss, no folding, no weather. L is sufficient and renders cleaner.
The mistake is reflexively picking H "to be safe". H costs you density, and density costs you scan rate where the print is already pristine. Match the level to the failure modes you actually face — if you're already troubleshooting a QR code not scanning, the six-cause walkthrough covers how level choice interacts with the other failure modes in real-world print.
A picker for your use case
The picker covers the cases that come up most often. If your situation is genuinely edge-case (tattoo, custom rendered ceramic tile, mirror-printed glass), test at multiple levels with real cameras before committing to a print run.
Scan-rate trade-off in numbers
Some practical numbers from controlled-condition tests:
- A 20mm-square QR at level L scans cleanly from 30–45cm on a 12-megapixel phone camera under indoor light.
- The same payload at level H, also 20mm square, scans cleanly from 20–28cm — about 35% shorter range.
- At level L, scratching out 10% of the code area causes scan failure roughly 60% of the time.
- At level H, the same 10% damage is recovered virtually every time.
The trade is real and predictable: trade range and small-size ease for damage tolerance. The right answer is to know which side your conditions favour rather than guess.
The numbers above shift a bit on different phone hardware. Recent iPhone Pro models (with their LiDAR-assisted camera focus) handle low-contrast and small QRs better than budget Android phones, where the older fixed-focus cameras struggle once modules drop below 1.5 pixels in width. If your audience skews toward older devices — common in industrial, retail, and developing-market deployments — round up your error correction level by one step from what you'd otherwise pick. The extra redundancy gives the slower autofocus an extra fraction of a second to lock on without losing the read. You can verify in your own field by testing the same payload at two levels on whichever phones your customers actually use.
What we use on Linked.Codes
The default for codes generated through Linked.Codes is M, mirroring the industry baseline. The QR editor lets you override per code. For codes destined for outdoor placement we recommend Q. For codes with logos, the editor automatically pushes to H when the logo overlay exceeds 15% of the code area. The reasoning matches the framework above — pick the lowest level that survives your conditions, then add a margin.
Related reading
- Custom QR code shapes — what's possible without breaking the scan — visual modifications and their interaction with error correction
- Round QR codes — what makes them work — module-shape changes that pair with EC levels
- Static vs dynamic QR codes — why the EC level becomes more important when the destination is static
- QR codes for outdoor advertising — long-distance scan considerations
Why do most generators default to M instead of letting the user pick?
M is the level that works for the broadest range of conditions without being unnecessarily dense. Defaults exist to be safe rather than optimal. Generators aimed at developers and design tools expose all four; consumer generators usually hide the choice.
Does the error correction level affect QR scanning speed?
Yes — densely-modulated codes (Q, H) take a fraction of a second longer for the camera to lock onto and decode, especially on lower-resolution cameras or in poor lighting. The difference is sub-second on modern phones; on industrial barcode readers it can be more pronounced.
Can you change the EC level after the code is printed?
No. The error correction level is encoded into the code's format information and the redundancy modules. Changing it requires re-encoding the entire payload and re-printing. This is one reason dynamic QR codes (which redirect to your URL) are preferable for printed media — the URL stays the same, even if you decide to update the destination later.
What happens if part of a QR is too damaged to scan even at level H?
The scanner returns a decode error and shows nothing. There's no partial recovery — Reed-Solomon either reconstructs the complete payload or it fails. The 30% recovery rate is a hard ceiling.
Is there a level above H?
Not in the standard QR specification. Some QR-like 2D codes (Aztec, Data Matrix) offer higher correction levels, but they aren't QR codes and aren't readable by every QR scanner. If you need more than 30% damage tolerance, the right answer is usually a different code format, not a custom QR variant.
Does using a higher error correction level slow down decoding noticeably on real phones?
On phones manufactured in the last five years, no — modern decoders run in microseconds regardless of level. The slowdown only matters on dedicated industrial scanners or older hardware (pre-2018 phones) where the camera-decode pipeline is constrained.
If I'm using a dynamic QR code, does the EC level matter less?
Slightly. Dynamic codes encode a short URL (your redirect endpoint), so the payload is small and the same EC level produces a smaller, less dense code than for a long static URL. But the level still affects damage tolerance — pick based on your print environment.
Sourcesshow citations
- ISO/IEC 18004:2024, QR code bar code symbology specification — https://www.iso.org/standard/83389.html
- Wikipedia: QR code — https://en.wikipedia.org/wiki/QR_code
- Wikipedia: Reed–Solomon error correction — https://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction
- Denso Wave QR code overview (the original inventor) — https://www.qrcode.com/en/about/error_correction.html
- IEEE Information Theory Society on Reed-Solomon coding — https://www.itsoc.org/
- Apple Developer documentation on AVFoundation barcode detection — https://developer.apple.com/documentation/avfoundation/avmetadatamachinereadablecodeobject
Try it on your own domain
Branded short links and dynamic QR codes, on your subdomain or your own domain. One-time purchase, no per-click fees.