QR code error correction levels explained

Last updated: July 2026 · About 6 minutes

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:

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:

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.

Open the generator