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.