Free tier, no card requiredDynamic QR codes that update after printGDPR-compliant scan analyticsBuilt for agencies, freelancers & in-house teamsFree tier, no card requiredDynamic QR codes that update after printGDPR-compliant scan analyticsBuilt for agencies, freelancers & in-house teamsFree tier, no card requiredDynamic QR codes that update after printGDPR-compliant scan analyticsBuilt for agencies, freelancers & in-house teamsFree tier, no card requiredDynamic QR codes that update after printGDPR-compliant scan analyticsBuilt for agencies, freelancers & in-house teams
All posts
A QR code with a centred logo and a green check mark, beside a four-step bar meter capped with a shield.
Explainer

QR code error correction: how far you can brand a code (L, M, Q, H explained)

QR code error correction (levels L, M, Q and H) is what lets you brand a code with a logo. Here is what 7/15/25/30% really means, how big a logo can be, what you can do with colour, and why encoding less data is the best trick of all.

ScanKit

ScanKit · Organization

· 14 min read

A client sends over a beautiful QR code with their logo dropped into the middle, a brand colour on the modules, and rounded dots instead of squares. It looks great in the artwork. Then half the test phones refuse to scan it, and the print deadline is tomorrow. Almost every branded QR code that fails comes down to one misunderstood feature: error correction. Understand what it really does, and you can brand a code with confidence instead of guesswork.

This is the explainer for agency designers and account managers who need a code that is both on-brand and reliably scannable. We will cover what error correction actually is, the four levels and their real numbers, how far you can push a logo, what you can and cannot do with colour, and the one trick that beats all of it: encoding less data in the first place.

What QR code error correction actually is

Error correction is redundancy built into the code. When a QR code is generated, the encoder adds extra Reed-Solomon codewords alongside the data codewords. A codeword is a block of eight modules (the little black and white squares). If some modules are later missing, dirty, scratched, or covered by a logo, the decoder uses those redundant codewords to mathematically rebuild the original data. Nothing is "stored twice" in a naive sense; the maths lets the reader recover the message even when part of it is unreadable.

This is a hard specification, defined by Denso Wave, the company that invented the QR code, and standardised in ISO/IEC 18004. Denso Wave describes the feature as adding "a Reed-Solomon Code to the original data," and it is the reason a code on a creased flyer or a slightly smudged label still scans. It is also the reason you can put a logo in the middle at all.

The crucial detail, and the one most blog posts get wrong, is what the redundancy is measured against. It is a percentage of the total codewords, not a licence to paint over a percentage of the picture. Hold that thought, because it changes every practical decision below.

The four error correction levels: L, M, Q and H

Every QR code is generated at one of four error correction levels. Denso Wave's official recovery figures are:

  • Level L (Low): approximately 7% of codewords recoverable.
  • Level M (Medium): approximately 15%.
  • Level Q (Quartile): approximately 25%.
  • Level H (High): approximately 30%.

Treat those numbers as approximate on purpose. The exact recoverable fraction shifts slightly with the code's version (its module count) because error-correction codewords are allocated in blocks. The headline percentages are the right mental model, but "approximately" is the honest word, and it is the word Denso Wave uses.

Most generators default to level M, which is the sensible everyday choice for clean print: a good balance of resilience and density. Level L produces the least dense code but tolerates almost no damage. Levels Q and H trade data capacity for robustness, and H is the one you reach for when a logo is going in the middle.

The "you can cover 30% of the code" myth

Here is the claim you will read on dozens of vendor blogs: "Level H lets you cover 30% of the QR code, so your logo can take up nearly a third of it." That is a sloppy conflation, and getting it right is the difference between a code that scans and a reprint.

The 30% is recovery capacity measured against total codewords, not against the visible surface area, and not all of that budget is free for your logo. Two things eat into it. First, a chunk of the code is taken up by function patterns (the finder, timing and alignment patterns) that carry no recoverable data and must never be obscured. Second, and less obvious, recovering a corrupted codeword costs more of the error-correction budget than restoring a known-erased one, so a real logo blob over the data eats into the headline figure faster than the raw percentage suggests.

The practical translation: 30% is a ceiling on a specific quantity, not a green light to obscure a third of the artwork. If you treat it as the latter, you will produce codes that pass on the designer's iPhone in good light and fail on a customer's older Android in a dim restaurant. The size, contrast and quiet-zone fundamentals still apply on top of all this; we cover those in detail in how big should a QR code be.

How big can a logo be, really?

A centred logo works because of the redundancy: it sits over ordinary data modules, and error correction reconstructs what it hides. To make that reliable rather than lucky, follow four rules.

A QR code with its finder patterns, quiet zone, a centred logo and a safe coverage box numbered 1 to 4.
The four labelled parts that let a logo survive on a QR code: the three finder patterns, the quiet zone, the centred logo over data modules, and the safe coverage box in the middle.

What the diagram shows:

  1. The three finder patterns (the large square-in-square "eyes" in the corners) are how a camera locates and orients the code. Keep them completely intact and never place a logo over them.
  2. The quiet zone is the clear margin around the code, four modules wide. It must stay empty so the scanner can tell where the code ends.
  3. A centred logo sits over normal data modules in the middle, which is exactly the region error correction can rebuild.
  4. The safe coverage box is roughly the central fifth to quarter of the code. Keep the logo inside it.

On size, the honest answer is a range, not a spec. The theoretical ceiling sits near 30% of the area at level H, but a reliable real-world target is 15% to 25% of the code's area, kept central. Smaller is safer, especially for small print sizes and unknown scanning devices. Always generate the code at level H when a logo is present, put a small white knockout pad behind the logo so it reads as clean light modules rather than smearing into its neighbours, and test on more than one phone before signing off. Those are practitioner rules of thumb, consistent across vendors, not clauses in the standard, so treat the percentages as guidance and let a real-world scan test be the final judge.

Colour and contrast: what you can change safely

Colour is where brand guidelines and scannability collide most often. The rules here are practitioner guidance rather than a single quotable ISO number, but they are remarkably consistent.

Scanners are built around one assumption: dark modules on a light background. Keep your data pattern darker than its background and you are working with the grain of every decoding algorithm. A common working minimum is roughly a 4:1 contrast ratio between modules and background, with 7:1 or more recommended for outdoor or variable lighting (plain black on white is about 21:1, which is why it never fails). Those are WCAG-style ratios used as a practical proxy; the underlying standard actually grades print quality in terms of reflectance measured by a verifier, so use the ratios as a sanity check, not as a law.

A few specific traps to avoid:

  • Inverted codes (light modules on a dark background) are technically valid but genuinely risky. Many scanners, especially older Android apps and dedicated readers, struggle with them. Avoid unless you have tested widely.
  • Gradients on the modules reduce contrast unpredictably across the code. Use a solid, uniform dark colour for the data pattern.
  • Warm foregrounds (red, orange) can read as "light" to some camera sensors, which weakens the contrast the decoder relies on. Cool, dark colours are the safe brand-friendly choice.

If brand colour and reliable scanning genuinely conflict, the resolution is usually to change the destination experience rather than the code: keep the code dark-on-light and pour the brand into the landing page it opens.

Custom shapes and "artistic" QR codes

Rounded dots, custom module shapes and stylised eyes are mostly fine, and here is why. Decoders read dark-versus-light contrast per grid cell, not exact geometry, so as long as each module clearly fills its position and keeps its contrast, the shape of the fill does not matter much. Rounded dots can get marginal at very small print sizes, because a dot has less dark area than a full square, so reserve the most decorative styles for codes that will be printed large.

The finder patterns can be lightly stylised (rounded corners, a custom eye colour) but they must stay square enough to be recognised. Do not remove their square-in-square structure, and do not lay graphics over them. The quickest way to break an otherwise lovely code is to get creative with the three corners.

The trade-off nobody mentions: higher correction means a denser code

There is a hidden cost to cranking error correction up. Denso Wave is explicit: raising the level "improves error correction capability but also increases the amount of data and QR Code size." More error correction means more codewords, which can push the code to a higher version with more modules per side. The result is a denser code that needs either more physical size or fewer encoded characters to stay scannable.

So "always use level H" is a myth that backfires. At a small print size, an H-level code packed with a long URL becomes a dense thicket of tiny modules that is harder to scan, not easier. The rule is situational: use H when you are adding a logo and can give the code room, and M for clean everyday print where nothing obscures the modules. The goal is the least dense code that still meets your robustness needs.

The shortcut: encode less, not more

This is the part almost nobody closes the loop on, and it is the most useful trick in the whole topic. QR data capacity is fixed for a given version and level, so fewer characters means fewer codewords, which means a lower version, which means fewer and larger modules, which means a less dense, more forgiving code.

Compare two destinations. A raw campaign URL with tracking parameters such as https://client.example.com/spring-sale?utm_source=flyer&utm_medium=qr&utm_campaign=2026-spring is long, so it forces a denser code. A short redirect such as scankit.app/r/sk7d2 encodes a fraction of the data, so the same content fits in a far less dense symbol. That gives you two wins at once: visual room for a centred logo, and the headroom to run level H without forcing a large, fiddly code.

This is the practical reason dynamic QR codes are not just about editability. A dynamic code encodes a short, stable redirect, which is physically what lets a heavily branded code keep scanning. As a bonus you can change the destination after printing and you get scan analytics on every code, all without touching the printed artwork. Branding, robustness, flexibility and measurement turn out to be the same decision.

A two-minute pre-print branding checklist

Before any branded code goes to print, run through this:

  1. Generated at level H if it carries a logo.
  2. Logo kept central and within roughly 15% to 25% of the area, with a white knockout pad behind it.
  3. Finder patterns untouched in all three corners, structure intact.
  4. Quiet zone clear (four modules) on all sides.
  5. Dark modules on a light background, solid colour, contrast at least 4:1 and ideally higher.
  6. Encoding a short redirect, not a long raw URL, to keep the code low-density.
  7. Scan-tested on at least two different phones (one iOS, one older Android) in average, not perfect, light.

If all seven pass, the code will survive the real world, not just the design review.

Frequently asked questions

What do L, M, Q and H mean on a QR code?

They are the four error correction levels, in increasing order of resilience. Level L recovers approximately 7% of codewords, M approximately 15%, Q approximately 25%, and H approximately 30%. Higher levels survive more damage or obscuring but make the code denser. Most generators default to M; use H when adding a logo.

Can you put a logo in the middle of a QR code?

Yes. Error correction reconstructs the data modules that a centred logo hides, which is exactly why it works. Generate the code at level H, keep the logo central, put a white pad behind it, and never let it touch the three corner finder patterns.

How much of a QR code can be covered and still scan?

Up to approximately 30% of the codewords can be recovered at level H, but that is not the same as covering 30% of the picture. In practice keep a logo to roughly 15% to 25% of the code's area, centred, and leave all function patterns clear. Treat the percentage as a ceiling on a specific quantity, not a coverage allowance.

Level H. It offers the highest recovery capacity (approximately 30%), which gives a centred logo the redundancy it needs. Pair H with a short encoded URL so the extra error-correction data does not push the code to an unscannably dense version.

Can I change the colour of my QR code?

Yes, within limits. Keep dark modules on a light background, use a solid colour rather than a gradient, and aim for a contrast ratio of at least 4:1 (higher for outdoor use). Avoid inverted (light-on-dark) codes and warm foreground colours such as red, which some sensors fail to read as dark.

Can a QR code be light on a dark background?

Technically yes, but it is risky. Many scanners, particularly older Android and dedicated reader apps, are built to expect dark-on-light and struggle with inverted codes. If your brand demands it, test across a wide range of devices first, or keep the code conventional and brand the landing page instead.

Does higher error correction make the QR code bigger?

Effectively yes. Raising the level adds error-correction codewords, which can push the code to a higher version with more modules per side. At a fixed print size that means smaller, denser modules that are harder to scan. This is why "always use H" is poor advice: reserve it for codes with logos and give them enough physical size.

Why won't my branded QR code scan?

The usual culprits, in order: a logo over a finder pattern or too large, low contrast or a gradient on the modules, an inverted colour scheme, a missing quiet zone, or a long URL that forced a dense code printed too small. Work down that list and most failures resolve. The fastest structural fix is to shorten the encoded URL with a dynamic redirect.

The short version

Error correction is redundancy: extra Reed-Solomon codewords that let a reader rebuild data hidden by a logo, a scratch or a smudge. There are four levels, L, M, Q and H, recovering roughly 7%, 15%, 25% and 30% of codewords. That 30% is a budget against codewords, not permission to cover a third of the artwork, so keep a centred logo to 15% to 25% of the area, never touch the finder patterns, and keep the quiet zone clear. Stay dark-on-light with solid, high-contrast colour, and remember that more error correction means a denser code, so do not max it out by reflex.

The single most effective move is to encode less. A short dynamic redirect produces a low-density code that has room for a bold logo and the headroom for level H at the same time, and it brings editable destinations and analytics along for free. Generate your next branded code from a short redirect, run the seven-point checklist, scan it on two phones, and send it to print knowing it will hold up.

Share

Keep reading