QRCodeForge

QR code error correction levels explained

Every QR code carries more data than its actual payload needs, on purpose. That extra data is redundancy — a mathematical scheme that lets a decoder reconstruct the original message even if part of the printed code is missing, smudged, or scanned under poor conditions. How much redundancy gets added is a choice, made at generation time, between four standard levels: L, M, Q, and H. None of them is simply “the good one” — each sits at a different point on a real trade-off, and picking the right one depends on where the code is actually going to live.

What L, M, Q, and H mean

The four levels are ordered from least to most redundant: L (Low) carries the smallest amount of error-correction data, M (Medium) more, Q (Quartile) more again, and H (High) the most of all. A code generated at a higher level can tolerate proportionally more of its printed pattern being damaged, obscured, or misread and still decode correctly to the exact original payload. This isn’t a vague “more reliable” label — it’s a specific, quantified capacity: the QR standard (ISO/IEC 18004) gives each level an approximate codeword recovery capacity of L ≈7%, M ≈15%, Q ≈25%, H ≈30% — the share of a code’s data codewords that can be wrong or missing and still be reconstructed correctly.

A word of caution on that last number. H’s roughly 30% codeword recovery capacity and this site’s own measured 30% logo-width ceiling at level H are two different measurements of two different things that happen to share a number by coincidence, not by relationship — one is a share of data codewords, the other a share of a code’s physical width that a logo can occlude. Do not treat one as explaining or confirming the other.

The trade-off nobody mentions: higher levels make the code bigger

Error correction isn’t free, and the cost isn’t cost in money — it’s density. The redundant data added at a higher level occupies real space inside the code, so for the same payload, a code generated at H contains more modules packed into the same symbol than the same payload generated at L. In practice this usually shows up as a jump to a larger version of the QR format to accommodate the extra data, meaning the printed code needs to be physically larger to keep each module resolvable at a given viewing distance, exactly per the 10:1 sizing rule. A code carrying a long URL at H can end up noticeably denser, and therefore needing a larger minimum print size, than the identical URL encoded at L. Choosing H by default “to be safe” has a real cost if it isn’t actually needed.

Why this matters for logos specifically

The same redundancy that recovers from smudges and scratches is what a centre logo eats into when it blocks part of the code. A logo at a given size is safer at H than at L for exactly this reason — H simply has a larger error-correction budget left over after the logo’s occlusion is subtracted from it. This is why the safe logo-size ceilings climb steadily from L through H rather than being a single number that applies regardless of level.

How to actually choose

Use H for anything printed and physical. Printed material accumulates real damage over its life — fading, scuffing, a coffee ring, a fold, a sticker partially peeled and reapplied slightly askew — and printed codes also can’t be fixed once damage happens, unlike a code shown digitally that can simply be redisplayed. The combination of unavoidable physical wear and no ability to recover after the fact makes the largest error-correction budget the sensible default for packaging, posters, signage, business cards, and anything else that leaves a screen for good.

Use M for anything shown on a screen. A code displayed on a website, in an email, or on a digital ticket doesn’t accumulate scratches or fading the way printed material does, and it’s trivial to regenerate or refresh if something ever does go wrong with it. M gives a comfortable, everyday level of robustness without the density cost of Q or H, and the smaller resulting code is easier to fit cleanly into a page layout or an app screen.

Reach for Q when a code is printed but not glanced at from far away — our product label generator defaults to it for exactly this reason: labels get scuffed in transit and on shelves, but they’re read up close, not across a room, so Q’s middle ground of robustness and density fits better than jumping straight to H.

The short version

Higher error correction means more resilience and a physically denser code; lower means the reverse. Default to H for anything printed, M for anything on a screen, and treat the choice as one variable in the same sizing calculation as viewing distance and logo size — not a setting to leave on whatever the generator defaults to without thinking about where the code is actually going to end up.

Make a free QR code with QRCodeForge — every format free, no signup, and every code checked before you download it.