Every QR code generator offers the same fork: static or dynamic? The words sound like a speed setting. They are not. They describe what is printed inside the squares — either the final data itself, or a short address that a server forwards on your behalf — and that single difference decides whether the code can be edited after it is printed, whether anyone can count the scans, how big the printed square has to be, and who has to stay in business for it to keep working.
This guide takes the choice apart layer by layer: what each type encodes, what only a static code can do, what only a dynamic code can do, how the two compare when the code is actually printed, and what the dependency behind a dynamic code costs over the years a print run lasts. The module counts come from the same encoder the CalculatorAI QR Code Generator runs, so they are the sizes you would actually get.
Short version: choose by the cost of being wrong. If reprinting is cheap and nobody needs to count scans, static is the independent choice. If the code goes on anything expensive to reprint — packaging, signage, business cards, a menu — dynamic buys you the right to change your mind, and on a plan that does not expire it costs nothing to keep that right.
What is encodedThe one difference everything follows from
A QR code is a picture of a string of characters. The scanner reads the string; the phone decides what to do with it. The type of code is decided entirely by which string you put in.
The squares hold the final data
The URL, the Wi-Fi password, the contact card or the plain text is encoded directly. The phone acts on it with no third party involved — and nothing about it can ever change without printing a new code.
The squares hold a forwarding address
A short URL such as calculatorai.app/qr/k3x9pd is encoded. A server looks up where that address currently points, records the scan, and sends the visitor on. The printed code never changes; the record behind it can.
That is the whole distinction. "Dynamic" is not a property of the image, and there is no way to tell the two apart by looking at them. A static code can be made by any generator, printed once, and forgotten. A dynamic code is a static code whose content happens to be a redirect that someone maintains — which is why the practical questions are all about that someone.
The trade-offWhat each type can and cannot do
Change the destination after printing
- Static
- No — reprint
- Dynamic
- Yes, any time
Count scans, see country, device, time
- Static
- No
- Dynamic
- Yes
Works with no internet on the phone
- Static
- Yes for Wi-Fi, contact, text, SMS
- Dynamic
- No — the redirect needs a connection
Encode Wi-Fi, vCard, calendar event, location
- Static
- Yes
- Dynamic
- Link or hosted business card only
Password-protect the destination
- Static
- No
- Dynamic
- Yes
Pause, deactivate or retarget a campaign
- Static
- No
- Dynamic
- Yes
Add UTM parameters without changing the print
- Static
- No — they must be in the code
- Dynamic
- Applied at redirect time
Depends on a provider staying up
- Static
- No
- Dynamic
- Yes — the short domain and the account
Printed size for a long destination
- Static
- Grows with the URL
- Dynamic
- Small and constant
| Question | Static | Dynamic |
|---|---|---|
| Change the destination after printing | No — reprint | Yes, any time |
| Count scans, see country, device, time | No | Yes |
| Works with no internet on the phone | Yes for Wi-Fi, contact, text, SMS | No — the redirect needs a connection |
| Encode Wi-Fi, vCard, calendar event, location | Yes | Link or hosted business card only |
| Password-protect the destination | No | Yes |
| Pause, deactivate or retarget a campaign | No | Yes |
| Add UTM parameters without changing the print | No — they must be in the code | Applied at redirect time |
| Depends on a provider staying up | No | Yes — the short domain and the account |
| Printed size for a long destination | Grows with the URL | Small and constant |
Source: CalculatorAI · calculatorai.app · CalculatorAI QR Code Generator and QR Codes Tracker documentation, September 2026
Three of those rows surprise people, and they pull in different directions.
Only static can work offline. A Wi-Fi code, a contact card, a calendar event or a block of text is acted on by the phone itself. Encode any of them statically and the code works in a basement, on a plane, and in twenty years. Encode them as a dynamic link and the phone must first fetch the redirect — so the code for the guest Wi-Fi should never be dynamic, and a dynamic "business card" is really a small web page that a scan opens.
Only dynamic can be repaired. A misprinted URL, a menu that moved, a campaign page that was retired, a contact who left the company — with a static code, each of these means a reprint. With a dynamic code, the fix is a field in a form, and the thousand stickers already on the shelves start pointing at the new place within seconds. Our guide to QR codes that "expire" is largely a catalogue of static codes that could not be repaired.
Only dynamic creates a dependency. The redirect is a promise by the provider to keep forwarding that address. When the promise is a free trial, the promise ends with the trial — the failure mode that gets described as "my QR code expired." That is a question to settle before printing, and we come back to it below.
The printA dynamic code is usually smaller
Here is the part almost nobody checks: the length of the encoded string sets the size of the code. More characters need a higher QR version, which means more modules (the small squares) per side. At a given printed size, more modules means smaller modules, and smaller modules are harder for a camera to resolve.
A dynamic code encodes a short redirect — about 30 characters — regardless of how long the real destination is. A static code has to carry the whole destination, tracking parameters included.
Dynamic redirect (calculatorai.app/qr/…)
- Characters
- 34
- QR version · modules
- v3 · 29×29
- Min print width
- 14.8 mm
Static: plain homepage URL
- Characters
- 24
- QR version · modules
- v2 · 25×25
- Min print width
- 13.2 mm
Static: product page URL
- Characters
- 54
- QR version · modules
- v4 · 33×33
- Min print width
- 16.4 mm
Static: Google Form link
- Characters
- 97
- QR version · modules
- v6 · 41×41
- Min print width
- 19.6 mm
Static: product URL + UTM parameters
- Characters
- 111
- QR version · modules
- v7 · 45×45
- Min print width
- 21.2 mm
Static: Wi-Fi credentials
- Characters
- 60
- QR version · modules
- v4 · 33×33
- Min print width
- 16.4 mm
Static: vCard, 6 fields
- Characters
- 140
- QR version · modules
- v8 · 49×49
- Min print width
- 22.8 mm
| What is encoded | Characters | QR version · modules | Min print width |
|---|---|---|---|
| Dynamic redirect (calculatorai.app/qr/…) | 34 | v3 · 29×29 | 14.8 mm |
| Static: plain homepage URL | 24 | v2 · 25×25 | 13.2 mm |
| Static: product page URL | 54 | v4 · 33×33 | 16.4 mm |
| Static: Google Form link | 97 | v6 · 41×41 | 19.6 mm |
| Static: product URL + UTM parameters | 111 | v7 · 45×45 | 21.2 mm |
| Static: Wi-Fi credentials | 60 | v4 · 33×33 | 16.4 mm |
| Static: vCard, 6 fields | 140 | v8 · 49×49 | 22.8 mm |
Source: CalculatorAI · calculatorai.app · qrcode encoder (the one in the CalculatorAI generator); drafts/static-vs-dynamic-qr-codes-numbers.mjs
The counter-intuitive line is the tracked link. Put ?utm_source=packaging&utm_medium=qr&utm_campaign=spring26 into a static code and it jumps from version 4 to version 7 — 45 modules a side instead of 33, and a minimum print width of 21 mm instead of 16. The dynamic version of the same campaign stays at version 3, because the UTM parameters are added by the redirect at scan time, not printed into the squares. A short static homepage URL is the only static payload that beats it.
The same product code, on a 25 mm business-card square
A 25 mm square is a common size for a card or a small label. Divide 25 mm by the module count (data plus the quiet zone) and you get the size of each square the camera has to resolve. Everything below about 0.4 mm gets unreliable on a phone at arm's length.
Raise error correction from M to H — the right call for a logo in the middle or a code that will get scuffed — and every payload grows another one to three versions. The dynamic redirect moves from v3 to v4; the static UTM link moves from v7 to v10, 57 modules a side, and no longer fits a 25 mm square at 0.4 mm. Denso Wave's own guidance, from the company that invented the format, is that larger modules are "more stable and easier to read" and that the module size should be chosen per application. Short payloads are how you buy that stability without buying more space.
The dependencyWhat "dynamic" costs over the life of a print run
A dynamic code is only as durable as the redirect behind it. Three things have to stay true: the short domain has to resolve, the record for that slug has to exist, and the account that owns it has to be allowed to keep forwarding. Every "expired QR code" story is one of those three failing — usually the third, when a provider's free trial ends and the redirect starts pointing at a payment page instead of the menu. Our Canva QR guide works through that exact case for one popular tool.
So price the dependency over the years the print will be in circulation, not over the month you make it.
monthly fee × 12 × years the print stays in circulation1 year $60 · 3 years $180 · 5 years $3001 year $180 · 3 years $540 · 5 years $900if the lifetime fee exceeds the cost of reprinting once, static plus a reprint is the cheaper insuranceTwo things follow. First, a dynamic code on a plan that expires is worse than a static one, because it adds a failure mode without removing any. Second, the price of the dependency varies enormously between providers — from a recurring fee per code to nothing.
On CalculatorAI, a static code is free with no account, every content type, downloadable as PNG or SVG. A dynamic code is free for one code per account — the redirect keeps working on the free plan, with scan counts — and Pro ($14.99 a month or $119 a year, covering every tool on the site) removes the limit and adds folders, tags, campaign parameters applied at redirect time, and a branded short domain. There is no "free trial redirect" that turns into a paywall: the free code stays a working code. That is the property to look for in any provider — not the price, but whether the redirect survives the plan.
PrivacyA redirect is also a log
A static scan is between the phone and the destination. A dynamic scan passes through a server, and that server can record it — that is the analytics. Before you put a dynamic code on anything sensitive, know what the provider keeps. CalculatorAI's tracker stores the scan time, a coarse country and city, the device, browser and operating system, and a salted hash of the IP address, never the address itself — enough to count unique scans, not enough to identify a person. If a provider's dashboard shows you exact IP addresses or precise locations, it is keeping more than it needs.
The decisionTen uses, ten answers
Guest Wi-Fi card
- Choose
- Static
- Because
- Must work with no signal; the password is the payload
Contact card on a business card
- Choose
- Dynamic
- Because
- Titles, numbers and employers change; cards outlive all of them
Restaurant menu
- Choose
- Dynamic
- Because
- Prices and dishes change monthly; table tents do not
Product packaging
- Choose
- Dynamic
- Because
- Reprinting a run is the most expensive fix there is
Conference badge or slide deck
- Choose
- Static
- Because
- One day, one link, no reprint risk
Real-estate sign
- Choose
- Dynamic
- Because
- The listing sells; the sign gets reused for the next one
Google Form or survey link
- Choose
- Dynamic
- Because
- Form links are long and forms get replaced; the code should not
Serial number or asset tag
- Choose
- Static
- Because
- Data, not a link; must be readable by any scanner forever
Poster campaign in three cities
- Choose
- Dynamic
- Because
- One code per city tells you which posters worked
Calendar invite, event details
- Choose
- Static
- Because
- The phone adds it to the calendar with no server involved
| Use | Choose | Because |
|---|---|---|
| Guest Wi-Fi card | Static | Must work with no signal; the password is the payload |
| Contact card on a business card | Dynamic | Titles, numbers and employers change; cards outlive all of them |
| Restaurant menu | Dynamic | Prices and dishes change monthly; table tents do not |
| Product packaging | Dynamic | Reprinting a run is the most expensive fix there is |
| Conference badge or slide deck | Static | One day, one link, no reprint risk |
| Real-estate sign | Dynamic | The listing sells; the sign gets reused for the next one |
| Google Form or survey link | Dynamic | Form links are long and forms get replaced; the code should not |
| Serial number or asset tag | Static | Data, not a link; must be readable by any scanner forever |
| Poster campaign in three cities | Dynamic | One code per city tells you which posters worked |
| Calendar invite, event details | Static | The phone adds it to the calendar with no server involved |
Source: CalculatorAI · calculatorai.app · CalculatorAI editorial framework
Notice that the "dynamic" rows are not the important uses — they are the expensive-to-reprint ones and the worth-measuring ones. A code on a slide that will be shown once has nothing to gain from a redirect; a code on ten thousand boxes has everything to gain.
The one-way doorYou cannot convert a code after it is printed
Because the type is decided by the string inside the squares, a printed static code can never become dynamic, and a printed dynamic code can never stop depending on its redirect. The decision is made at the moment of printing, and the only way to change it is a new print.
Decide the type before the print order, not after
Ask two questions: will the destination plausibly change while this print is in use, and does anyone need the scan counts? Two 'no' answers mean static; either 'yes' means dynamic.
If dynamic, confirm the redirect survives the plan
Read what happens to the short link when the trial or the subscription ends. A redirect that stops with the plan is a static code with an extra way to break.
If static, shorten the destination
A clean URL on your own domain keeps the code small. Tracking parameters belong in a dynamic code, where they are applied at scan time.
Test the printed size, not the screen
Print at final size on the final material and scan it with a phone at the real distance. A 0.4 mm module is a floor, not a target.
Keep the source
Save the exact payload and settings. If you ever need to reprint a static code, encoding the same string produces the same code.
Key takeaways
Frequently asked questions
What is the difference between a static and a dynamic QR code? A static code encodes the final data — the URL, the Wi-Fi password, the contact card — directly in the squares, so it works on its own and can never be changed. A dynamic code encodes a short redirect URL; a server forwards each scan to the current destination and can record the scan, so the destination can be edited after printing at the cost of depending on that server.
Can I change a static QR code after printing? No. The destination is printed into the pattern itself. Changing it means generating and printing a new code. If the destination might change, use a dynamic code before you print.
Is a dynamic QR code bigger or smaller than a static one? Usually smaller. It encodes a short redirect of about 30 characters regardless of the real destination, which lands at QR version 3 with error correction M. A static URL with tracking parameters can need version 7 or more, which means more and smaller modules at the same printed size.
Do dynamic QR codes stop working? They stop when the redirect behind them stops — a deleted record, a lapsed provider, or a plan that only forwards during a trial. The printed pattern itself does not expire. Choose a provider whose redirect keeps working on its free tier or after a subscription ends.
Can a Wi-Fi or contact QR code be dynamic? A Wi-Fi code should be static: the phone reads the network name and password from the code and needs no connection to do so. A contact card can be either — static as a vCard the phone saves directly, or dynamic as a hosted card that a scan opens and that you can update later.
Which one should I use for a business card? Dynamic, unless the card is for a one-off event. Job titles, phone numbers and employers change faster than cards get reprinted, and a dynamic card lets you update the details every card already in circulation points to.
Sources and methodology
- Module counts, QR versions and minimum print widths were produced with the
qrcodeJavaScript encoder — the same library the CalculatorAI QR Code Generator uses — at error correction levels M and H, with a 4-module quiet zone per side as the QR specification requires; the script is kept as an editorial artifact (drafts/static-vs-dynamic-qr-codes-numbers.mjs). - The 0.4 mm minimum module and the "scan from no further than 10× the width" rule are widely used field guidelines for phone cameras, not requirements of the standard. Denso Wave's guidance on module size (qrcode.com, "Point for setting the module size") states that larger modules are more stable and easier to read and that the size should be set per application; its error-correction page describes level M (15%) as the most frequently selected and Q/H for dirty environments.
- QR Code is defined by ISO/IEC 18004; symbol versions 1–40 and their capacities are published by Denso Wave at qrcode.com ("Information capacity and versions of QR Code").
- CalculatorAI plan facts (static codes free without an account; one dynamic code on the free plan; Pro at $14.99 a month or $119 a year with unlimited codes, folders, tags, campaign parameters and branded domains; scan records keep a salted IP hash and coarse location) are from the product's own handbook and pricing as of September 2026.
- The lifetime-cost figures are arithmetic on hypothetical monthly fees ($5 and $15) chosen to bracket common paid dynamic-QR plans; no specific provider's price is asserted.






