QR code error correction levels explained
Every QR code carries redundant data so it can still be read when part of it is damaged, dirty, or covered. How much redundancy is the error correction level, and you choose it: L, M, Q or H. This guide explains what you are trading away and which level to pick.
The four levels
| Level | Name | Recoverable damage | Cost |
|---|---|---|---|
| L | Low | ~7% | Smallest, sparsest pattern |
| M | Medium | ~15% | The common default |
| Q | Quartile | ~25% | Noticeably denser |
| H | High | ~30% | Densest pattern |
"Recoverable damage" means the proportion of the code's data that can be destroyed while the whole message is still reconstructed correctly. At level H, roughly a third of the code can be missing and it still scans.
What you pay for it
Redundancy is stored in the pattern, so a higher level means more modules — more little squares — for the same URL. That has a practical consequence people often miss:
At a fixed physical size, a higher error correction level makes each module smaller. Smaller modules are harder for a camera to resolve. So level H is not automatically more reliable — pushed onto a code that is already small, the denser pattern can be less readable than level M would have been, even though it tolerates more damage in principle.
The two effects work against each other, which is why the right answer depends on the physical situation rather than on "more is better".
Which to choose
Level M — the default, and usually right
Use M unless you have a specific reason not to. It handles the ordinary wear of a printed page, a screen, or a laminated card. Every level in this tool defaults here.
Level L — screens and clean, controlled contexts
Choose L when the code will be scanned off a screen, or from paper that will not be handled, and you want the sparsest possible pattern. It is also the best choice when your URL is long and the printed size is fixed and small, because it keeps the modules as large as they can be. Do not use it for anything that will live in the physical world for months.
Level Q — printed labels and anything handled
This is the level for asset tags and inventory labels: equipment that gets moved, wiped down, scraped past doorframes. Also good for event badges, which spend a day being creased inside lanyards.
Level H — logos, harsh conditions, generous size
Reserve H for three situations:
- A logo in the middle. Covering the centre of a code destroys data, and only H reliably tolerates it. This is the main reason H exists in practice.
- Genuinely harsh environments — outdoor signage, or anywhere the surface will be scratched or partly obscured.
- Large printed codes where the extra modules cost you nothing because there is plenty of physical space.
Setting it here
The generator has an Error correction dropdown alongside the size and format options. It applies to every code in the batch, and to both PNG and SVG output — the level changes the pattern itself, not the file format.
Because it is a batch-wide setting, split your run if different codes need different levels: generate the outdoor signage at H, then generate the screen-facing codes at M.
Level and size together
The two settings interact, and the combinations that work look roughly like this:
| Situation | Level | Size |
|---|---|---|
| On-screen, web page, email | L or M | 300 px |
| Event badge, business card | Q | 300 px |
| Asset label on equipment | Q | 300–600 px |
| Flyer, table tent, menu | M | 600 px |
| Outdoor sign, poster | H | 1000 px or SVG |
| Code with a logo overlaid | H | 600 px or larger |
The shortcut that beats all of this
Shortening the URL reduces the module count far more dramatically than
lowering the error correction level ever will. A code encoding
https://ex.co/a1 at level H can easily be sparser — and
therefore more scannable — than one encoding a long tracking URL at level
L.
If a code has to be small and reliable, the first move is a shorter URL, not a lower level. Redirecting through a short path on a domain you control also means you can change the destination later, which static QR codes otherwise do not allow.
What actually damages codes in service
Error correction protects against the code being obscured, and it helps least against the failure people expect it to fix. Codes that stop working after weeks in the field are usually suffering from one of these:
- Abrasion on labels that get handled or slid across surfaces. This is genuine damage, and where levels Q and H earn their place.
- Glare from gloss lamination. Error correction does nothing here — the camera cannot see the pattern at all. Specify matte.
- Creasing on badges and pouches. A fold through the middle destroys a contiguous block, which is harder to recover from than scattered specks even at the same percentage.
- Fading on thermal labels left in sunlight. Contrast drops until nothing resolves; again, not a redundancy problem.
So raise the level for things that get physically knocked about, and fix the others with material choices instead. Why your QR code will not scan works through the full list of causes.
Whatever you choose, print one code at the real size on the real material and scan it under the real lighting. That single test tells you more than any table.