A QR code keeps scanning reliably even when you overlay a logo or the printed material gets a little dirty. What underpins this "robustness" is a mechanism called Error Correction. In this article, we explain how it works and how to choose the right level in practice.
What is error correction?
A QR code embeds redundant recovery data alongside the data itself. Even when part of the code is missing or soiled at scan time, this redundant data lets the original information be recovered through calculation. This is called error correction.
The recovery process relies on Reed-Solomon codes, which are also widely used in CDs and data communications. They treat the data as a polynomial and exploit the property that up to a certain number of errors can be mathematically restored to the original.
The four error correction levels
The QR code specification defines four levels based on how much data can be recovered. The higher the level, the more resistant to damage, but the more redundant data is added — so even with the same information, the code becomes more complex (more cells).
| Level | Recovery guideline | Characteristics / suitable uses |
|---|---|---|
| L (Low) | about 7% | Lightest. For clean digital displays or when you want to keep capacity down. |
| M (Medium) | about 15% | A standard balance. The most commonly used for general printed materials. |
| Q (Quartile) | about 25% | For somewhat harsh environments, such as factories or outdoors. |
| H (High) | about 30% | The most robust. Essential for embedding logos and for design QR codes. |
How each level looks (compared with the same content)
The samples below were all generated from the exact same URL at each level. As the level rises, redundant data increases and you can see the cells become denser. Scanned with a smartphone camera, all of them return the same URL.
Why does it still scan with a logo on top?
The reason you can place a logo at the center of a design QR code is that it uses level H (about 30%) error correction, so even when the area hidden by the logo is treated as "missing," it can be recovered from the remaining data. In other words, the redundancy is reserved in advance, on the assumption that part of the code will be broken for the logo's sake.
However, if the hidden area exceeds the correction capacity, it naturally becomes unreadable. Design appeal and scan accuracy are a trade-off, so real-device scan testing is indispensable.
Demo: still scannable with a logo on top
We placed a logo-style white frame over the center of a QR code generated at level H. The right one has the logo, and we show the result of actually attempting to decode it in the browser.
Demo: damage it (feel the limits of error correction)
As you hide the center with the slider (the same situation as overlaying a logo), we actually decode the QR code in the browser to judge how far it holds up. Try switching the error correction level and compare. You can see that L stops reading with only a little coverage, while H holds up even when the center is largely hidden. The position detection patterns (the three corners) are protected.
* This is only a guideline to get a feel for how it works. Real-device scanning also depends on camera performance and print quality.
How to choose in practice
- Screen display / capacity priority → L or M
- General posters, business cards, flyers → M (standard)
- Outdoors, factories, abrasion-prone environments → Q
- Logo-embedded design QR → H
Raising the level may seem safer, but as the cell count grows and the code becomes finer, it can actually become harder to read with low-resolution printing or low-spec cameras. The right approach is not "higher is better," but choosing to match the use case.
Free Tool Verify it with QR Code Analyzer Upload a QR code you have and analyze its error correction level, version, and mask pattern. Free Tool Push the limits with QR Code EC Tester Visually verify how far a QR code stays readable at each error correction level while partially hiding it. Free Tool Create and test with QR Code Generator Generate a QR code by specifying error correction level, size, margin, and color, then download it as PNG or SVG.Summary
A QR code's "robustness" is backed by solid mathematics — error correction via Reed-Solomon codes. The four levels L/M/Q/H each strike a different balance between redundancy and complexity, and choosing the right one for the use case affects scan accuracy. To balance design and practicality, we recommend verifying with real tools.
For the QR code specification as a whole (version, data capacity, structure, mask), also see the related article "Fully Understanding QR Code Specifications".
Frequently Asked Questions (FAQ)
What is QR code error correction?
In addition to the data itself, redundant recovery data is embedded alongside it, so even if part of the code is missing or soiled, the original information can be recovered through calculation. Reed-Solomon codes are used for this recovery process.
What is the difference between error correction levels L/M/Q/H?
They differ in how much data can be recovered: roughly 7% for L, 15% for M, 25% for Q, and 30% for H. The higher the level, the more resistant to damage, but the more redundant data is added, making the code denser and more complex.
Why can a QR code still be scanned with a logo placed over it?
It uses level H (about 30%) error correction, so even when the area hidden by the logo is treated as missing, it can be recovered from the remaining data. However, if the hidden area exceeds the correction capacity it becomes unreadable, so real-device scan testing is essential.