QRDone
Fundamentals6 min readMay 7, 2026

QR Code Error Correction Explained: Get Your Codes Scanning Every Time

What L, M, Q, and H actually mean, why level H lets you put a logo in the middle, and how much damage your code can survive before scans start failing.

Every QR code has a small percentage of its data set aside on purpose, used only to recover from damage. That percentage is the error correction level, and choosing the right one is the difference between a code that scans through coffee stains and one that fails the first time someone holds a phone at a slight angle.

The four levels at a glance

The QR specification (ISO/IEC 18004) defines four error correction levels. Each one trades data capacity for damage tolerance.

LevelData recoverableUse it for
L (Low)7%Clean digital surfaces, big screens, posters indoors.
M (Medium)15%Most marketing print. The default in many tools.
Q (Quartile)25%Outdoor, packaging, anything that might get scuffed.
H (High)30%Logos in the centre, restaurant tables, harsh environments.

What does "7% recoverable" actually mean?

It means the scanner can rebuild the original message even if up to 7% of the modules (the little black squares) are missing, misprinted, or covered up. Real world testing puts the practical ceiling a bit higher: at level Q or H, codes still scan reliably with around 20% of the surface obscured, because the maths behind Reed Solomon coding is generous when damage is contiguous (a coin sized blob) rather than scattered noise.

The level H trick: logos in the middle

Every branded QR code you have ever seen with a logo in the centre relies on this. The logo is just a deliberate, controlled blob of damage. As long as the logo covers less than the recoverable percentage of the code area, the scanner reconstructs the missing data and your code still scans perfectly.

Practical guidance:

  • At level H, a logo can cover up to 25% of the code area safely. Stay under that and you have margin for print error too.
  • Centre the logo. The corners and edges of a QR code are where the position markers and timing patterns live. Damage there is much harder to recover from than damage in the middle.
  • Use a solid background behind the logo (a white or coloured circle). Floating logo art on top of dark modules confuses the scanner.

Why higher is not always better

It is tempting to default everything to H. There are two reasons not to.

  • Density. Higher error correction means more modules in the same code, because the redundant data has to live somewhere. A short URL at level L might be a 21 by 21 grid. The same URL at level H jumps to 25 by 25 or higher, which means each module is smaller for the same printed size, which means scanning is harder from a distance.
  • Capacity. Higher levels eat into how much data you can store. A 100 character URL fits comfortably at level M but might require a bigger code at level H.

How to choose, in one sentence

Use level H if your code has a logo or will live on a messy surface; use M for most digital and clean print; use Q if you are not sure. Almost no one needs L outside of API integrations where every byte matters.

What QRDone uses by default

Every preset in QRDone uses level H out of the box. The reasoning is simple: most people drop a logo into the centre at some point, most printed codes get touched, and the size penalty is invisible at typical poster and table tent dimensions. If you are scanning from across a room and need every pixel of resolution, switching to M is a one line change in the code, but for 95% of use cases H is the safer default.

Other things that affect scan reliability

Error correction is not the only knob. Three other factors break more codes than damage does:

  • Quiet zone. Every QR needs a four module margin of clear space around it. Crop too tight and scans drop fast.
  • Contrast. Dark modules on a light background, at least a 4.5:1 contrast ratio. Inverted colour codes scan poorly on most cameras.
  • DPI at print. Print at 300 DPI minimum, 600 DPI for anything small or commercial. SVG export skips this entirely because it scales cleanly.

The takeaway

Set your default to H, leave the quiet zone alone, keep the colour contrast strong, and your codes will scan from any phone in any lighting. Open QRDone, drop a logo in the centre, download as SVG, and you have a code that survives almost anything you throw at it.

#technical#best-practices

Make your QR code now

Free, no signup, beautiful by default. Pick a type, fill it in, download.

Open QRDone →

Read next