Skip to content
FlashScan Pro

QR code error correction: levels L, M, Q, H explained simply

A QR code can stay readable with up to 30% of its surface damaged. Levels L, M, Q, H: what each one tolerates and when to raise correction.

The redundancy that saves damaged codes

A QR code doesn’t just encode your message: it also encodes the means to rebuild it. Thanks to Reed-Solomon error correction, part of the pattern is redundancy — backup data that lets a reader recover the content even when modules are unreadable, dirty, torn, or covered. It’s the mechanism that makes central logos possible and lets a code survive real-world wear.

The correction level chooses the dose of redundancy: L, M, Q, or H.

What each level tolerates

Level Approximate recovery Profile
L (Low) ~7% “Clean” use: screen, document, ephemeral code
M (Medium) ~15% Reasonable default: flyers, cards, links
Q (Quartile) ~25% Exposed environments: labels, outdoors
H (High) ~30% Central logo, risky surfaces, codes that will live

These percentages measure the surface of modules that can be lost while remaining reconstructible — not an absolute guarantee: where the damage sits matters. The three large finder squares in the corners and the timing bands are not replaceable; a crease crossing one kills the code at any level.

A concrete feel for the trade-off

Take the same short URL rendered at level M and at level H: the H version visibly packs more modules into the same square — the pattern looks “busier.” At business-card size, those smaller modules sit closer to the phone’s resolution limit; at poster size, nobody notices. This is why the level choice interacts with print size: a dense H code printed at 2 cm can be less reliable than an airy M code at the same size, despite the better theoretical budget. The complete sizing math is in QR code print size.

Reed-Solomon in two sentences

Invented for space transmissions and popularized by the CD, Reed-Solomon coding appends redundancy symbols computed over the message: as long as the number of lost symbols stays under the chosen level’s budget, the reader recovers the exact message — no approximation, no visible “repair.” It’s mathematical reconstruction, not interpolation: the recovered content is identical to the encoded content.

The trade-off: redundancy vs density

Correction isn’t free. At identical content, moving from M to H means encoding more redundancy — hence a pattern with more modules, denser, with smaller elementary squares at equal print size. An H code is more resistant but demands slightly better reading conditions: sufficient size, sharpness, light. That’s exactly the trade-off to arbitrate:

  • L suits codes shown on screen or printed in a controlled context — where wear doesn’t exist.
  • M — the default in FlashScan Pro’s generator — covers the vast majority of print uses: flyers, cards, documents.
  • Q is justified when the medium faces constraints: warehouse labels, outdoor stickers, handled packaging.
  • H is reserved for two cases: the central logo (which deliberately covers ~22% of the surface — see QR code with logo) and codes meant to survive years or hostile conditions.

What correction can’t repair

Redundancy rebuilds data, not the reading structure. Three zones stay vital:

  • The three finder squares in the corners: they let the reader locate the pattern and measure its rotation. Covering one makes the code unfindable, whatever redundancy remains.
  • The timing bands linking the squares: they provide the reading grid.
  • The quiet zone around the pattern: without a clear band, the decoder doesn’t know where the code starts.

In other words: error correction forgives stains, creases, glare, and the central logo — it forgives neither cropped edges, nor a broken finder square, nor a background bleeding into the margin.

The logo case: why H is enforced

A central logo isn’t decoration — it’s a planned damage zone. At level M, the ~15% tolerance would be entirely consumed by the logo, leaving zero margin for glare, creases, or dirt. That’s why FlashScan Pro forces level H and locks the selector as soon as a logo is loaded: it’s the only configuration where the math holds. Removing the logo re-enables the choice.

Where the levels come from

The four letters aren’t arbitrary labels: they’re defined by the QR standard itself, and every compliant code carries its level in the format information bits of the pattern — the reader knows the budget before it starts decoding. L and M dominate general use; Q and H exist because the standard was designed for industrial environments — factory floors, warehouse labels, components that get scratched — where a code that fails costs more than a denser pattern.

Choosing in practice

Ask two questions: will the pattern be deliberately altered (logo → H)? Will the medium face wear (yes → Q or H, no → M, screen only → L suffices)? Then remember the other variable: content length. A short URL at level M yields a sparser pattern than a long text at H — when readability matters, shortening the content is often more effective than raising the level.

For sizing the printed code accordingly, the numbers are in print size.