QR3D Craft

Error correction level: why the highest is usually worse

By · 6 min read · Updated 26 October 2026

Leer en español

The four error correction levels of the QR standard are the least understood option in the format. Intuition says more is always better. In 3D printing it is exactly the other way round, and there is a specific reason for it.

What it actually is

A QR code does not only store your information: it also stores redundant data calculated from it, using an algorithm called Reed-Solomon. The same algorithm is used in CDs, and for the same purpose: so the content can be reconstructed even with part of it damaged or covered.

The standard defines four levels, and each reserves a different share of the code for that redundancy:

LevelNameDamage tolerated
LLow~7 %
MMedium~15 %
QQuartile~25 %
HHigh~30 %

It is what lets a code with a coffee stain, a scratch or a logo on it still read.

The same link encoded at the four correction levelsThe same link encoded at 3 correction levels: level M, version 4, 33 modules; level Q, version 5, 37 modules; level H, version 6, 41 modules.Mversion 433 × 33 modulesQversion 537 × 37 modulesHversion 641 × 41 modules
The same link, going up a level. Changing level does not change the size of the piece: it changes how many modules have to fit inside it, and therefore how small each one ends up. Level L is not in the figure because this site's generator does not leave it there: when a better level fits free in the same version, it raises it.

What it costs

That redundancy takes up room, and room in a QR code is finite. The higher you push the level, the less information fits in the same version:

VersionModulesLMQH
121 × 211714117
225 × 2532262014
329 × 2953423224
433 × 3378624634
537 × 37106846044
641 × 411341067458
849 × 4919215210884
1057 × 57271213151119

Look at version 3: going from L to H cuts the capacity from 53 characters to 24. Less than half.

The 3D printing paradox

Here is the point almost nobody explains. Take a 40-character link and a piece 40 mm a side, with a 0.4 mm nozzle.

LevelVersion neededModulesModule sizePrintable?
L329 × 291.08 mmYes, comfortably
M329 × 291.08 mmYes, comfortably
Q433 × 330.98 mmYes
H537 × 370.89 mmTight

The module comes from dividing the 40 mm between the modules of the code plus the eight of the quiet zone. And there is the problem: raising it to H so the code «holds up better» makes each module print worse. You have bought tolerance to outside damage and paid for it with print quality, which is where the damage comes from in the first place.

The redundancy is not free twice over. Part of the correction capacity is already being spent compensating for the noise of printing itself: rounded edges, a widened first layer, small variations in colour. If on top of that you shrink the modules, you raise that baseline noise and have less margin left for real damage. The high level eats itself.

When to use each level

M is the default answer

For 90 % of printed pieces. A 15 % tolerance covers normal wear, scratches and dirt with room to spare, without forcing the version upwards.

Go up to Q or H only in these cases

L almost never

It only makes sense when the link is long, the piece is small and there is no way to shorten the address. It beats a high-version code with modules that barely print, but it is an emergency measure: the good answer is to shorten the link.

The rule in one line

Raise the correction level only if the piece is big enough to absorb the extra version without the module dropping below twice your nozzle.

And if it is not, the right lever is not the level: it is shortening the link. Taking off ten characters usually drops a whole version, and that enlarges the modules without giving anything up.

A note on masks

While we are here: the standard defines eight mask patterns applied over the code to avoid large areas of the same colour, which are what confuse the reader. The encoder picks the best of the eight automatically by scoring each one against rules in the standard.

There is nothing to configure, but it explains a detail that catches the eye: if you generate the same link twice at different levels, the pattern changes completely even though the content is identical. It is not a bug: it is another version and another mask.

Compare the four levels on screen

The generator lets you change the correction level and see the module count change immediately. With that you can decide on data instead of on intuition.

Try the levels

Keep reading