Why Is My QR Code Not Scanning?
A QR code that won't scan almost always has one of a small number of problems: not enough contrast, the wrong size for the distance it's scanned from, a missing quiet zone, too much decoration, a blurry export, physical interference like glare or damage — or the code scans fine but points to a URL that no longer works.
This guide walks through each cause in rough order of how often it happens, with a concrete way to test for it and fix it. Most of these take under five minutes to diagnose.
Not enough contrast — or inverted colors
QR scanners look for dark modules on a light background. Black on white is the reference case, and the further you drift from it, the less reliable scanning gets. Dark navy on white is fine. Medium gray on beige is not — the camera can't cleanly separate modules from background, especially in dim light or at an angle.
Inverted codes (light modules on a dark background) are a special case: the QR spec assumes dark-on-light, so many readers fail on inverted codes even though some handle them. If your code is white-on-black and scans inconsistently across phones, that's likely why. Invert it back, or put the light version inside a white rounded rectangle so the code region itself is dark-on-light.
Quick test: convert your design to grayscale. If the modules don't clearly stand out from the background in grayscale, the contrast is too low.
The code is too small for the scan distance
A useful rule of thumb: minimum code width = scanning distance divided by 10. A code scanned from 25 cm away (a flyer in someone's hand) should be at least 2.5 cm wide. A poster meant to be scanned from 3 meters needs a code around 30 cm wide. Business-card-sized codes on a wall across a room simply won't scan.
Data density makes this worse. The more characters a QR code encodes, the more modules it needs, and at the same print size each module gets smaller and harder for the camera to resolve. A 300-character URL produces a much denser, more fragile code than a 30-character one. If your code looks like fine static, shorten the URL — use a short link rather than a long address with tracking parameters baked in.
The quiet zone is missing
The quiet zone is the empty margin around all four sides of a QR code. The spec calls for a border at least four modules wide (a module is one of the small squares in the code). Scanners use this blank frame to find the code's edges; without it, they struggle to lock on.
This problem usually creeps in at the design stage: a code gets cropped tight to save space, placed on a busy photo background, or boxed in with a border that touches the modules. The fix is simple — give the code clear breathing room in a solid light color, roughly the width of four modules on every side, and never let text, logos, or frames touch the code itself.
Too much styling: logos, gradients, and rounded dots
QR codes tolerate some decoration because they carry built-in error correction — the scanner can reconstruct missing data. But every styling choice spends that same error budget: a logo covering the center, heavily rounded or dot-shaped modules, gradients that lower contrast in parts of the code. Stack several of these and the code still looks fine to you but fails on real phones.
The three position markers (the large squares in the corners) are especially sensitive — scanners use them to find and orient the code, so never overlay or restyle them beyond simple color changes. If you want a logo in the middle, keep it under about 15–20% of the code's area, use a high error-correction level, and test on multiple phones before printing.
Blurry exports: the raster resolution problem
A QR code that was crisp on screen can print blurry if it started life as a small PNG or JPEG and got scaled up. Raster images have a fixed number of pixels; enlarging them softens the sharp module edges scanners depend on. JPEG compression adds artifacts on top, which is why JPEG is a poor format for QR codes in the first place.
For anything going to print, use a vector format (SVG, or PDF/EPS with the vector intact) — it scales to any size with perfectly sharp edges. If you must use PNG, export it at the final print size or larger: at least 1,000 × 1,000 pixels is a safe floor for typical print uses. Never screenshot a QR code and enlarge the screenshot.
The code scans, but the link is dead
This is the failure people notice last and it's often the real problem: the camera reads the code instantly, but the page behind it is gone. The menu PDF was moved, the campaign page was taken down, the domain lapsed, or someone "cleaned up" the site. Nothing about the printed code is wrong — the destination died. Before debugging print quality, scan the code yourself and see what actually loads.
With a standard static QR code, the URL is encoded directly into the pattern, so a dead link means reprinting everything the code appears on. Dynamic QR codes avoid this: the code encodes a permanent short link, and you change where that link redirects whenever you need to — the printed code never goes stale. That's the core of what ScanTrail does; it also shows you scan counts, so you'd notice a dead link from the traffic dropping to zero instead of from a customer complaint.
The honest trade-off: a dynamic code depends on the redirect service staying online. For a code you expect to reprint anyway, or a destination that will never change, static is simpler and has no dependency at all.
Glare, lamination, and physical damage
Glossy lamination, plastic sleeves, and glass frames all reflect light. Under overhead lighting or sunlight, the reflection can wash out part of the code from the exact angle someone is scanning at. If a laminated code works indoors but not near a window, glare is the culprit. Matte lamination fixes it, as does repositioning the code away from direct light sources. Curved surfaces — bottles, mugs, sleeves — cause a similar problem by distorting the grid; keep codes on the flattest part of the object and make them a bit larger than you would on a flat surface.
Physical damage is where error correction earns its keep. QR codes come in four error-correction levels — L, M, Q, and H — which can recover roughly 7%, 15%, 25%, and 30% of damaged data respectively. A code printed at level H survives scratches, stains, and small tears that would kill a level-L code. For anything living outdoors or getting handled a lot, generate the code at level H and accept that it will be slightly denser.
Common questions
What size should a printed QR code be?
Divide the expected scanning distance by 10. A code scanned from arm's length (about 25 cm) should be at least 2.5 cm wide; a poster scanned from 3 meters needs a code around 30 cm wide. Add extra size if the code is dense (long URL) or on a curved surface.
Can a QR code expire?
The printed pattern itself never expires — it's just encoded data. What can die is the destination: a static code stops being useful the moment its URL goes down, and a dynamic code stops working if the redirect service behind it shuts down. Services like ScanTrail exist to keep that redirect permanent and repointable, but the code image itself has no expiry date.
Why does my QR code scan on one phone but not another?
A code that scans inconsistently is usually marginal — borderline contrast, slightly too small, an inverted color scheme, or heavy styling. Newer phone cameras compensate better than older ones, so the code appears to "work sometimes." Fix the underlying issue rather than assuming the failing phone is broken.
How much damage can a QR code tolerate?
It depends on the error-correction level chosen when the code was generated: level L recovers about 7% of damaged data, M about 15%, Q about 25%, and H about 30%. Damage to the three large corner squares is worse than damage elsewhere, because scanners need those to locate the code at all.
Do people need a special app to scan QR codes?
No. The built-in camera app has scanned QR codes natively on iPhone since iOS 11 (2017) and on most Android phones for years — pointing the camera at the code pops up the link. If someone's camera doesn't react, the code itself is usually the problem, not the phone.
Need a QR code that never goes stale?
ScanTrail codes can be re-pointed after printing — free to start.