QR Code Error Correction: What L, M, Q and H Mean

Short version: I’d start at M for an ordinary QR code, then test the finished print. The familiar 7%, 15%, 25% and 30% figures are approximate recovery rates for total codewords, the 8-bit units used in encoded data. They don’t mean the same share of visible squares can be covered.

QR Code uses Reed-Solomon error correction. Raising the level adds more recovery data and leaves less room for the message at a given QR version. The useful level depends on the print conditions and how much data the code needs to hold.

What do L, M, Q and H mean?

DENSO WAVE describes these as approximate restoration rates for total codewords. Its technical explanation says Level M is commonly selected and recommends choosing a level based on the environment and symbol size.

Level Approximate codeword recovery A sensible starting point
L 7% Clean, controlled conditions or a payload that needs more capacity
M 15% General use; a reasonable starting point for many QR codes
Q 25% More tolerance for labels, packaging or codes that get handled
H 30% Dirtier or rougher conditions, or a small planned graphic, followed by scan testing

An indoor event flyer with a short URL is an M case to start with. A business card that lives in a wallet or a shipping label that gets scuffed is worth testing at Q or H. For a cramped inventory label, shortening the encoded URL can keep the pattern less dense.

The control below redraws the same QR code with different levels and two URL lengths. Watch the module count change as you change the payload and correction level.

Interactive example 1

Compare correction levels and URL length

Change either control to redraw the same QR generator's output and see the module count.

Short editor link: https://www.blissqr.com/qr-code-editor/

Error-correction level
Encoded URL

Level M restores approximately 15% of total codewords. This URL is 39 characters; the symbol is 29 × 29 modules.

A code that stays in the same version can keep the same module count as you change levels. The pattern still carries a different amount of correction data.

What does error correction actually repair?

A QR code stores the message as data codewords and adds Reed-Solomon parity codewords. The QR version and correction level determine how many of each fit in the symbol. Depending on that version and level, the data is divided into one or more Reed-Solomon blocks. Each block gets its own parity data.

At the block level, a Reed-Solomon code with r parity codewords can correct up to floor(r / 2) unknown codeword errors. Each unknown error uses two parity codewords. The QR encoder then interleaves the blocks’ data and parity codewords before placing their bits in the matrix. Interleaving spreads consecutive codewords across blocks, which helps with a scratch or smudge that damages a local patch of the image. Each block still has its own correction limit.

DENSO WAVE’s example makes the headline percentages easier to read. If 50 data codewords need correction, the Reed-Solomon data requires 100 correction codewords. There are then 200 codewords in total, so the 50 recoverable codewords are 25% of the total. That’s Level Q, even though the example repairs half of the original data codewords.

A camera has work to do before that Reed-Solomon step. It first has to find the symbol, determine its orientation and read the modules into bits and codewords. Three position-detection patterns sit in the corners to help the reader find and orient the QR code. The quiet zone around the symbol helps separate it from nearby print. Damage to one of those structural areas can interfere with reading before payload error correction can help. DENSO WAVE’s QR Code overview describes the position-detection patterns, and its printing guide specifies a quiet zone at least four modules wide on every side.

The same-size white patch below can cover the middle of the symbol or overlap a corner finder. Switch its position to see why visible area alone says little about the damage a scanner has to handle. This is a visual illustration, not a QR decoder.

Interactive example 2

Move the same-size patch

Choose where the white patch lands on a level H QR code.

The encoded URL stays the same in both views.

Patch position

The centre patch is 20% of the symbol width. The position-detection pattern helps scanners locate the QR code before Reed-Solomon correction begins.

This shows layout only. It doesn't run a decoder or predict whether the marked code will scan.

The recovery rate counts codewords. A logo covers modules in a particular part of the image. Those are different units, and the modules that get covered don’t translate directly into an equal share of codewords. Location matters too: a patch across a position-detection pattern can make it harder to find the symbol, while a patch over data modules creates a different problem.

So treat a logo as damage you’re choosing to add. Keep it small, preserve the corner patterns and quiet zone, and scan the final artwork on the material and at the size you plan to print. Level H gives more Reed-Solomon recovery capacity, but it doesn’t promise that a particular logo will scan.

How does correction level affect printed size?

QR Code Model 2 has 40 versions, from Version 1 at 21 × 21 modules to Version 40 at 177 × 177. Each version adds four modules per side. A higher correction level leaves fewer data codewords available at the same version. If the message no longer fits, a generator may move to the next version, which makes the grid denser. DENSO WAVE’s version guide explains how the payload, encoding mode and correction level determine the version.

At a fixed print width, a denser grid means smaller modules. For example, a 29-module symbol printed 30 mm wide has modules about 1.03 mm across. The four-module quiet zone on every side adds another eight modules of width, so the full printed square would be about 38.3 mm wide. Ink spread, low-resolution printing, glare or a very small label can make those smaller modules harder to read.

The exact version depends on the content and the encoding mode, so there’s no universal size increase for moving from M to H. A short URL may stay in the same version at several levels; a long tracking URL may cross a version boundary. That’s what the first example is for.

Which correction level should you choose?

Start with M for an ordinary flat print in a clean setting. Compare Q or H when the code is likely to get dirty, scratched or handled, or when you want to add a small centre graphic. Try L when the surface will stay clean and the payload is close to the capacity limit.

Then test the actual destination, not just a short sample URL. Print at the final dimensions on the real material, keep a clear quiet zone, and scan with more than one phone in the light people will use. If the code only works on a bright monitor from two inches away, the test has answered the question.

A few practical checks:

  • Keep the encoded URL short when it suits the campaign. This can reduce the version or leave more room for correction.
  • Use dark modules against a light, plain background. Gradients, glare and low contrast can make detection harder.
  • Set the print size before export. Enlarging a small raster image later can soften module edges.
  • Test the logo, folds, surface texture and lighting on a real print. The preview can’t reproduce those conditions.

When you’re ready, create a QR code with the BlissQR editor.