QR code error correction levels explained
Every QR code includes built-in redundancy so it can still be read even when part of it is dirty, damaged, or covered. That redundancy is called error correction, and you can choose how much of it to include.
Understanding the four levels helps you balance two things: how robust the code is, and how much data it can hold at a given size. The right choice depends on where and how the code will be used.
The four error correction levels
The QR code standard defines four levels, each named by a letter. The letter indicates how much of the code can be reconstructed if it's damaged or covered:
- L (Low) — recovers up to 7% of the codewords. Produces the densest (smallest) code for a given amount of data. Best for clean digital display where the code won't be physically damaged.
- M (Medium) — recovers up to 15%. A balanced default. Handles minor print imperfections and light scuffing without adding significant density.
- Q (Quartile) — recovers up to 25%. A good choice for codes printed in busy environments, affixed to surfaces, or exposed to moderate wear.
- H (High) — recovers up to 30%. The most robust level, and the required choice any time a logo or other graphic covers part of the code.
How error correction actually works
QR codes use Reed–Solomon error correction — the same family of mathematics used on CDs and DVDs, and in deep-space radio transmissions where you can't just ask for a retransmit. It works by encoding extra redundancy data alongside your content, woven through the code in a way that lets a decoder mathematically reconstruct missing or corrupted values.
In a QR code, each unit of data is called a codeword (8 bits). At level H, roughly 30% of the total codewords are redundancy — so even if 30% of the code's surface is destroyed, unreadable, or covered by a logo, a scanner can reconstruct what those codewords said and decode the full content.
The practical implication: higher error correction means more codewords devoted to redundancy and fewer available for your actual data. At a fixed physical size, a higher level produces a denser grid with more and smaller modules. This is why choosing L for a short URL produces a sparse, open-looking code, while H on the same URL produces a noticeably busier grid.
Error correction vs code size and module count
A QR code's 'version' (numbered 1–40) determines the grid size — version 1 is 21×21 modules, version 40 is 177×177. Increasing the error correction level forces a higher version number (larger grid) to hold the same content. That means:
- At level L, a short URL might fit in a 25×25 grid. At level H, the same URL might need a 33×33 grid — more modules, physically larger if you want each module to remain the same size.
- If you're printing very small (say, a QR code on a luggage tag), a higher level requires either a larger physical print size or smaller individual modules — both of which affect scannability at distance.
- For high-density data like a full vCard or a long URL, the size difference between levels is proportionally larger. Qrop shows you the output at your chosen level so you can see the density before generating.
Which level should you choose?
For most purposes, Medium (M) is the right default — it survives minor smudges and printing imperfections without bloating the code. Here's when to step up:
- Outdoors or high-traffic areas: choose Q or H. UV, rain, dust, and physical contact degrade print quality over time.
- Curved surfaces (bottles, cups, tubes): use Q or H. Curvature distorts the grid and reduces effective scannability.
- Small print sizes: use M or Q. More error correction gives the scanner more room to compensate for a slightly blurry module at small size.
- With a logo: always use H. The logo covers part of the code's surface, and only level H reliably tolerates that coverage. Qrop sets this automatically when you add a logo.
- Digital display only (screen, PDF): L is fine. Clean rendering means no smudging or physical damage to worry about.
Logos and error correction: why H is mandatory
Embedding a logo in the centre of a QR code is popular for branding, and it works — but only when error correction is set to H. Here's why: the logo covers a portion of the code's modules. Those modules are gone — the scanner can't read them. Error correction's job is to reconstruct what those lost modules contained.
At level M (15% recovery), a logo occupying 20% of the code's area exceeds the recovery budget entirely. The code cannot be decoded. At level H (30% recovery), a logo at or under about 25% of the area stays within budget, and the scanner can reconstruct the covered data.
Qrop caps logo size at 25% of the code area and switches error correction to H automatically whenever you add a logo, so the code is always within a safe margin. You don't need to set this manually.
Frequently asked questions
Does higher error correction make a QR code harder to scan?
No — higher error correction makes a code more forgiving, not harder to scan. The trade-off is density: higher levels produce more modules in the same space, so individual modules are smaller. Print at an adequate size with good contrast and a higher level scans just as quickly as a lower one.
Why does adding a logo require level H?
A centred logo hides some of the code's modules. Level H can recover around 30% of the code, which is enough to read it reliably even with the logo's footprint removed — as long as the logo stays at or under about 25% of the total area. Qrop sets the level to H automatically whenever you add a logo.
Can I recover data from a badly damaged QR code?
Up to a point. If the damage stays within the level's recovery budget — roughly 7% to 30% depending on the level — the scanner reconstructs the missing data. Beyond that, or if one of the three corner finder patterns is destroyed, the code becomes unreadable. There is no way to decode a code where the damage exceeds the error correction budget.
What error correction level does Qrop use by default?
Qrop defaults to Medium (M) for standard generations — a sensible balance of robustness and code density. It automatically switches to High (H) whenever you add a logo. You can override the level manually in the generator if your use case requires it.
Does error correction level affect scan speed?
Not meaningfully. Modern phone cameras decode QR codes in milliseconds regardless of level. The density difference between L and H is visible in the code's appearance but doesn't produce a perceptible delay when scanning with a current smartphone.
Related guides
Ready to create your QR code?
Generate a free QR code in seconds — custom colours, logos, and PNG, SVG or PDF output.
Open the generator