Skip to content
UseQR
ESC

↑↓ MOVE↵ OPEN48 PLACES

Design

Logo size limits by error-correction level

Error correction level sets the logo budget — L tolerates 7% damage and allows no logo, M around 15% allows roughly 10% coverage, Q around 25% allows 18%, and H around 30% allows about 20%. Stay under the ceiling because print damage and camera angle spend the same budget as the logo.

View as MarkdownPaste this page into any AI assistant — it is plain, portable Markdown.

The budget table

A centred logo is deliberate damage, paid for from the error-correction budget. Each error-correction level buys a recovery capacity, and the practical logo allowance is meaningfully below it:

Level Codewords recoverable Theoretical ceiling Practical centre logo
L ~7% 7% none
M (default) ~15% 15% up to ~10% of area
Q ~25% 25% up to ~18%
H ~30% 30% up to ~20%

Two reasons the practical column is smaller. First, the budget is shared: ink spread, glare, a bent surface and an angled camera all consume recovery capacity, and a logo that spends the whole budget leaves nothing for the physical world — the "scans on screen, fails in print" signature. Second, a logo's damage is contiguous. Error correction is organised in blocks and interleaved precisely to spread localised damage across blocks, but a large solid patch still concentrates losses more than the same percentage scattered as random noise. Percentages near the ceiling behave worse than the arithmetic suggests. The spec-side derivation of these numbers is on maximum safe logo coverage, and the mechanism on how logos work without breaking a code.

Reading the table as a designer

  • Ship at H with ~20% coverage for any logo that matters. This is the combination with genuine headroom.
  • Q at ~15–18% is a good compromise when H would push the code a version denser than the layout can afford.
  • M fits only a small mark — a favicon-scale glyph around 10%.
  • L is for codes with no logo at all.

UseQR enforces sanity here: the logo option defaults to 20% of the code width and hard-clamps at 35%, and the renderer knocks out the modules beneath the logo with one clear module of padding, so the logo sits on a clean panel instead of half-covering modules — ambiguous, partially covered modules are worse for a decoder than cleanly missing ones. Position is not negotiable either: the budget only exists for data regions, which is why logos stay central, far from the finder patterns and timing rows that no error correction protects — the full placement rules are in logo best practices.

Raising EC is not free

Stepping M → H roughly doubles the correction codewords, which pushes the symbol to a higher version: more, smaller modules at the same printed size. For a dense payload that can cost more robustness than the logo budget gains. The stable order of operations:

  1. Shorten the payload (a shorter URL drops the version).
  2. Raise error correction (ec=H).
  3. Add the logo at ≤ 20%.
  4. Decode the finished artwork with the validator, which reports whether the styled, logoed code actually reads — the only number that finally matters.

FAQ

How big can a logo be in a QR code?

About 20% of the code's area at error-correction level H, around 18% at Q, and roughly 10% at the default level M. The theoretical tolerances are higher — 30%, 25% and 15% — but real-world damage draws on the same budget.

H for logos near 20% coverage, Q for smaller marks when density is a concern. Shorten the payload first: raising the level increases density, and a dense high-EC code can end up more fragile than a sparser Q-level one.

Why did my 25% logo break the code when H tolerates 30%?

The tolerance assumes ideal conditions and distributed damage. A logo is one contiguous patch, and printing, glare and angle consume the remaining margin. Near-ceiling coverage fails intermittently, which is the worst way to fail.

Does the logo shape matter, or just the percentage?

Both. A compact central logo on a clean knockout panel is the best case; wide banners, off-centre placements and logos overlapping structural patterns fail at far lower coverage. Keep it central, padded, and verified by decoding.

Try it — free, no signup