Skip to content

Choosing an error level

QR codes come in four error correction levels: L, M, Q and H. Most generators pick one for you. When you are chasing blank space, this single choice matters more than anything else.

What the level buys you

A QR code survives being partly covered or dirty because it carries Reed-Solomon recovery bytes alongside the payload. A higher level means more recovery bytes, and tolerance for rougher conditions.

Recovery capacity and payload size by level
LevelRecoversCapacity at version 5
L~7%154 chars
M~15%122 chars
Q~25%87 chars
H~30%64 chars

For blank space it works in reverse

Recovery bytes are computed by the algorithm, so you cannot choose them, and the mask-cancelling trick cannot reach them. Raising the level means growing the part you are not allowed to empty.

Black share for the same URL at version 5
LevelBlackNoise tolerance
L15%Low
M21%Medium
Q32%High
H40%Very high

Even level H lands at 40 percent, still below the 47 percent of an ordinary code. If you want stability without giving up the look entirely, the middle two rows are where to sit.

Picking one

Screens only: L

Images sent over chat, codes embedded in a web page, slides in a talk. The display is bright and sharp, L is plenty, and you get the most blank space.

Not sure: M

M is the sensible default. Around 20 percent black still reads as clearly empty to the eye, and it survives ordinary lighting.

Anything printed: Q or higher

Business cards, stickers, posters. Ink spread, paper texture, folds and lighting all vary, and once it is printed you cannot fix it.

Outdoors or rough handling: H

Signage, vehicle wraps, equipment tags. If this is your case, an ordinary QR code may simply be the better tool.

The popular look of a logo dropped into the middle effectively requires level H, because whatever the logo covers counts as damage. Maximising blank space and overlaying a logo draw from the same budget, so doing both is hard.

A higher level does not always mean a bigger code

Common misconception. If your payload is short, the next level often fits inside the same version, so the code stays the same size and only gets a little denser. Switch levels in the tool and watch whether the version number changes.