QR Code Error Correction Levels: L, M, Q and H Explained
The error correction level of a QR code decides how much of the pattern can be damaged or covered while the code still scans. There are four levels, L, M, Q and H, defined in the ISO/IEC 18004 standard. The higher the level, the more damage the code survives, and the denser the pattern becomes. GenerateQR.link always uses the highest level, H, so logos and styling stay scannable.
This article explains what each level means, what you give up when you go higher, and how to avoid the mistakes that make styled codes fail.
What error correction does
A QR code carries extra recovery data next to your actual content. When a scanner cannot read part of the pattern, because of a scratch, a stain, a fold, a smudge or a logo placed on top, it uses that extra data to fill the gap and still returns the right result.
This is why a worn sticker on a shop counter or a flyer that spent a week in a bag often still scans. It is also why you can place a logo in the middle of a code. The logo hides part of the pattern, and the recovery data covers for it.
Error correction is not magic. If the damage goes beyond what the level allows, or if it hits the three large corner squares the scanner uses to find the code, the scan fails.
The four levels: L, M, Q and H
Each level can recover a different share of the code. The percentages are approximate.
| Level | Recovery capacity | Pattern density | General guidance |
|---|---|---|---|
| L (Low) | about 7% | Least dense | Often considered for clean screens and short data without styling |
| M (Medium) | about 15% | Moderate | Often considered for printing in controlled conditions |
| Q (Quartile) | about 25% | Denser | Often considered for prints that may get dirty or worn |
| H (High) | about 30% | Densest | Often considered for logos, heavy styling and rough surfaces |
The last column is general guidance, not a rule. The right level depends on your content, your print quality and where the code will be used.
What the percentages mean
At level L, about 7% of the code can be damaged or covered and it will still read. At H, that figure is about 30%. The percentage refers to the code as a whole, not to a single spot. Damage in one corner is treated differently from the same amount of damage spread evenly, and a covered area right on the finder squares is far more harmful than a covered area in the middle. Treat the numbers as a rough guide, not a guarantee.
The density trade-off
More recovery data means more squares (modules) in the pattern. At the same printed size, each module becomes smaller. Smaller modules are harder for a phone camera to separate, especially from far away, on low-quality paper or with a cheap printer.
That creates a real trade-off:
- Low level: a simpler pattern with larger modules, easier to read at a small size, but less forgiving of damage.
- High level: a denser pattern with smaller modules, tougher against damage and logos, but it needs more print size or better print quality to stay sharp.
The amount of data matters too. A long URL, a long WiFi password or a full contact card produces a denser pattern than a short link, at any level. If your code looks crowded, shortening the content often helps more than lowering the level. A dynamic QR code is useful here, because the pattern holds a short link instead of your full destination. If you are not sure which type you need, read static vs dynamic QR codes.
For guidance on how big to print, see QR code size for printing. As a rule of thumb, about 2 x 2 cm is a minimum for close scanning, and you should go bigger for distance. Denser codes need the larger end of that range.
Why logos need a higher level
A logo in the center works by covering part of the pattern. The scanner cannot read those modules, so it relies entirely on error correction to rebuild them. At level L, that spare capacity is small, so even a modest logo can push the code past what it can recover. At level H, there is far more room.
Custom styling also changes how the scanner sees the pattern. Rounded dots, diamonds, circular corners and colored modules all make the shapes slightly less standard than plain black squares. A higher level gives the scanner more margin to cope with that.
Even at H, keep the logo small and centered, and never place it over the three corner squares. The 30% figure is the upper limit for damage, not a target for how much of the code you should cover. Using all of it leaves nothing for a scratch or a bad print.
Which level GenerateQR.link uses
The generator uses the highest level, H, for every code. You do not have to choose a level, and you cannot end up with a logo on a code that was set too low.
This fits the styling options on the site: dot shapes (square, rounded, dots, diamond), corner styles (square, rounded, circle), custom colors, a logo in the center, and a frame with text above or below. You can download the result as PNG or SVG. SVG is a vector format, best for printing at any size, while PNG is fine for screens and small prints.
The trade-off applies here as well. Level H makes the pattern denser, so with a long piece of content the code can look busy. Two ways to keep it calmer:
- Shorten the content. Use a short URL, a shorter text or fewer fields in a contact card.
- Use a dynamic code for URL, Email, Phone, WhatsApp or SMS. The pattern then holds a short link in the form https://generateqr.link/r/ followed by a short code. Dynamic codes are free but need a free account. For details, see the free dynamic QR code generator guide.
WiFi, plain text, vCard and UPI codes are static only, so their density depends directly on the content you enter. A vCard is the most common case where the pattern gets crowded, because it is a text block from BEGIN:VCARD to END:VCARD. If it scans poorly, remove fields you do not need, such as a long address or notes. You can make one with the vCard QR code generator.
How to think about the level if you can choose
If you use another tool that lets you pick a level, this is general guidance rather than a fixed rule:
- Short content shown on a screen: a lower level such as L or M may be enough, and the pattern stays simple.
- Printed on paper: a middle level such as M or Q is a common choice.
- Outdoor, handled often, on packaging, or likely to get scuffed: Q or H may be worth considering.
- Any logo or heavy styling: H.
When in doubt, a higher level with a slightly larger print is often a safer combination than a small code at a low level.
Common mistakes and how to fix them
The code scans on screen but not on paper
The print may be too small for the density, or the printer may blur the modules. Printing larger often helps, and SVG gives sharp edges at any size.
Low contrast colors
Light dots on a slightly lighter background are hard to read. Use a dark code on a light background, and avoid inverted codes (light on dark).
No empty margin
The quiet zone is the empty border around the code, about 4 modules wide. If text, images or edges run into the code, scanners may struggle to find it. Leave the margin clear, even inside a frame.
Too much content in one code
A long URL or a big block of text makes the pattern crowded. Shorten the content, or use a dynamic code so the pattern only holds a short link.
Skipping the test
A code that looks right can still fail. Scan the final version with at least one real phone before printing a batch, from the distance people will actually use.
If you want to try this yourself, open the QR code generator, add your content, style the code and download it. The steps are also covered in how to create a QR code for free.
Frequently asked questions
Which QR code error correction level is best?
There is no single best level. H is the safest choice for logos, styling and rough surfaces, while lower levels give a simpler pattern for short data on clean screens. If you are unsure, use H and print a little larger.
Does a higher error correction level make a QR code harder to scan?
It can, at small sizes. Higher levels add more modules, so each one gets smaller at the same print size, and a low-quality print or a long distance can blur them. Printing larger often helps, and SVG gives sharp edges at any size.
Can I choose the error correction level on GenerateQR.link?
No, the generator always uses the highest level, H. That keeps logos and styled dots or corners scannable without extra settings.
Does the error correction level change what the QR code contains?
No. The URL, text or other data stays the same. Only the amount of recovery data added to the pattern changes, which affects how dense it looks.
Does error correction protect a code if the printed corner squares are damaged?
Not reliably. The three large corner squares help the scanner locate the code, so damage or a logo covering them can cause a failed scan even if the total damage is below the percentage for your level.