A QR code that worked last month and now dead-ends on an error page hasn't worn out. The data encoded in the pattern never changes and never expires on its own. What fails is one of four things around it: a lapsed redirect service, a defunct provider, a dead destination page, or the print itself. This guide walks through each one, in order of likelihood, with a fix for every case and a short prevention checklist so it never happens again.

Quick diagnosis

Symptom when you scanMost likely causeFix
Opens a page saying "expired," "upgrade to continue," or showing adsDynamic QR redirect lapsedRegenerate as a static code and reprint
"Site can't be reached" or a blank errorThe QR provider shut downRegenerate as a static code and reprint
Opens your site, but shows a 404The destination page moved or was deletedRestore the page or redirect the old URL
Phone camera never reacts at allPrint problem: size, contrast, damage, marginsReprint larger, dark-on-light, with a quiet zone

1. The scan works, but lands on an "expired" page, upgrade prompt, or ads

This is the most common failure, and it comes down to how the code was made. There are two kinds of QR codes. A static code encodes your data, the actual URL, directly in the black-and-white pattern. There is nothing to expire, ever. A dynamic code instead encodes a short redirect URL owned by the company that generated it. Every scan hits that company's server first, which forwards the visitor to your real destination, but only while your trial or subscription is active. When it lapses, the provider swaps your destination for an expiry notice, an upgrade prompt, or ads. Many popular QR generators default to dynamic codes, because that ongoing dependency is exactly what you pay to maintain.

How to check: scan the code and read the URL your camera shows in the preview banner before you tap it. If it's your actual destination, the code is static. If it's a short link on a domain you don't recognize, it's dynamic, and that redirect is what died. Our static vs. dynamic guide covers the mechanics in detail.

The fix: the printed code can't be repaired without resubscribing, because the provider's redirect URL is baked into the pattern permanently. The cleaner solution is to generate a new static code that points directly at your destination, then reprint. It removes the middleman entirely.

2. The provider shut down

Same mechanics, worse outcome. If the company operating the redirect goes out of business or retires its short-link domain, every dynamic code it ever issued goes dark at once, usually as a "site can't be reached" error rather than a polite expiry page. There is no one left to pay, so there is nothing to revive. Regenerate as static and reprint. Our page on whether QR codes expire explains why this failure is structural, not bad luck.

3. The destination link itself is dead

Sometimes the code is perfectly healthy and the web page behind it died: classic link rot. A site redesign changed the address, a shared file was deleted, a domain registration lapsed. The scan succeeds; the browser then shows a 404 or an error page.

How to check: type the destination URL into a browser by hand. If it fails there too, the problem is the page, not the code.

The fix: restore the page, or set up a redirect from the old address to the new one on your site. This is the one failure a static code can't prevent on its own, which is exactly why the prevention section below says to point codes only at URLs you control and intend to keep stable.

4. The phone won't detect the code at all

If the camera never reacts, no link banner, nothing, the problem is physical rather than digital:

  • Printed too small. A common rule of thumb is scanning distance divided by ten: a code scanned from about ten inches away, roughly how far people hold a phone, should be at least an inch across. A poster scanned from ten feet needs to be roughly a foot across.
  • Low contrast. Scanners want dark modules on a light background. Pale gray on white, gold foil on cream, or a busy photo behind the code can all push it below the readability threshold.
  • Inverted colors. A light code on a dark background looks striking and frequently fails, because many phone cameras only reliably read dark-on-light.
  • Glossy or damaged surfaces. Glare from lamination, curved bottles or mugs, scratches, and weathering all eat into the code's built-in error correction, which tolerates some damage but has hard limits.
  • No quiet zone. A QR code needs a blank margin on all four sides. Cropping it tight or butting it against text and artwork confuses detection.

The fix: regenerate the code at high resolution, print it dark-on-light on a matte surface, keep the white margin, and size it for the real scanning distance.

Prevention: three habits that end QR problems for good

  1. Use static codes. A static code made with PermaQR is generated entirely in your browser: nothing is uploaded, no account exists, and there is no server or subscription that can revoke it later.
  2. Point it at a URL you control. This trick replaces most dynamic-QR use cases. Encode your own site page, a shared file, or a simple link-hub page you own, and you can change what's behind that URL anytime without touching the print. A restaurant can update the PDF behind its menu QR code every week, forever, behind one static code.
  3. Test the final artwork. Before a big print run, scan a physical proof with at least one iPhone and one Android phone, at the real distance, in the real lighting. Sixty seconds of testing prevents most reprints.

When a paid dynamic service is genuinely worth it

To be fair to paid tools: dynamic codes earn their subscription in a few real scenarios. If you need scan analytics (counts, timing, rough location), if you truly can't host or control any URL yet still need to change destinations after printing, or if you manage large multi-campaign print runs where re-pointing one code saves serious money, a reputable paid service is the right call. Just budget for the subscription to outlive every printed copy of the code. For everything else, from wedding signs to Wi-Fi cards, a free static code from the generator pointed at a URL you control does the same job with zero ongoing risk.