The short answer
When a QR code won’t scan, the cause is almost always one of a small number of fixable mistakes — not the code itself being “broken”. The usual suspects are a quiet zone that’s too small, low contrast between the dark and light modules, a logo that’s too big, a print that’s too small for its scan distance, a glossy or curved surface that throws off the camera, data that’s too dense for the QR version, error correction that’s too low for the wear the code takes, or — if it’s a dynamic code — a redirect link that has expired or rotted.
Each of these has a straightforward fix, and you can usually diagnose the problem in under a minute by working through the checklist below. This page walks through every common QR code mistake, what symptom it produces, and exactly how to fix it. For the design rules that prevent these problems in the first place, see our qr best practices guide.
Run through the checklist first
Before you regenerate anything, work through this table. It covers the eight causes that account for almost every “my QR code is not working” support query, with the symptom you’ll see and the fix for each.
| Mistake | What goes wrong | The fix |
|---|---|---|
| Quiet zone too small | No blank margin around the code; readers can’t find the edges | Leave at least 4 modules of empty space on every side |
| Low contrast | Light-on-dark or muted colors; camera can’t tell dark from light | Use dark modules on a light background; aim for strong contrast |
| Logo too big | Centered logo covers too much data area; code won’t decode | Keep the logo to about 20–22% of the code width and use level H |
| Print too small | Code prints smaller than the camera can resolve at the scan distance | Follow the 1/10 rule: code width ≈ scan distance ÷ 10 |
| Glossy or curved surface | Glare and reflections blur the pattern; curves distort it | Print on a matte finish and keep the code on a flat surface |
| Data too dense | Too much data forces a high QR version with a tiny module grid | Shorten the payload; use a short URL instead of a long one |
| Error correction too low | Low EC leaves no margin for smudges, scratches, or logo coverage | Raise EC to M for general use, or H for logos and rough surfaces |
| Dynamic link expired or rotted | A dynamic code’s redirect target is gone; code scans to a dead page | Re-point the redirect, or use a static code that can’t rot |
Give it a proper quiet zone
The quiet zone is the empty margin around the QR code, and it is the single most overlooked mistake. Scanners need that blank border to locate the finder patterns in the corners and frame the code; without it, the camera can’t tell where the code ends and the surrounding artwork begins, so it simply won’t decode. The standard requires at least 4 modules of empty space on every side, and more is fine.
The fix is easy: leave a real margin — not a thin white line, but genuine empty space equal to about 4–5 of the small squares inside the code on each side. Don’t butt the code against an edge, a border, or other graphics, and don’t fill the quiet zone with a caption or frame that touches the pattern. Our qr code size guide covers how the quiet zone relates to overall print size.
Keep dark-on-light contrast
A QR code is read by distinguishing dark modules from light ones, so low contrast is a top cause of “why won’t my QR code scan”. Light-on-dark (inverted) codes, pastel-on-white codes, and codes printed on a busy or colored background all fail because the camera can’t reliably tell the two apart. Some advanced readers can handle inversion, but most phone cameras in most lighting cannot.
The fix: use dark modules on a light background — near-black on near-white is the safest — and keep the contrast strong. Test the code in real lighting, not just on a bright screen. If you must brand it with color, keep the dark modules dark enough and the light modules light enough that there’s clear separation, and avoid glossy stock that reflects the camera flash; a matte finish scans far more reliably.
Size the logo for level H
A centered logo looks great but it covers part of the data area, and a logo that’s too big is one of the most common reasons a stylized QR code won’t scan. The fix has two parts: keep the logo to roughly 20–22% of the code’s total width, and generate the code at error correction level H so the roughly 30% redundancy can absorb the area the logo covers.
Never let the logo overlap the three finder patterns in the corners — those squares are how the camera locates the code, and covering one is fatal. Keep a light margin around the logo too, so it doesn’t bleed into adjacent modules. Level H buys you the resilience, but it also makes the grid denser for the same data, so keep the payload short. Our qr error correction guide explains the L/M/Q/H trade-off in depth.
Print it big enough for the scan distance
A code that scans perfectly on your screen can fail on a poster because it’s printed too small for the distance people scan from. The practical rule of thumb is the 1/10 rule: the code’s printed width should be about one tenth of the scan distance. A code on a business card scanned from 10 cm needs to be at least about 1 cm across; a code on a poster scanned from 1 m needs to be at least about 10 cm across.
Add margin for difficult lighting and older phone cameras — round up, not down. Denser codes (higher QR versions, from more data or higher error correction) have smaller individual modules, so they need a larger overall print to keep each module big enough to resolve. Our qr code size guide has a recommended minimum size for every common use case.
Keep the data short and the error correction right
The more data you encode, the higher the QR version, the more modules, and the smaller each module is for a given print size — which makes the code harder to scan. A long URL with tracking parameters can push a code from a clean 25×25 grid to a dense 33×33 grid that needs a bigger print or a closer scan. The fix is to keep the payload short: use a short link, drop unnecessary query parameters, and prefer the tightest encoding mode.
Pair that with the right error correction level. Level M (~15% recovery) is the sensible default for clean codes; drop to L only for maximum capacity in a clean environment, and raise to H for logos, rough surfaces, or anything that will get scuffed. Too-low error correction is a common reason a code works fresh but stops scanning after a few weeks of wear. See our qr error correction guide and our how many characters can a QR code hold guide for the capacity and resilience trade-offs.
If it’s a dynamic code, the link may have rotted
A static QR code encodes its payload directly in the pattern, so if it scans at all it scans to exactly what you encoded — it can’t “expire”. A dynamic QR code is different: it encodes a short redirect URL, and the real destination lives on a server. If that redirect is disabled, if the subscription lapses, or if the destination page is taken down, the code still scans but lands on a dead page — and every printed copy fails at once.
The fix depends on the code: if it’s dynamic, check that the redirect still resolves and repoint it if needed (the whole point of dynamic is that you can change the destination without reprinting). If you don’t need editability or analytics, a static code is the safer default precisely because it can’t rot — it has no server dependency. Our do QR codes expire guide and our qr code redirect guide cover this in detail.
Frequently asked questions
Why won’t my QR code scan?
Almost always one of a few fixable causes: the quiet zone is too small, the contrast is too low, a centered logo is too big, the print is too small for the scan distance, the surface is glossy or curved, the data is too dense for the QR version, the error correction is too low, or — for a dynamic code — the redirect link has expired. Work through the checklist on this page to find and fix it.
What is the most common QR code mistake?
A quiet zone that’s too small. Scanners need a blank margin of at least 4 modules on every side to locate the code; without it the camera can’t frame the pattern and won’t decode, no matter how good the code itself is. Leave real empty space around the code on all four sides.
How do I fix a QR code that won’t scan?
Start with the quiet zone (at least 4 modules of margin), then check contrast (dark modules on a light background), logo size (about 20–22% of the code width with level H), print size (the 1/10 scan-distance rule), and surface (matte, flat). For dynamic codes, check that the redirect still resolves.
Can a QR code stop working over time?
A static QR code cannot expire — the data is baked into the pattern and scans forever. A dynamic QR code can stop working if its redirect is disabled or the destination page is removed, because the destination lives on a server rather than in the code. Wear and smudges can also make a low-error-correction code stop scanning after it was fine when fresh.