QR Code Scan Tests: What Breaks a QR Code

We generated 5,136 QR code images and read each one with two open-source decoders, 10,272 reads in total, to measure how large a logo can be, how much damage a code survives, how content length changes size, and which colours scan.

Updated · QRJiffy team

Test QR codes: a 25% logo that scanned, a 46% logo that failed, scattered specks, inverted colours
Four of the test images: a logo at 25% of the width scanned, a larger logo failed, 2% scattered specks broke 3 in 10 reads, and an inverted code read only with an invert pass.

How did we test the QR codes?

We built every code with the same encoder our generator uses, then read it with jsQR and ZXing; a test passed only when both decoders returned the exact text. Tests ran in November 2026.

  • Two decoders: jsQR, a JavaScript decoder used in many web scanners, and ZXing (zxing-cpp), the open-source engine family behind many Android scanner apps.
  • Two conditions: a clean image, and a phone-photo model that shrinks the code to a few pixels per module, blurs it and adds sensor noise. Colour tests add a dim-light condition with less light and more noise.
  • Two contents: a 30-character short link (https://qrjiffy.com/r/AbC2xYz/) and a 123-character tracked web address.
  • Repeatable: random choices use a fixed seed, so the same script gives the same numbers. Download the raw results (JSON).

A simulation is not a phone. Real cameras add glare, tilt, motion and autofocus delays, and phone scanners such as Apple’s and Google’s use their own decoders. Treat these results as a controlled comparison between options, and test your final print on real phones.

A centre logo on a short-link code stopped scanning above 42% of the code width at level H, 33% at level M and 22% at level L. By area, that is 18%, 11% and 5% of the code. The widely repeated advice that a logo can cover up to 30% of the code’s area failed in every one of our tests.

L · short link22% width · 5% areaL · long URL23% width · 5% areaM · short link33% width · 11% areaM · long URL32% width · 10% areaQ · short link34% width · 12% areaQ · long URL44% width · 19% areaH · short link42% width · 18% areaH · long URL48% width · 23% area
Largest logo that still scanned in both conditions. Bars show the logo’s share of the code width.
Largest centre logo that still scanned (both decoders, clean and camera)
LevelShort linkLong URL
L22% of width (5% of area), version 223% of width (5% of area), version 6
M33% of width (11% of area), version 332% of width (10% of area), version 8
Q34% of width (12% of area), version 344% of width (19% of area), version 9
H42% of width (18% of area), version 448% of width (23% of area), version 11

Longer content allowed a slightly larger logo at Q and H (48% of the width at H) because the bigger grid spreads data over more modules. Keep logos at or below 25% of the width: that leaves most of the error budget for scratches and print faults. The QR code with logo generator caps logos at 26% and switches to level H automatically.

How much scattered damage can a QR code survive?

Very little: with 2% of the modules flipped at random, level H read 70% of the time and level L only 25%; at 6% random damage no code read at all. Error correction counts damaged codewords, not modules, and each codeword spans 8 modules, so scattered specks spoil many codewords at once.

Share of 40 trials that decoded, by random damage and error correction level
Modules damagedLevel LLevel MLevel QLevel H
0%100%100%100%100%
2%25%68%57%70%
4%0%3%10%18%
6%0%0%0%0%

One solid patch, like a logo or a sticker, is far easier to recover from than the same amount of damage scattered as specks, scuffs or faded print. Protect outdoor and high-touch codes with lamination instead of relying on a higher level. The error correction guide explains the levels.

Does a short link make a QR code easier to scan?

Yes: the 30-character short link made a 29 × 29 grid, while the 123-character address needed 49 × 49, so at the same printed size the short-link code read from about 2× the distance. Fewer modules means each one is bigger on paper and in the camera image.

In the phone-photo model the short-link code read from 1.5 camera pixels per module and the long one needed 1.75, because the denser grid also blurs together sooner. The table shows how the grid grows with content length at each error correction level.

Grid size (modules per side) by content length and error correction level
CharactersLMQH
2525 (v2)25 (v2)29 (v3)33 (v4)
5029 (v3)33 (v4)37 (v5)41 (v6)
7533 (v4)37 (v5)45 (v7)49 (v8)
10037 (v5)41 (v6)49 (v8)57 (v10)
15045 (v7)49 (v8)57 (v10)65 (v12)
20053 (v9)57 (v10)65 (v12)77 (v15)
30061 (v11)69 (v13)81 (v16)89 (v18)

See the QR code size guide for print sizes by scanning distance.

Which QR code colours scan?

Every colour pair with a contrast ratio of 4:1 or more read in good light, but in dim light only black and black on cream read at least 80% of the time. Pale colours such as yellow, light green and sky blue failed even in good light.

Decode rate over 20 simulated photos per colour pair
ColoursContrastGood lightDim light
Black21:1100%90%
Black on cream15.9:1100%85%
Navy10.4:1100%75%
Charcoal10.3:1100%65%
Burgundy10:1100%70%
Dark green9.1:1100%70%
Purple8.7:1100%55%
Navy on light blue7.3:1100%50%
Dark red on pink7.2:1100%70%
Black on mid grey7:1100%20%
Brand violet5.6:1100%30%
Teal5.5:1100%30%
Red4.8:1100%50%
Green on yellow3.8:1100%0%
Blue3.7:1100%5%
Orange2.8:180%0%
Pink2.6:130%0%
Mid grey2.5:10%0%
Sky blue1.7:10%0%
Yellow1.5:10%0%
Pale grey1.5:10%0%
Light green1.4:10%0%

Two patterns stand out. Coloured or grey backgrounds lost the most in dim light, even with a decent contrast ratio, because they shrink the brightness gap the scanner relies on. And dark navy, burgundy and green held up better than lighter brand colours. For bars, restaurants and evening events, use a near-black code on white. The QR code colours guide covers colour choice.

Do inverted QR codes scan?

Only when the scanner looks for them: both decoders read our light-on-dark code 100% of the time with their invert option on and 0% with it off. Whether a scanner runs that second pass depends on the app or device, so print a dark code on a light background to be safe.

What should you change after these tests?

Use a short link, keep logos at or below 25% of the width, print a dark code on white, and protect codes from scuffs rather than relying on error correction.

  1. Shorten content: a short link roughly doubled the readable distance in our tests.
  2. Size logos at 25% of the width or less with level H.
  3. Choose contrast of 7:1 or more for dim places; 4:1 is the floor in good light.
  4. Laminate codes on tables, doors and vehicles.
  5. Test the final print on an iPhone and an Android phone.

Make a code with these defaults in the free QRJiffy generator.

Frequently asked questions

How big can a logo in a QR code be?

In our tests a centre logo stopped working above 42% of the code width (18% of its area) at level H on a short link. Keep logos at or below 25% of the width to leave room for wear and print errors.

Does error correction protect against dirt and scratches?

Only against damage in one area. Scattered specks spread across the code defeat every level quickly: with 18% success at 4% random damage, level H barely helped.

Can I use your data?

Yes. The raw results are free to reuse under CC BY 4.0 with credit to QRJiffy. Download them as JSON from this page.