QR code error correction explained: L, M, Q, H
Every QR code carries backup data so it can still be read when part of the pattern is damaged, dirty, or covered. This is called error correction, and the level you choose directly affects how dense the code looks, how much data it can hold, and how resilient it is to real-world abuse. Here is a practical breakdown of the four levels and when to pick each one.
What error correction does
A QR code encodes your data twice: once as the actual payload, and again as mathematical redundancy (Reed-Solomon error correction codes). If a scanner can't read some modules (because they are smudged, torn, covered by a logo, or printed on a rough surface), it uses the backup data to reconstruct the missing parts.
Higher error correction means more backup data, which means:
- More resilient: the code tolerates more damage or obscuring.
- Denser pattern: more modules are needed, so the code looks busier.
- Less data capacity: the same physical size holds less actual content because more space goes to redundancy.
The four levels
| Level | Recovery | Best for |
|---|---|---|
| L — Low | ~7% | Digital displays, clean prints, short URLs |
| M — Medium | ~15% | General purpose (default for most uses) |
| Q — Quartile | ~25% | Printed materials, outdoor signage, business cards |
| H — High | ~30% | Industrial, harsh environments, codes with logos overlaid |
When to use each level
L — Low (~7% recovery)
Use L when the QR code will be displayed on a screen or printed in a controlled environment where it will not be damaged. Email signatures, digital receipts, and app screens are good candidates. The pattern is the least dense, so it scans faster and at smaller sizes.
M — Medium (~15% recovery)
M is the default in most QR generators (including this one) and works for the majority of use cases. It tolerates light smudging, small scratches, and moderate print quality. If you are not sure which level to pick, M is a safe choice.
Q — Quartile (~25% recovery)
Use Q for anything that will be printed and handled: business cards, restaurant menus, flyers, posters, and packaging. The extra redundancy means the code still works after being bent, wet, or partially covered. It is also the minimum level recommended if you plan to overlay a small logo on the QR code.
H — High (~30% recovery)
H is for the harshest conditions: industrial labels, outdoor signage exposed to weather, warehouse barcodes, and QR codes with a large logo or image overlaid in the center. The pattern is the densest, so you need a larger physical size to keep it scannable.
Error correction vs. data capacity
Higher error correction eats into the data capacity of the QR code. A version-10 QR code (57×57 modules) can hold:
- L: ~174 characters of alphanumeric data
- M: ~122 characters
- Q: ~93 characters
- H: ~66 characters
If your payload is long (a vCard with many fields, a URL with query parameters), you may need to drop the error correction level or use a larger QR version to fit everything. Short URLs and simple text work at any level.
Practical tips
- Default to M. It is the best balance of resilience and density for most uses.
- Bump to Q for print. Anything that gets handled, folded, or exposed to weather should use Q at minimum.
- Use H for logos. If you are overlaying a logo on the QR code, use H so the code can tolerate the ~15-20% of modules the logo covers.
- Shorten URLs first. A shorter payload means you can use higher error correction without making the QR code physically larger.
- Test your prints. Always scan a test print from the actual surface and at the actual size before you go to production.
Try it
The error correction selector in LocalQR lets you switch between L, M, Q, and H and see the pattern change in real time. Everything runs in your browser. Your data never leaves your machine.