QR error correction: what L, M, Q and H really buy you

Every QR code carries spare data that lets a scanner reconstruct modules that are dirty, damaged, or deliberately overwritten by a logo. That spare capacity comes in four levels — and picking the right one is the difference between a code that survives a scratched laminate and one that dies, or between a logo that fits and a code that got needlessly huge.

The four levels

The mechanism is Reed–Solomon coding — the same math CDs and satellite links use. The percentages are of codewords (data bytes), which is roughly but not exactly a percentage of visual area: damage concentrated in one spot is worse than the same damage scattered.

What error correction can and cannot fix

The trade-off people miss

Higher levels aren't free: redundancy is extra data, so the code needs more modules. Jumping from L to H can push a long URL from version 4 (33×33) to version 6 (41×41) — smaller modules at the same print size, which itself hurts scannability. Two practical consequences:

Which level for which job

How much logo can level H afford?

A center logo overwrites modules in one concentrated block — the worst case for Reed–Solomon. Keep the logo to ~20% of the code's area at most even at level H, leaving margin for real-world damage on top of the logo. Good generators enforce this; ours also runs a live decode check so you see immediately if a design crossed the line.

Set it in practice

  1. In the free generator, error correction sits in the advanced options — L/M/Q/H.
  2. Adding a logo or pixel art? The generator switches to H automatically and verifies the result decodes.
  3. Printing on difficult material? Pick Q/H manually, and print a proof.

FAQ

Does higher error correction make scanning faster? No — an undamaged M code and H code scan equally fast. The level only matters when modules are lost.

Can I change the level after printing? No — it's encoded in the format information of the printed code. Reprint to change it.

Which level do dynamic codes use? Same choices — static vs. dynamic is about what's encoded, not how it's protected. Dynamic codes encode short URLs, so they can afford H cheaply.

Is 30% damage a guarantee? It's an upper bound under ideal conditions and scattered damage. Treat H as "robust", not "indestructible" — and never sacrifice the quiet zone or finder corners.

Generate a free QR code that never expires

No signup. No subscription. Generated in your browser.

Open the free generator →