QR Code Error Correction Explained: L, M, Q, and H Levels
Every QR code standard includes a feature called error correction, and it's arguably the single most important reason QR codes work reliably in the messy real world - through smudges, creases, glare, curved surfaces, and yes, logos placed directly in the middle of the pattern. This guide explains what's actually happening under the hood, and gives clear, practical guidance on which level to choose for your own projects.
The core idea: redundancy, not just repetition
It's tempting to imagine error correction as simply "storing the data twice," but it's more sophisticated than that. QR codes use a mathematical technique called Reed-Solomon error correction - the same family of algorithms used in CDs, DVDs, and deep-space satellite communication - which adds carefully calculated redundant data alongside your actual content. This redundancy allows a scanner to mathematically reconstruct missing or corrupted sections, rather than simply having a backup copy to fall back on. It's considerably more space-efficient than naive duplication, which is why QR codes remain compact even with substantial damage tolerance built in.
The four error-correction levels
| Level | Recovery Capacity | Best For |
|---|---|---|
| L (Low) | ~7% | Clean digital displays, maximum data capacity, smallest possible code |
| M (Medium) | ~15% | General-purpose default for most everyday codes |
| Q (Quartile) | ~25% | Codes with a small decorative accent or expected wear |
| H (High) | ~30% | Any code with a logo, or exposed to heavy real-world wear |
Why higher correction means a visually denser code
Since error correction works by adding redundant data alongside your actual content, naturally, higher correction levels require more total modules to store that extra redundancy. This is why a High-correction QR code encoding a given piece of text looks visibly "busier" - more small squares packed into the grid - than a Low-correction code encoding the exact same text. For short data like a typical URL, this difference is barely noticeable to the eye; for longer text blocks (a full vCard, a long message), the size difference between error-correction levels becomes much more apparent, and can even push the code into a larger overall version (grid size) than it would otherwise need.
The logo connection, explained properly
This is the detail most people actually care about: when you place a logo in the center of a QR code, you are deliberately obscuring some of the modules underneath it. If the amount of obscured data stays within what your chosen error-correction level can recover, the code still scans perfectly - the scanner simply reconstructs the "missing" information using the surrounding redundant data, exactly as it would for a smudge or a tear. If the logo is too large, or the error-correction level too low, you cross a threshold where reconstruction becomes mathematically impossible, and the code fails to scan entirely (not partially - QR decoding is all-or-nothing once you exceed the recovery threshold).
This is precisely why we automatically bump every code to High (H) error correction the moment you upload a logo in our generator - it gives you the maximum available headroom (about 30% recovery capacity) to work with, which comfortably covers a modestly sized, well-centered logo without you needing to calculate anything yourself.
Choosing the right level for your specific situation
- Digital-only codes (website buttons, slide decks, emails): Low (L) is fine - the display will always be crisp and undamaged, so you gain nothing from extra redundancy and get a slightly simpler, more compact code.
- General business cards, flyers, and everyday print: Medium (M) is the sensible default - enough tolerance for normal handling and printing imperfections without unnecessarily bloating the code.
- Codes on packaging, outdoor signage, or anything exposed to weather and wear: Quartile (Q) or High (H) - these will get dirty, scratched, or faded over their lifespan, and need the extra headroom.
- Any code with a logo, regardless of context: always High (H) - non-negotiable if you want reliable scanning.
A common misconception worth clearing up
People sometimes assume higher error correction makes a code "more secure" or harder to tamper with - it doesn't. Error correction is purely about physical damage and obstruction tolerance; it has no bearing on the security of the data being encoded or how the destination is handled. Don't confuse "resilient to smudges" with "resistant to fraud" - those are entirely separate concerns (see our QR code security guide for the latter).
How error correction interacts with the QR "version" (grid size)
QR codes come in 40 standardized sizes, called versions, and the amount of data you're encoding combined with your chosen error-correction level together determine which version a generator selects. The same text encoded at Low correction might fit comfortably in a smaller version than the identical text encoded at High correction, since High correction reserves more of the grid for redundant recovery data rather than raw content. This is worth knowing if you're ever surprised that adding a logo (which forces High correction) made your code look noticeably denser even though you didn't change the actual text being encoded.
A practical mental model to keep in mind
Think of error correction as an insurance policy you're paying for in grid density: Low correction is the cheapest policy with the least coverage, appropriate when you're confident nothing will ever damage or obscure the code; High correction is the most expensive policy in terms of visual density, but gives you the most coverage against smudges, tears, glare, and logos. Choosing the right level is really just choosing how much coverage your specific real-world use case actually needs.
Troubleshooting error-correction problems
If a code that should theoretically work is failing to scan, these are the usual culprits, roughly in order of likelihood:
- A logo that's too large for the correction level. Even at High (H), a logo covering much more than 20-25% of the code's area can push the code past its recoverable threshold. Shrink the logo and re-test rather than assuming High correction gives unlimited headroom.
- Real damage combined with an already-low level. A code generated at Low (L) correction for a "clean digital display" that later gets printed and creased or dirtied has none of the redundancy needed to compensate. If a static code's physical environment turns out rougher than expected, regenerate it at a higher level rather than hoping it holds up.
- Confusing error correction with print quality. Higher correction doesn't fix a genuinely blurry, low-resolution export - it only compensates for obstruction and damage to an otherwise sharp code. If modules are blurry to begin with, the fix is a higher-resolution or vector export, not a higher correction level.
- Testing only on one device. A borderline case (a logo right at the edge of what's recoverable) can scan on one phone's camera and fail on an older or lower-quality one. Test on a couple of different phones before trusting a tight margin.
Conclusion
Error correction is the reason QR codes tolerate the real world at all - smudges, folds, glare, and logos - without needing to be treated as fragile. The practical takeaway is simple: match the level to how much wear and obstruction the code will realistically face, always use High when a logo is involved, and don't mistake "more redundancy" for "more secure," since those are unrelated properties of a code. Once you've picked the right level, the rest of the customization - color, shape, size - can be handled with confidence that the underlying data will still hold up.
Frequently asked questions
Can I manually choose error correction, or is it always automatic? Our generator automatically selects an appropriate level based on your content and customization choices (like adding a logo), removing the guesswork while still giving you full control over size, colors, and style.
Does higher error correction slow down scanning? No - decoding speed is not meaningfully affected; modern phones decode any standard QR code in a fraction of a second regardless of error-correction level.
What happens if I exceed the safe logo size even at High correction? The code will fail to scan entirely - there's no "partial" scan. Always test after adding a logo, and reduce its size if you have any doubt.
Our QR generators handle this automatically - upload a logo, and we boost the error-correction level for you behind the scenes.