Skip to content
UseQR
ESC

Jump to

MOVEOPEN50 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