QR Code Error Correction Levels Explained: L, M, Q, H and Logos
QR codes can rebuild damaged or covered data - up to a point. Here is what error correction levels L, M, Q and H mean, and how a logo factors in.
UniSoftware 5 min read
QR codes can rebuild part of their data even when a portion of the printed pattern is dirty, damaged or covered by a logo - that resilience is called error correction, and it comes in four standard levels: L, M, Q and H. Higher levels tolerate more damage but make the code denser.
Key takeaways
- Error correction lets a QR code still decode correctly even if part of it is missing, dirty or covered.
- UNI-QR offers the four standard levels with their approximate recovery capacity labeled directly in the app: L 7%, M 15%, Q 25%, H 30%.
- A logo covers part of the pattern, so pair a larger logo with a higher level (Q or H) to keep the code reliable.
- Higher levels add more data modules, making the pattern denser - raise the level only as far as you actually need.
How error correction works
A QR code does not just store your data once - it also stores extra "check" data calculated from it, using a method called Reed-Solomon error correction. A scanner uses that extra data to reconstruct the original content even if some modules are unreadable, within a limit set by the chosen level. More check data means more resilience, but it also means less of the code's total capacity is left for your actual content.
| Level | Approx. damage tolerated | Typical use |
|---|---|---|
| L | about 7% | Clean digital use, no logo, maximum space for data |
| M | about 15% | General printed use with no logo (UNI-QR's default) |
| Q | about 25% | A small logo, or printing somewhere it might get a little worn |
| H | about 30% | A larger logo, or codes on stickers, packaging or outdoor signage |
Logos and error correction
Placing a logo in the middle of a QR code physically covers some of the data modules underneath it. Error correction is what allows the code to still decode correctly despite that gap - which is why a design with a logo should use a higher level (Q or H) rather than the default. There is still a limit: even H-level correction cannot compensate for a logo that covers too large a share of the pattern, so keep an added logo modest in size relative to the whole code.
Why denser isn't automatically worse
It can feel counterintuitive that adding more error-correction data - which makes the printed pattern visually busier - is meant to make a code more reliable, not less. The density itself is not the problem; a correctly printed high-density code at an adequate size scans exactly as fast as a sparse one. Density only becomes a real issue when the code is also printed very small, where the individual modules start to blur together at the printer's or camera's resolution limit. That is why the practical advice is to match the level to your actual need (a logo, expected wear) rather than always choosing H "to be safe," since the densest level offers no benefit on a clean, logo-free code and only adds unnecessary density.
A worked example
Picture the same QR code printed with M-level correction (about 15% tolerance) and with H-level correction (about 30% tolerance), then both get a coffee-cup ring stain covering roughly a fifth of the pattern. The M-level copy is right at the edge of what it can recover from - it may still scan, or the damage may push it just past what the extra check data can reconstruct, depending on exactly which modules were affected. The H-level copy has roughly double the tolerance of the damage it actually took, so it almost certainly still decodes cleanly. Neither outcome is guaranteed - error correction is a tolerance margin, not a promise - but the gap between the two levels is the difference between a code that might survive real-world wear and one with real room to spare.
Choosing a level in practice
- No logo, used digitally (screen only): L is usually enough, and leaves the most room for data.
- No logo, printed normally: M is a safe, commonly used default.
- Small logo, or a surface that might get a little worn: Q.
- Larger logo, or an outdoor/packaging sticker that will take more wear: H.
Error correction isn't a fix for everything
It is worth being precise about what error correction actually protects against, because it is easy to over-rely on it. It compensates for modules that are missing, obscured or misread - physical damage, dirt, a logo placed on top, or a scuff on a sticker. It does nothing for a code that is simply too small for the scanning distance, printed with low contrast between the dots and background, or missing its quiet-zone margin entirely - those are sizing and design problems, and no error-correction level will fix them. Treat error correction as one layer of reliability among several, alongside good contrast, an adequate print size and a visible margin, covered in full in Scan Reliability.
Whichever level you pick, treat it as a safety margin, not a guarantee - also use UNI-QR's built-in scan test after every design change, and scan a real printed or displayed copy with a phone before relying on it or printing in quantity. See Scan Reliability for the full picture, including contrast and quiet-zone guidance that matter just as much as the error-correction level.
What do L, M, Q and H stand for?
Which level should I use by default?
Does a higher level always make the code more reliable?
Can error correction fix a low-contrast color scheme?
Free QR code generator — complete guide, no login