Fundamentals

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.

Static vs dynamic QR codes at a glance
PropertyStaticDynamic
What's encodedFinal content directlyShort redirect URL (e.g. /r/AB3kD9)
Editable after printingNo, neverYes, any time from the dashboard
Scan analyticsNot possibleTotal & unique scans, device, country
Server dependencyNoneRequires the redirect host to stay up
Module density for same contentHigher (full URL length)Lower (short link only)
Works fully offlineYes (WiFi, vCard, text)No, needs the phone's network
Best forPermanent links, WiFi, vCard, no-trackingPrint runs, campaigns, packaging, menus
Cost of a mistakeFull reprint of every unitFix 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.

Author

Paolo Matias TonelloFounder, Qreator

Founder of MT Digital Services LLC and builder of Qreator. Writes about QR codes, print production and privacy-friendly analytics.

Put it into practice