
Why is my QR code not scanning? A diagnostic guide for marketing campaigns
A QR code that won't scan is really three problems: the camera can't read it, the link won't open, or the page has moved. Work through the three gates, see which failures need a reprint and which you can fix in seconds, and test every code before print.
ScanKit · Organization
· 15 min read
A QR code that will not scan is a special kind of panic, because by the time you notice it the codes are usually already in the wild: printed on ten thousand flyers, varnished onto a shop window, or screen-printed across a fleet of vans. The good news is that "not scanning" is rarely one problem. It is three, and they fail in completely different ways. Sort out which of the three you are looking at and the fix almost always reveals itself, often without a reprint.
This guide is written for agencies running QR campaigns, so it leans on the failures that hit printed work: codes that scan fine but land on the wrong page, links that have quietly died, and the difference between a code you can still rescue and one you have to print again. The purely physical causes (size, contrast, a logo placed badly) are covered in depth elsewhere, and we link out to those rather than repeat them. Let us locate the fault first.
Start here: three questions that locate the fault
Almost every scan failure sits at one of three gates. Walk them in order, because each one rules out a different set of causes, and a code can pass the first two and still fail the third.

- Does the camera read the code at all? Point a phone at it. If the camera never recognises a code is there (no link banner, no buzz, nothing), the problem is the printed image itself: too small, too low-contrast, missing its margin, damaged, or smothered by a logo. This is Gate 1, and it is physics.
- Does it read, but nothing opens? The phone clearly detects the code (you get a notification or a tappable banner) but tapping it goes nowhere, throws a security warning, or stalls. The pattern is fine; the link inside it is the problem. This is Gate 2.
- Does it open, but the wrong or dead page loads? The code scans, the browser opens, and you get a 404, an expired-link page, or simply the wrong destination. The code did its job perfectly. The destination is the fault. This is Gate 3, and it is where dynamic codes earn their keep.
Keep that order in your head for the rest of this guide. Most "broken QR code" support tickets are actually a Gate 3 problem dressed up as a Gate 1 panic.
Gate 1: the camera never reads the code
If no phone will even detect the code, something about the printed pattern is below the threshold a scanner needs. These are the print-physics causes, and ScanKit has full guides on the two that matter most, so this section is a fast triage with links rather than a re-teach.
The quiet zone is missing or cropped. The QR standard, ISO/IEC 18004, requires a clear margin of four modules (four "pixels" of the code) on all four sides. Designers routinely crop into it or run text and borders up to the edge, and scanners then cannot find the code's boundary. Restore a four-module margin of plain background and a surprising number of "dead" codes come back to life.
It is printed too small for the viewing distance. Every code has a minimum size below which the camera cannot resolve individual modules. A common field rule is to size the code at roughly one tenth of the expected scanning distance, so a poster read from two metres wants a code around 20 cm across. For the full method, including how data density changes the minimum, see how big a QR code should be.
Contrast is too low, or the colours are inverted. Scanners expect dark modules on a light background. Light-on-dark codes, low-contrast pairings (navy on black, yellow on white), or a gradient running across the modules all push detection past its limit. When in doubt, go back to dark code on a white quiet zone.
A logo is covering too much. Logos work because QR codes carry redundancy through error correction, but only up to a point. The four levels recover roughly 7% (L), 15% (M), 25% (Q) and 30% (H) of the code if it is obscured or damaged. Cover more than the active level tolerates and the code dies. The full trade-off, including which level to export at, is in putting a logo in a QR code without breaking it.
The print itself is degraded. Glare on glossy or laminated stock creates a white hot-spot that wipes out modules. A JPG export compresses the sharp black-and-white edges into mush, so always supply print codes as vector (SVG, EPS or PDF) or a high-resolution PNG. Curved surfaces (cups, bottles, vehicle panels) bend the grid, and physical scuffing eats into the error-correction budget you were relying on.
If the code clears Gate 1 (any phone reliably detects it), stop looking at the artwork. The rest of your problem is digital.
Gate 2: it reads, but nothing opens
Here the camera detects the code and offers you a link, but tapping it fails. The pattern is correct, so reprinting will not help. The fault is in the URL the code carries or the route it takes.
The link is not secure, or has no scheme. A destination encoded as plain http:// (or with no https:// at all) can trigger a "Not Secure" warning, get blocked on managed devices, or simply look untrustworthy enough that people back out. Always encode a fully qualified https:// URL. This also matters for trust on printed codes, where the user cannot see the link before they commit. Our QR code security guide covers why a visible, verified domain reassures people at the point of scan.
The URL is malformed. A stray space, a smart quote pasted from a document, a missing top-level domain, or an unencoded character will produce a code that scans but resolves to nothing. Copy destinations as plain text, never from a styled document, and test the exact string before it goes into the generator.
A redirect in the chain is broken. Short links and tracked codes work by redirecting: the scanned URL points to a redirector, which forwards to the real page. If any hop in that chain is misconfigured, expired, or pointing at a dead target, the user gets stranded. Test the whole chain on both iOS and Android, not just the first link.
The phone is offline or stuck on a captive network. This one is not your code's fault, but it shows up constantly at events and on transport. A phone connected to a captive Wi-Fi portal (the kind that wants a login) will fail to load the real page until the user either signs in or switches to mobile data. If a code works on your phone but fails in a specific venue, suspect the network before the code.
Gate 3: it opens, but the wrong or dead page loads
This is the most common failure on a live campaign and the most misdiagnosed, because the code is flawless. It scans, the browser opens, and then: a 404, a parked-domain page, a login wall, or simply last season's landing page. The destination has moved or died underneath a code that is doing exactly what it was told.
Typical causes are mundane. The marketing page was deleted or renamed in a site migration. The campaign microsite's domain lapsed. A URL structure changed and nobody updated the code. A third-party shortener was shut down. Or, with a tracked code, the subscription behind it lapsed and the redirect stopped resolving.
What you do next depends entirely on one decision you made before printing.
If the code is static, the destination URL is baked into the printed pattern itself. There is no way to change where it points. Your only options are to fix the thing at the other end (restore the page, renew the domain, recreate the exact old URL) or to reprint every code with a corrected destination. On a printed campaign that has already shipped, that is expensive and slow.
If the code is dynamic, the printed pattern points at a short redirect you control, and the real destination lives in a dashboard. A wrong, dead, or outdated destination is a one-field edit: change the target, save, and every existing printed code now resolves correctly within seconds. No reprint. This is the entire argument for dynamic over static codes, and the mechanics of the fix are walked through in changing a QR code's destination without reprinting.
The practical lesson for agencies: a Gate 3 failure on a static campaign is a crisis, and the same failure on a dynamic campaign is a thirty-second task between meetings.
Can a QR code actually expire?
This question causes real confusion, and getting it right is a credibility win, because most vendor blogs blur it. The honest answer is: it depends what kind of code you printed.
A static code never expires on its own. The URL is encoded directly into the black-and-white pattern, so the code will resolve for as long as the page at that URL exists. There is no clock and no subscription. If a static code stops working, the page moved or died, not the code.
A dynamic code can effectively expire, because it depends on a live redirect service. If the subscription or account behind that redirect lapses, the short link stops forwarding and every printed code points at a dead end. This is not a flaw in dynamic codes; it is the cost of the flexibility that lets you change destinations after printing. The takeaway is simply to keep the account that powers a printed campaign active for as long as those codes are in circulation, which for a printed asset can be years.
So "QR codes expire" is half-true and half-myth. The pattern never rots. The service behind a dynamic code can, if you let the account lapse.
"It works on my phone but not on theirs"
When a code scans for you but fails for a colleague or a customer, the code is almost never the problem. It is the device.
On iPhone, native scanning from the Camera app has worked since iOS 11. If a recent iPhone does nothing when pointed at a code, the most likely cause is that QR scanning has been switched off in Settings, then Camera, then Scan QR Codes. Toggle it on. Very old iPhones below iOS 11 need a third-party scanner app.
On Android, most phones running Android 8 or 9 and later scan from the default camera, and where they do not, Google Lens handles it. A user on an older Android build, or one using a third-party camera app that lacks QR detection, will fail on a code that scans fine everywhere else.
So when a single user reports a "broken" code, check their OS version and their camera's QR setting before you touch the artwork. A code that scans on a range of devices is a working code, and chasing one outdated handset will send you redesigning something that was never wrong.
Test a QR code properly before it goes to print
Almost every painful scan failure is preventable with a few minutes of testing on the proof, not the artwork file. Before any code goes to a printer, run it through this:
- Scan the actual printed proof, not the on-screen design. Print it at final size, on the final stock, and scan it under the lighting it will live in. Glossy laminate and dim retail lighting both change the result.
- Test on at least one iPhone and one Android device. Native cameras on both platforms behave slightly differently, and you want to catch a platform-specific failure now.
- Walk the full redirect chain. Confirm the code lands on the exact, final,
https://destination, not a staging URL or an old version of the page. - Scan from the real distance. Read a poster from across a room and a flyer from arm's length, matching how people will actually use it.
- Confirm scans are being recorded. If the code is meant to be tracked, scan it a few times and check the count moves. A code that scans but logs nothing is a measurement failure, covered in which scan metrics matter and, for the "scans show as direct traffic" trap, in QR codes in Google Analytics 4.
Build that into the sign-off step and Gate 1 and Gate 2 failures essentially stop happening on your campaigns. Gate 3 you handle by printing dynamic codes, so the one failure mode you cannot test away is also the one you can fix in seconds.
Frequently asked questions
Why is my QR code not scanning?
Work through three gates in order. First, does any phone camera even detect the code? If not, the printed image is the problem (too small, low contrast, missing its four-module margin, or covered by a logo). Second, does it detect the code but fail to open anything? Then the encoded link is broken or insecure. Third, does it open the wrong or a dead page? Then the code is fine and the destination has moved or died. Most real-world failures are the third kind.
Why does my QR code scan but go to the wrong page?
The code is working correctly; its destination has changed underneath it. The page was deleted or renamed, the domain lapsed, or the URL structure changed in a site update. If the code is dynamic you can repoint it to the correct URL in a dashboard in seconds with no reprint. If it is static, the URL is baked into the pattern and you must either restore the old page or reprint.
Can a QR code expire?
A static QR code does not expire, because the URL is encoded directly in the pattern and resolves for as long as that page exists. A dynamic QR code can stop working if the subscription or account behind its redirect lapses, because the short link then has nothing to forward to. Keep the account powering a printed campaign active for the whole life of those printed codes.
How do I fix a QR code without reprinting it?
Only dynamic codes can be fixed without reprinting. Because the printed pattern points at a redirect you control, you change the real destination in a dashboard and every existing code updates within seconds. Static codes have the URL baked in, so the only fixes are repairing the destination at the other end or reprinting. This is the main reason agencies print dynamic codes for anything that goes to physical media.
How much of a QR code can be damaged and still scan?
It depends on the error-correction level set when the code was generated. The four levels recover roughly 7% (L), 15% (M), 25% (Q) and 30% (H) of the code. A code at level H can lose up to about 30% of its area to damage, dirt, or a logo and still scan, which is why high error correction is recommended for codes that will live in rough environments.
Why won't my iPhone scan a QR code?
Native scanning works from the Camera app on iOS 11 and later. If nothing happens, open Settings, then Camera, and switch on Scan QR Codes. Hold the phone steady and fill more of the frame with the code. iPhones older than iOS 11 need a dedicated scanner app from the App Store.
Why won't my Android phone scan a QR code?
Most phones on Android 8 or 9 and later scan from the default camera. If yours does not, open the code with Google Lens, which is built into recent Android versions and the Google app. Third-party camera apps sometimes lack QR detection, so try the stock camera or Lens before assuming the code is broken.
Does a QR code need to use https?
Yes, in practice. Encode a fully qualified https:// destination. A plain http:// link can trigger a "Not Secure" warning, be blocked on managed devices, and undermine trust at the moment someone scans a printed code they cannot preview. A secure, recognisable destination domain also helps people feel safe scanning, which matters for conversion as much as for security.
Why does the same code work on my phone but not someone else's?
That is almost always a device difference, not a code fault. The other phone may run an OS too old for native scanning, have the camera's QR setting switched off, or use a third-party camera app without QR detection. If a code scans reliably across several current devices, it is a working code, and you should troubleshoot the failing handset rather than redesign the artwork.
The short version
A QR code that will not scan is really three different problems. At Gate 1 the camera cannot read the printed pattern, which is a physical issue: size, contrast, the four-module quiet zone, error correction, or a heavy logo. At Gate 2 the code reads but the encoded link is broken or insecure, so check for a missing https://, a malformed URL, or a dead redirect hop. At Gate 3 the code reads and opens but the destination has moved or died, which on a static code means a reprint and on a dynamic code means a one-field edit that fixes every printed copy in seconds.
That last point is the strategic one for agencies. You cannot test away a page that gets deleted six months after the flyers ship, but you can make it a non-event by printing dynamic codes whose destination you control. Before your next run, scan the printed proof on both an iPhone and an Android, walk the redirect to the final https:// page, confirm the scans are logging, and print the campaign on dynamic codes so any future Gate 3 surprise is a thirty-second fix, not a reprint.
Keep reading

· 14 min read
QR code landing pages: the half of the campaign that happens after the scan
A scan is not a result. This guide covers the QR code landing page: homepage vs dedicated page, message match with the print, Core Web Vitals on cellular, the first-screen anatomy, and how to prove to a client that scans became conversions.
Read more
· 14 min read
How to A/B test a QR code campaign without fooling yourself
A printed QR code can't be randomised like a web page, so the obvious two-poster test measures placement, not creative. How to A/B test a QR campaign properly: split the destination behind a dynamic code, judge on conversion rate, and be honest about significance.
Read more