QR code error correction: L, M, Q and H explained
What each level recovers, what it costs in density, and how to choose. Plus why "always use H" is wrong more often than people think.
Error correction is why a QR code still reads with a coffee ring on it, and why you can put a logo in the middle at all. It is also the setting people most often get wrong in both directions.
The mechanism
When a QR code is generated, part of the pattern is not your data — it is recovery data, computed from your data using Reed–Solomon coding, the same family of maths used on CDs and in deep-space transmission.
If some modules are unreadable, the decoder uses the recovery data to reconstruct them. It does not guess; it solves. Below the threshold it recovers perfectly, and above it fails completely. There is no partial read.
The four levels
| Level | Recovers | Data capacity cost |
|---|---|---|
| --- | --- | --- |
| L — Low | ~7% | Smallest code for the same content |
| M — Medium | ~15% | The default in most tools |
| Q — Quartile | ~25% | Noticeably denser |
| H — High | ~30% | Densest for the same content |
The percentages are of the *codewords*, roughly the code area. So level H can lose almost a third of the pattern and still decode.
What it costs
Recovery data occupies space. Encode the same URL at L and at H and the H version needs more modules — a bigger grid.
At the same printed size, more modules means each module is physically smaller. And small modules are the thing that fails: on absorbent paper the ink spreads and closes the gaps; at distance the camera cannot resolve them.
So the trade is real and runs both ways:
Higher error correction protects against damage and hurts against small printing.
This is why "always use H" is bad advice. On a 1,5 cm business card with a long vCard, H can produce a code so dense that it fails on a clean print — while M would have worked.
Choosing, in practice
Use H when: - A logo covers part of the code — this is non-negotiable - The code lives somewhere harsh: kitchen, workshop, outdoors, industrial label - It is printed on fabric, cardboard, or a curved surface - The code is large enough that extra density costs nothing
Use M when: - Normal print, normal paper, no logo - Screen display - You have no specific reason to change it
Use Q when: - Mild damage expected but the payload is long - A small logo and you are tight on space
Use L when: - The payload is long *and* the code is only ever shown on a clean screen - You need the smallest possible module count and control the environment
The logo maths
This is the part worth internalising.
Level H recovers ~30%. A logo covering 25% of the area uses most of that budget. The remaining 5% is what handles scratches, smudges, uneven ink and print misregistration.
Spend all 30% on the logo and the code is *technically valid and practically fragile* — it passes on your monitor and fails on a card that has been in a wallet for a week.
So: logo at 25% or less, with H. Below 20% is safer and usually looks better anyway.
And remember coverage is measured by area. A logo half the width of the code covers 25% of the area, not 50%. People get this wrong in both directions.
What error correction cannot fix
It repairs *data* modules. It cannot repair structure:
- The three corner squares — position markers. The scanner needs them to find and orient the code. Cover one and the code is not damaged, it is invisible
- The timing patterns — the alternating lines between the corners, which establish the module grid
- The quiet zone — the 4 modules of empty margin. No amount of error correction substitutes for it
This is why logos go dead centre: the middle is pure data, which is exactly what recovery knows how to rebuild.
How to check what you have
Our QR code tester decodes an uploaded code and reports module size, contrast and quiet zone. And our generator raises the level to H automatically the moment you upload a logo, then tells you the exact percentage your logo covers — so you are not guessing.
In short
- Four levels: L ~7%, M ~15%, Q ~25%, H ~30%
- Higher correction resists damage but forces smaller modules at the same print size
- M is the right default; H whenever there is a logo
- Logo at 25% of area or less — the rest of the budget belongs to real-world wear
- Error correction never repairs the corner markers, timing patterns or quiet zone