← All articles

QR Code Error Correction Levels Explained: L, M, Q and H

2026-10-12 error correction design technical

QR codes include error correction, so a code can still be read when part of it is dirty, scratched or covered. There are four levels: L restores up to about 7 percent of the data, M about 15 percent, Q about 25 percent and H about 30 percent. Higher levels let you put a logo in the middle or print on rough material, at the cost of a denser pattern. For most printed codes, M is a good default; use H when you add a logo.

How error correction works

QR codes use Reed–Solomon coding, the same family of math that protects data on CDs and in space communications. When a code is generated, extra "repair" data is added alongside the content. If some modules (the small squares) cannot be read, the scanner uses the repair data to reconstruct what is missing. How much repair data is added depends on the level you choose.

The four levels

LevelCan restoreWhen it fits
LAbout 7%Clean digital use, such as a code shown on a screen; keeps the pattern as simple as possible
MAbout 15%A good default for printed codes
QAbout 25%Codes that may get scuffed or printed on rough material
HAbout 30%Codes with a logo in the middle, or in harsh environments

The percentages are the share of the code's data that can be missing and still decoded. They are an upper bound for ideal damage patterns; in practice, damage in the wrong place, such as over the three large squares in the corners, can break a code even below the limit.

The trade-off: density

More repair data means more modules for the same content. Raising the level from L to H can push a code up several versions, meaning more rows and columns of smaller squares. At a fixed printed size, smaller squares are harder to read. So a higher level is not automatically better: it is insurance that costs space.

If you need both a logo and a small print, shorten the content. A dynamic QR code holds only a short link, which leaves room for high error correction without making the squares tiny.

Logos and error correction

A logo in the middle hides modules on purpose. High error correction (Q or H) makes up for the hidden area, but only up to its limit. Keep the logo to about a fifth of the code's width or less, place it in the center and away from the three corner squares, and always scan a printed proof. If the code fails, shrink the logo before you raise any other setting.

Choosing a level

  1. Showing the code on a screen, clean and large? L or M.
  2. Printing on paper, indoors? M.
  3. Printing on cardboard, fabric, bottles or anything that will get worn? Q.
  4. Adding a logo? H, with a modest logo, and test.
  5. Printing very small? M, with the shortest possible content, rather than H with a dense pattern.

Size matters as much as the level: the print size guide gives minimum widths by scanning distance.

Other limits worth knowing

A QR code can hold at most about 7,089 numeric characters, 4,296 alphanumeric characters or 2,953 bytes, and only at the lowest error correction level. In practice, anything past a few hundred characters scans poorly on a phone at ordinary print sizes, which is another reason to link to a page rather than putting text in the code.

FAQ

Which error correction level should I use?

M for most printed codes. Use H when you add a logo or expect wear, and use L only for clean, large, on-screen codes.

Does a higher error correction level make a QR code scan better?

Not always. It helps when part of the code will be hidden or damaged, but it makes the pattern denser, which can make a small print harder to read. Choose the level for the situation, not the highest available.

Why does my QR code with a logo not scan?

The logo is probably too large or sitting over a critical area. Reduce it to about a fifth of the code or less, move it to the center, use level H, increase the code's printed size and test again. If it still fails, check the other common causes.

Create a free dynamic QR code — change the destination anytime and track every scan.

Make your QR code →