Every QR code carries a little insurance policy. Even if part of the code is scratched, smudged, folded or covered by a logo, a phone can often still read it. That insurance is called error correction, and QR codes come with four levels of it: L, M, Q and H. Picking the right level is a trade-off between how much damage the code can survive and how dense, and therefore how hard to scan at small sizes, the pattern becomes. Here is how it works in plain English.
What error correction does
A QR code stores your data, such as a web address, as a series of bytes called codewords. When the code is created, extra recovery codewords are calculated from your data using a method called Reed–Solomon error correction, the same family of techniques used on CDs and in many digital storage systems. Those extra codewords are spread through the pattern alongside your data.
When a scanner reads the code, it uses the recovery codewords to rebuild any data codewords it could not read. The higher the level, the more recovery codewords there are, and the more damage the code can tolerate.
The four levels
The QR code standard defines four levels. The percentages are the approximate share of codewords that can be restored:
| Level | Can recover about | Typical use |
|---|---|---|
| L (Low) | 7% | Clean screens and controlled conditions |
| M (Medium) | 15% | Everyday print: flyers, menus, business cards |
| Q (Quartile) | 25% | Surfaces that may get scuffed, dirty or worn |
| H (High) | 30% | Codes with a logo in the center, or harsh conditions |
An important detail: those percentages refer to codewords, not to a neat share of the visible area. Damage in the wrong place can break a code even when the area covered is small, as explained below.
The trade-off: robustness versus density
Recovery codewords take up space. For the same data, a higher level needs more codewords, so the generator has to pick a bigger grid of modules (the small black and white squares). A bigger grid printed at the same size means smaller modules, and smaller modules are harder for a camera to resolve from a distance or in poor light.
Worked example: one URL at four levels
We encoded the 36-character address https://example.com/spring-menu-2026 with the same open-source QR library QR Studio uses, letting it pick the smallest grid for each level:
| Level | Grid (modules per side) | Module size at 3 cm wide |
|---|---|---|
| L | 29 × 29 | about 1.03 mm |
| M | 29 × 29 | about 1.03 mm |
| Q | 33 × 33 | about 0.91 mm |
| H | 37 × 37 | about 0.81 mm |
The module size is simply 30 mm divided by the number of modules per side, not counting the quiet zone. Moving from M to H made every module about 20% smaller on the same printed size. On a large poster that hardly matters. On a tiny label or a business card, it can be the difference between an instant scan and a frustrating one. Our guide to the minimum QR code size shows how to turn module counts into a safe print size.
The same effect limits capacity: at the largest QR size, a code at level H holds well under half as much data as one at level L.
Make a free QR code for a link, WiFi or contact card — generated in your browser.
Open the free QR code generator →How to choose a level
- Screens, slides and emails: L or M. The code will not get physically damaged, so a simpler grid is easier to scan.
- Everyday print: M is a sensible default for flyers, menus, table tents, packaging and business cards.
- Rough handling or outdoor use: Q for stickers, shipping labels, equipment tags and signs exposed to weather, dirt or scuffing.
- A logo in the middle: H. The logo hides part of the pattern, and the extra recovery data is what lets the code still work.
- Very small codes: stay at L or M, shorten the data and skip the logo, so the modules stay as large as possible.
If you are unsure, the honest answer is to print a test and scan it on a few different phones at the real distance and lighting.
How QR Studio handles error correction
QR Studio picks the level for you so you do not have to think about it:
- With no logo, it uses M (medium), a good balance for most print and screen uses.
- When you add a logo, it switches to H (high) so the code can recover the area the logo covers.
If a code with a logo looks dense or will not scan at a small size, the easiest fix is to remove the logo. That drops the code back to M and gives you a simpler grid.