Link length is the variable that matters most
A URL QR code encodes exactly one thing: the address, as a plain string. There is no wrapper format, no field separators, nothing clever. Which means the only real decision you make is how long that string is, and that decision determines whether your code is a chunky grid readable from across a room or a fine mesh that needs a steady hand and good light.
QR codes come in 40 fixed sizes called versions. Version 1 is a 21 × 21 grid; each subsequent version adds four modules per side up to version 40 at 177 × 177. The encoder picks the smallest version your data fits into, so every character you cut is a potential step down in density.
| URL | Length | Version at level M | Practical read distance at 3 cm printed |
|---|---|---|---|
qrfast.io |
9 | 1 | ~40 cm |
https://example.com/blog |
24 | 2 | ~35 cm |
https://example.com/products/winter-collection |
46 | 3 | ~30 cm |
| Same URL + 60 characters of UTM parameters | 106 | 6 | ~20 cm |
The rough guide is a 10:1 ratio — a code needs to be about one tenth as wide as the distance it will be scanned from, and denser codes sit at the pessimistic end of that range.
Dropping the scheme, and why you probably should not
You can encode example.com instead of https://example.com and save eight characters. Most modern scanners will prepend https:// and open it correctly.
Most is doing a lot of work in that sentence. Some scanners treat a scheme-less string as plain text and show it rather than opening it; a few default to http://, which then triggers a redirect and, on a badly configured server, a browser security warning. The eight characters are not worth the tail risk on printed material you cannot recall.
Where you should absolutely economise is the rest of the URL. example.com/w beats example.com/winter-collection-2026-landing-page by 30 characters and one or two versions of density.
Uppercase does nothing for URLs (but does for some payloads)
There is a widely repeated tip that uppercasing your URL shrinks the code. The mechanism is real but does not apply here.
QR encoding has an alphanumeric mode that packs two characters into 11 bits, roughly 45% more efficient than the 8-bits-per-character byte mode. But it only covers digits, uppercase A–Z, space, and the symbols $ % * + - . / :. Crucially, it excludes lowercase letters, ?, =, &, _ and #.
A URL path is case-sensitive on most servers, so you cannot uppercase it without breaking the link. And any URL with a query string contains ? and =, which forces byte mode regardless. In practice: ignore this advice for URLs. It is genuinely useful for other payload types — Bitcoin addresses in particular — but not this one.
Short links: what you gain and what you take on
Routing your QR code through a shortener buys three things:
- A much simpler code. A 20-character short link versus a 120-character tracked URL is often four or five versions of difference.
- Scan analytics. How many, when, roughly where. Useful for judging whether the poster was worth printing.
- Editability. The printed code is permanent, but the destination is not. Reprint nothing when the campaign changes.
It also creates a dependency that deserves a clear eye. The shortener is now a single point of failure for every piece of physical material you have produced. Free URL shorteners have shut down before and taken millions of links with them. Some corporate networks and email filters block shortener domains outright. And the user cannot see where they are going before they tap, which raises the phishing-adjacent feel of the whole interaction.
If the material has a life of weeks — an event, a promotion, a conference handout — a shortener is usually the right call. If it is going on packaging, signage, or anything with a multi-year lifespan, use a short path on your own domain and control the redirect yourself. yourbrand.com/w gives you the density benefit, the editability, and the trust of a recognisable domain, with no third party in the chain.
Tracking scans without wrecking the code
UTM parameters are the standard way to attribute traffic, and they are verbose. ?utm_source=poster&utm_medium=qr&utm_campaign=winter-2026 is 55 characters that do nothing for the user and push your code two or three versions denser.
Better options, in rough order of preference:
- A dedicated short path that 301-redirects server-side to the full tracked URL. The code stays tiny; your analytics still sees the UTM parameters after the redirect.
- A single short parameter —
?s=p1— that your server or tag manager expands. Five characters instead of fifty-five. - A distinct landing page per placement, which gives you attribution from the page path alone with no parameters at all.
If you must put UTMs directly in the code, drop utm_content and utm_term first; source, medium and campaign carry nearly all the value.
Testing that actually predicts real-world failure
Scanning your own code on your own phone under your desk lamp tells you very little. The failure modes appear elsewhere:
- Print a proof at final size on the real substrate. Ink spread on uncoated stock thickens modules and closes the gaps between them.
- Test at the real distance. A code on a shop window is read from the pavement, not from 20 cm.
- Test in the real light. Restaurant tables, night-time bus shelters and fluorescent warehouse lighting all behave differently from an office.
- Check the quiet zone survived layout. The spec requires four modules of clear margin. Designers crop it constantly, and it is one of the most common causes of a code that "works on screen but not in print."
- Verify the destination on mobile. A code that scans perfectly and lands on a desktop-only page has still failed.
Contrast rules that are not negotiable
- Dark modules on a light background. Inverted codes — light on dark — are read by some scanners and rejected by others, and there is no way to know which your audience has.
- Aim for a strong luminance difference, not just a colour difference. Mid-blue on mid-red looks high-contrast to the eye and near-identical to a camera reading it in greyscale.
- Never place the code over a photograph or a gradient. If the background must be busy, put the code on a solid light panel.
- Avoid pure black on pure white only if you have a design reason to; it is otherwise the most reliable combination there is.
Frequently asked questions
Does a QR code expire?
The code itself never expires — it is a static encoding of a string and will decode identically in fifty years. What expires is the destination. If the URL stops resolving, the code is dead. This is why the domain you point at matters more than the code you print.
Can I change where a printed code points?
Only if you encoded a URL you control the routing for. A code pointing at yourdomain.com/promo can be redirected anywhere at any time by changing the server rule. A code pointing directly at the final destination cannot be changed once printed.
Should I include https:// in the URL?
Yes. Omitting it saves eight characters but leaves the behaviour up to the scanner, and a minority will treat the string as plain text or fall back to http. Not worth the risk on anything printed.
How small can I print a link QR code?
2 cm square works for a short URL scanned at arm's length. Below that you are relying on modern phone cameras and good lighting. For signage read from several metres, apply the 10:1 rule: 2 metres of distance needs roughly a 20 cm code.
Why does my code scan on screen but not in print?
Three usual suspects: the quiet zone was cropped during layout, the code was scaled down past the point where modules survive ink spread, or it was placed on a low-contrast or textured background. Print a proof at final size on the real stock before committing to a run.
Are QR codes safe to scan?
The code itself cannot execute anything — it is data, not a program. The risk is the destination, which the user cannot see before scanning. This is why phishing via QR codes ("quishing") works, and why codes on your own materials should point at a domain your audience recognises.
Do I need a licence to use QR codes commercially?
No. The QR code specification was published by Denso Wave, which holds patents but has explicitly waived enforcement for the standard format. It is also an ISO standard (ISO/IEC 18004). You can use QR codes commercially without permission or payment.