File safety
Why QR codes stop working
Most free QR generators encode a link to their own domain and redirect. Learn why printed codes die, and how to make one that outlives the service that made it.
Reviewed and updated
A QR code cannot expire
A QR code is a printed pattern that encodes text. Scanning it hands that text to the phone, and if the text looks like a web address the phone offers to open it. There is no account behind it, no server, and nothing with an expiry date. A code printed on paper in 2015 encodes exactly the same text today.
So when a menu, a poster, or a packaging label stops working, the code did not expire. Something the code pointed at did.
What actually breaks
Most free QR generators do not encode the address you type. They encode a short link on their own domain, and that link redirects to yours. The pattern says something like qr-service.example/a7f3k and the visitor is forwarded on arrival.
That indirection is what gives those services a business. It lets them count scans, change the destination after printing, and put your code behind a subscription later. It also means the printed code depends on that company continuing to operate the redirect, indefinitely, for free.
When any of that changes, every code already printed stops working at once. The service shuts down, or moves free accounts behind a paywall, or expires links after a trial period, or simply retires the short domain. Nothing you control has changed. The paper is fine. The link in the middle is gone.
Static and dynamic, plainly
A static code encodes your destination directly. There is nothing between the scanner and your address. It cannot be revoked, it works offline from the printing perspective, and it lasts as long as your address does. What you give up is the ability to change where it points, and any scan analytics.
A dynamic code encodes a redirect. You can repoint it after printing and see how often it is scanned. What you give up is independence: the code works for exactly as long as the redirect provider chooses to keep serving it.
Neither is wrong. The mistake is picking a dynamic code by accident because it was the default, printing five thousand of them, and finding out eighteen months later.
Which one you have
Scan your own code with a phone and read the address it shows before opening it. Every modern camera app previews the destination.
If it shows your own domain, it is static. If it shows a domain you have never heard of, it is dynamic, and the code you printed belongs partly to whoever owns that domain.
This habit is worth keeping for codes you did not make, too. Because a QR code is opaque to the eye, it is a convenient way to hide a destination, and the FTC has warned about codes placed on parking meters, packages, and letters that lead to phishing pages. Reading the address before tapping costs a second.
Making one that lasts
Encode the final address directly, with a QR generator that does not put a redirect in the middle. If the destination might change, the durable answer is to control the indirection yourself: point the code at a stable address on your own domain and change what that address serves. You keep the ability to repoint, and it does not depend on anyone else.
Keep the encoded address short. Fewer characters means fewer modules, which means larger modules at a given printed size and a code that scans faster from further away. This is a real reason to avoid pasting a long tracking-parameter address into a code, quite apart from what those parameters do.
Printing it so it scans
Three practical points cause most failed scans.
Keep the quiet zone. The specification requires a clear margin of four modules around the code. Cropping tight to the edge, or letting a design element touch it, is one of the most common reasons a code that worked on screen fails in print.
Use vector output for print. An SVG is geometry and stays sharp at any size, from a business card to a poster. A small PNG scaled up produces soft edges that scanners struggle with.
Match the error correction to the surface. A QR code carries redundant data so it still reads when part is damaged. Level M recovers around fifteen percent and is fine for clean indoor printing. Level Q or H recovers more and is worth the denser code for anything that will be scuffed, curved, laminated, or partly covered. Level H is what makes a logo over the centre possible without breaking the code.
Test before the print run
Scan the final artwork, at final size, with more than one phone, in the light the code will actually live in. A code that scans from a bright screen at arm’s length can fail at the size and contrast of a printed menu in a dim room.
Print a single proof first. It is a cheap step, and it is the only one that tests the thing you are actually shipping.
The FileGizmo way
Free tools. Never uploaded.
Good to know
Frequently asked questions
Can a QR code expire by itself?
No. The code is a printed pattern of modules holding fixed text. Nothing inside it can change or lapse. What expires is the redirect service that some generators put in the middle.
How do I tell whether my code is static or dynamic?
Scan it and read the address before opening it. If it shows your own address, it is static. If it shows some other domain that then forwards you, it is dynamic and depends on that company.
Why would anyone want a dynamic code?
Because you can change the destination after printing, and count scans. Both are genuinely useful. The trade is that your printed code now depends on a third party continuing to exist and stay free.
What error correction level should I use for something printed?
M is fine for clean indoor printing. Choose Q or H for anything exposed to wear, curved surfaces, or partial covering, and H if you are placing a logo over the middle.