Search for a QR code generator and you will meet this decision within about ten seconds, usually framed as free versus professional. That framing is misleading. The two types solve different problems, and the free one is correct more often than the marketing suggests.
The actual technical difference
A static QR code contains your data inside the image. The URL, the WiFi password, the contact details, physically encoded in the pattern. Scanning reads the data straight off the image. No server is involved at any point.
A dynamic QR code contains a short link to a provider's server. Scanning opens that link, the server looks up where it currently points, and redirects the phone to the real destination. The data you care about lives in the provider's database, not in the code.
Everything else follows from this one difference.
Side by side
| Static | Dynamic | |
|---|---|---|
| Data location | Inside the image | On a provider's server |
| Change destination later | No | Yes |
| Scan analytics | No | Yes |
| Works if the provider disappears | Yes | No |
| Works offline | Yes (for WiFi and text) | No, needs internet |
| Pattern density | Depends on data length | Always small (short link) |
| Ongoing cost | None | Usually monthly |
| Privacy | No third party involved | Provider logs every scan |
The risk nobody mentions in the sales page
Every dynamic QR code you print becomes a dependency. If the provider raises prices, changes terms, gets acquired, shuts down, or your card expires, every printed code stops working at once. Menus, packaging, signage, business cards: all of it, simultaneously.
This is not hypothetical. QR code services have shut down and taken working codes with them, and several have moved previously free features behind paid tiers, leaving users with printed material that stops resolving unless they subscribe.
A static code has no such failure mode. It is a picture of your data. It will scan in ten years exactly as it does today.
When dynamic is genuinely the right call
There are real cases. Be honest about whether yours is one:
- Large print runs where the destination will definitely change. Ten thousand product boxes with a link to a campaign that ends in three months.
- Marketing campaigns where scan data drives decisions. If you are comparing performance across placements, you need counts.
- Campaigns needing granular analytics: scans by location, time, device, which specific poster performed.
- Retargeting. Ad platforms can build audiences from scanners.
The pattern: dynamic earns its cost when the printing is expensive relative to the subscription, or when measurement genuinely changes what you do next.
When static is the better choice
- WiFi codes. There is no dynamic equivalent worth having, a WiFi code must work before the guest has internet, which rules out a redirect entirely.
- Contact cards. Your details change rarely, and you reprint cards anyway when they do.
- Anything printed in small volume where reprinting costs less than a year of subscription.
- Long lived signage pointing at a stable address, your homepage, your review link.
- Anything where a dead code would be a serious problem: safety information, equipment labels, access instructions.
The middle path: static code, redirect you control
Here is the approach that gets you most of the benefit of dynamic codes without the dependency, and it costs nothing beyond a domain you probably already own.
- Create a dedicated page or path on your own site, for example
yoursite.com/menu. - Generate a static QR code pointing at that address.
- When the destination needs to change, change what that page shows, or set up a redirect from it.
You now have an editable destination, because you control the page. You have basic analytics, because your own site's stats show visits to that path. And you have no third party dependency at all, the code points at a domain you own and renew.
The one thing you do not get is scan level analytics distinguishing a scan from an ordinary visit. Add a campaign parameter to the URL if that matters.
How to decide in one question
If this printed code stopped working tomorrow, what would it cost me?
If the answer is “I would reprint a few cards”, use static. If the answer is “fifty thousand boxes in a warehouse become dead”, the calculation changes, and either a dynamic service or the self hosted redirect above is worth the setup.
What we make here
Every code from this site is static: the data is encoded in the image, generated in your browser, and never touches a server. That means no account, no expiry, no scan limits, and nothing that can be switched off later. See the full list of generators, or read about sizing codes correctly for print before you send anything to the printer.
What "free" usually means on generator sites
A pattern worth recognising: many generators present themselves as free, produce a dynamic code by default, and only reveal the subscription requirement later, sometimes after codes have been printed. The code works during a trial period, then stops.
Signs you are being given a dynamic code when you wanted a static one:
- The site asks you to create an account before downloading
- The generated code is unusually simple regardless of how long your URL is
- Scanning it shows a domain that is not yours
- There is a dashboard offering scan statistics
- The download is behind a "free trial"
The simplest test: scan the finished code with a plain QR reader and look at the raw contents. If it shows your own URL, it is static. If it shows a short link on someone else's domain, it is dynamic, and that domain is now a dependency for every copy you print.
What happens to a dynamic code when things go wrong
Because the redirect sits with a provider, several ordinary business events can break printed material:
- An expired card. A failed payment can suspend an account, and with it every code on it.
- A pricing change. Free tiers get retired; features move to higher plans.
- An acquisition. New owners frequently sunset legacy free accounts.
- An account owner leaving. If the codes were created on a personal account by someone who has left the business, regaining control can be impossible.
- Service shutdown. The final case, and the one with no remedy.
None of these apply to a static code, because there is nothing in the middle to fail.
If you already have dynamic codes in the wild
You are not stuck, but you should reduce the exposure:
- Inventory them. List every printed code, where it is, and what it points at.
- Point them at your own domain. If the provider lets you set the destination, aim each code at a page on your site rather than a third party page. Then at least you control what happens at the other end.
- Move new print runs to static codes pointing at your own paths, so the dependency stops growing.
- Keep the subscription until the old print is retired: cancelling early kills the existing codes.
A note on privacy
Dynamic codes log every scan: time, approximate location, device type, and often more. For a marketing campaign that is the point. For a WiFi code in a guest bedroom, a contact card, or an equipment label, routing your users through a third party's analytics is an unnecessary disclosure, both for them and for you.
Static codes involve no third party at all. Nothing is logged because there is nothing in the path to log it.
Related terminology, briefly
Discussions of QR types tend to mix several concepts. Untangling them makes the choice clearer:
| Term | What it actually refers to |
|---|---|
| Static code | Data encoded in the image. No server involved. |
| Dynamic code | A short link that redirects via a provider's server. |
| Short link / URL shortener | The redirect mechanism dynamic codes rely on. Same dependency risk. |
| Vanity or branded code | A dynamic code whose short link uses your own domain. Reduces, but does not remove, the dependency. |
| Error correction level | How much damage a code survives. Independent of static vs dynamic. |
| Version | The grid size, from 21×21 upwards. Determined by how much data you encode. |
| Payload | The data inside the code, a URL, WiFi credentials, a contact card. |
Note that error correction and version apply to both types. A dynamic code is always small because a short link is short. That is a side effect of the redirect, not a feature of the technology.
A note on QR code security
Malicious QR codes, sometimes called "quishing", work by sending scanners to phishing pages or app downloads. Two consequences for anyone printing codes:
- Stickers get placed over legitimate codes. Parking meters and restaurant tables have both been targeted. Check your printed codes physically, and prefer codes that are laminated or mounted rather than loose stickers.
- A dynamic code hides its destination. Because the visible link belongs to the provider, a scanner cannot tell where they will end up until they arrive. A static code pointing at your own domain shows your domain in the preview, which is a small but real trust signal.
Advise customers to check the URL preview before tapping. Most phone cameras show it, and it is the single most effective defence.