Static vs dynamic QR codes: the definitive guide
Paolo Matias Tonello8 min read
Every QR code guide talks about static versus dynamic as if it were a pricing tier. It is not. It is a difference in what is physically encoded in the black and white modules, and that difference decides whether you can ever change the destination after the code is printed.
What is actually encoded in the modules
A QR code is a grid of black and white squares called modules. The modules are not a picture of your link; they are a bitstream, encoded with Reed-Solomon error correction, that a scanner decodes back into raw data. A static QR code encodes your final content directly: the full https:// URL, the raw WiFi SSID and password, the vCard text block, the plain text string. Whatever you typed into the generator is, byte for byte, sitting inside that pattern of squares.
A dynamic QR code encodes something much shorter: a redirect URL pointing at a service you control. On Qreator that link looks like qreator.tech/r/AB3kD9. The modules contain only that short string. When a phone scans it, the camera app opens the short link, your server looks up which real destination AB3kD9 currently points to, and responds with an HTTP redirect — typically a 301 (permanent) or 302 (temporary) status code — that sends the browser on to the actual page.
Why a static code cannot be edited, ever
This is the part people find counterintuitive: there is no server, no account, and no database row behind a static QR code. The destination lives inside the printed pixels themselves. Once ink is on paper, or vinyl, or a product label, the only way to change where it points is to print a new pattern of modules and physically replace the old one. There is no dashboard toggle that reaches back into ink that has already dried.
How dynamic resolution works server-side
A dynamic code's short URL is a pointer, not a payload. The redirect service holds a lookup table mapping short codes to destinations, and that table is exactly what you edit in your dashboard. Change the destination, save, and the next scan of the exact same printed code — the same physical modules — lands somewhere new, because the server-side lookup changed, not the pixels.
This is also the only place scan analytics can exist. A static code is scanned by a phone's camera app and opened directly; no request ever touches your infrastructure, so there is nothing to log. A dynamic code's short link is a real HTTP request to a real server before the redirect fires, which is the one point where a scan can be counted — device type, OS, browser, country, and timestamp, without needing cookies or personal data.
Module density: why short links scan better
QR codes have a fixed number of "versions" (grid sizes), and more data forces a bigger grid with smaller squares at any given print size. A typical long marketing URL with UTM parameters might run 80-120 characters. A Qreator short redirect link is usually under 25 characters. Fewer characters means fewer QR versions needed, which means larger, more forgiving modules at the same physical print size — and a code that a phone camera can lock onto faster and from farther away.
- Long tracking URL (100+ chars): higher version, denser grid, smaller modules at a given size
- Short redirect link (under 25 chars): lower version, sparse grid, larger modules at the same size
- Sparse grids tolerate more print imperfection: ink spread, low contrast, slight blur
When static is the right answer
Static is correct whenever the content is genuinely permanent, needs to work with no server dependency, or you deliberately don't want tracking. WiFi credentials and vCard contact cards are classic cases: the whole point is that the phone gets usable data offline, instantly, with nothing to look up. A permanent link that will never change — a company's root domain, an App Store listing that won't be replaced — is also a fine static use. And if privacy-by-design matters more than analytics for a given use case, static guarantees zero server involvement because there is no server in the loop at all.
When dynamic is right
Dynamic earns its keep the moment reprinting is expensive or impossible. Packaging that ships thousands of units, a print run of posters or flyers, table menus that change seasonally, direct mail campaigns, event signage printed weeks in advance — anywhere the physical artifact will outlive the current destination, or where you want to A/B test landing pages without touching the print file, dynamic is the only option that doesn't require a reprint.
| Property | Static | Dynamic |
|---|---|---|
| What's encoded | Final content directly | Short redirect URL (e.g. /r/AB3kD9) |
| Editable after printing | No, never | Yes, any time from the dashboard |
| Scan analytics | Not possible | Total & unique scans, device, country |
| Server dependency | None | Requires the redirect host to stay up |
| Module density for same content | Higher (full URL length) | Lower (short link only) |
| Works fully offline | Yes (WiFi, vCard, text) | No, needs the phone's network |
| Best for | Permanent links, WiFi, vCard, no-tracking | Print runs, campaigns, packaging, menus |
| Cost of a mistake | Full reprint of every unit | Fix the destination, zero reprint |
You cannot convert a printed static code later
This is the mistake worth avoiding up front: teams print a static URL code on a packaging run, then later want to add analytics or change the landing page, and discover there is no migration path. The destination is baked into ink that's already on shelves. The only fix is reprinting. If there's any realistic chance you'll want to change the destination or measure scans — even "probably not, but maybe" — generate the code as dynamic from day one. The short link costs nothing extra to print and keeps every future option open.
Put it into practice
Keep reading
- Why QR codes stop working (and how to avoid it)Most "broken" QR codes are fine — the destination behind them, or the print job around them, is what actually failed.
- QR code error correction and minimum print sizeHow much damage a QR code can survive is a number you choose at generation time, and it directly decides the smallest size you can safely print it.
- Bulk QR code generation: from CSV to print-ready filesA practical workflow for batch QR generation: how to structure the CSV, name the exported files so prepress can find them, and decide between static and dynamic rows.