A QR code that scans perfectly on your monitor can fail on a printed flyer, a menu card or a shop window. Usually nothing is wrong with the code itself. The problem is how it was made or printed: too small for the amount of data, too little margin, the wrong colors, a logo in the wrong place, or a link that doesn't work.
Here's how to find which one it is, with real numbers for size and density, and a test routine to run before anything goes to the printer.
First, rule out the phone
Before changing the code, make sure the scanner isn't the problem:
- Try the phone's built-in camera app, then a second phone. If one phone reads it and another doesn't, the code is marginal and needs fixing anyway.
- Wipe the camera lens. A smudge blurs fine detail first.
- Hold the phone steady and parallel to the code, not at a steep angle, and give it a second to focus.
- Check for glare. Glossy paper, laminated cards and screens behind glass reflect light right across the code.
If several phones fail in good light, the code needs work.
Cause 1: Too much data for the size
A QR code's size in modules (the little squares) grows with the amount of data. The QR "version" runs from 1 (21 × 21 modules) to 40 (177 × 177). More modules in the same printed area means each module is smaller and harder for a camera to resolve.
Here's what two links produce in the same QR library our QR Code Generator uses:
| Content | Level M | Level H |
|---|---|---|
| Short link, 24 characters | Version 2, 25 × 25 | Version 3, 29 × 29 |
| Long link with tracking tags, 149 characters | Version 8, 49 × 49 | Version 12, 65 × 65 |
Printed one inch wide, including the required margin, the short link's modules are about 0.77 mm each. The long link at level H gets about 0.35 mm, less than half. Same paper, same printer, much harder scan.
Fixes, in order of effect:
- Shorten the content. Link to a short path on your own site (
example.com/menu) and let that page redirect, instead of encoding a long URL full of parameters. A redirect also lets you change the destination later; 301 vs 302 Redirects explains which kind to use. - Print it bigger. If the content has to stay long, give the code more room.
- Lower the error correction if you raised it without needing to (see below).
The generator shows the version and module count for every code and warns when a code reaches version 10 or more, which is a good point to stop and shorten.
Cause 2: No quiet zone
A QR code needs a blank margin around it so the scanner can find its edges. DENSO WAVE, the company that invented the QR code, puts it plainly: "QR Code requires a four-module wide margin at all sides of a symbol," and "the margin is a clear area where nothing is printed," as explained in its guide to printing QR codes.
Designers often crop that margin to make the code fit, or place it against a busy photo, a border or text. On screens, phones usually cope. In print, it's one of the most common reasons a code fails. Our generator uses a quiet zone of 4 modules by default and warns if you reduce it.
If the background behind the code isn't plain, print the code on a white box that includes the margin.
Cause 3: Colors and contrast
Scanners look for dark modules on a light background. Two color choices cause trouble:
- Inverted codes. A light code on a dark background looks stylish, but many camera apps don't read it. Keep the code dark and the background light.
- Low contrast. Navy on black, or pale gray on white, can be too close for a camera in dim light. Brand colors are fine if the code stays clearly darker than its background.
The generator flags both: it warns when the code is lighter than the background and when the two colors are too close in contrast. Avoid gradients and patterns inside the modules, and don't put the code on a transparent background over an unknown color.
Cause 4: A logo in the wrong place, or too big
QR codes include error correction, extra data that lets a scanner rebuild parts of the code that are damaged or covered. That's what makes logos in the middle possible. There are four levels:
| Level | Approximate recovery |
|---|---|
| L (Low) | 7% |
| M (Medium) | 15% |
| Q (Quartile) | 25% |
| H (High) | 30% |
DENSO WAVE's page on error correction notes that "Level M (15%) is most frequently selected," that Q or H suit environments where codes get dirty, and that raising the level "increases the amount of data," which makes the code bigger and denser.
For a logo:
- Use level H, and keep the logo well under the recovery limit. Error correction also has to cover smudges and print flaws, so don't spend all of it on the logo.
- Center it. Never cover the three large squares in the corners (the finder patterns) or the area right next to them; the scanner uses those to find and align the code.
- Add the logo on top of a finished code without moving modules around, and test again afterwards.
Cause 5: Print and surface problems
- Low resolution. A code saved as a small PNG and stretched for print gets soft edges. Export SVG for print, or a PNG large enough for the final size. Our generator offers both.
- Curved surfaces. On a bottle or cup, the code bends away from the camera. Make it smaller relative to the curve, or place it on a flat label area.
- Distance. A code on a poster across the room needs to be much bigger than one on a business card. Think about where people will actually stand.
- Damage and dirt. Outdoor signs, floor stickers and kitchen menus get scuffed. Use a higher error correction level there, or laminate with a matte finish to avoid glare.
Cause 6: It scans, but nothing happens
Sometimes the scan works and the result is the problem:
- The link has no
https://. Without it, some phones show the text instead of offering to open a browser. The generator warns about links that don't start withhttp://orhttps://. - The link is broken. A typo, a page that was moved, or an expired short link turns a working code into a dead end. You can't fix a printed code, so the safest choice is a link on your own domain that you control and can redirect.
- Wi-Fi codes with special characters. In a Wi-Fi code, characters like
;,,,:,"and\in the network name or password must be escaped. The generator does this for you; hand-typed Wi-Fi codes often get it wrong.
To see exactly what a code contains, upload a photo or screenshot of it to the QR Code Reader. It shows the decoded text, so you can tell a reading problem from a content problem.
A test routine before you print
- Generate the code with the final content and check the version. Shorten the content if it's 10 or higher.
- Print a test page at the real size, on the real paper if you can.
- Scan it with at least two different phones, ideally one iPhone and one Android, from the distance people will actually stand.
- Try it in the light where it will hang, including dim light if it's a restaurant table.
- Open the result fully: make sure the page loads on mobile data, not just on your office Wi-Fi.
- Decode a photo of the print with the QR Code Reader to confirm the content is exactly what you meant.
FAQ
How small can a QR code be?
It depends on the version and the printer. DENSO WAVE's example: at 0.254 mm per module, a version 3 code (29 modules) is 7.366 mm wide before the margin. That's for high-resolution printing and close scanning; for flyers and menus, leave far more room.
Why does my QR code work on screen but not on paper?
Screens are bright, sharp and high in contrast. Print adds blur, glare and ink spread, and designers often crop the margin. Check the quiet zone, the size and the version.
Do QR codes expire?
A plain QR code never expires; it's just a pattern. What expires is the link inside it, for example a short link from a service you stop paying for.
Which error correction level should I use?
M for most printed codes. H if you add a logo or the code will get dirty. L only for clean conditions where you need to fit a lot of data.