# URL QR codes — how they work

> A URL QR code stores a web address as plain text inside the code. Scanning it opens that address in the phone's browser. Nothing is redirected through a third party, the link never expires, and the only thing that can break it is the URL itself going dead.

Source: https://useqr.app/url-qr-code · Last reviewed 2026-08-21 · UseQR is free forever, MIT licensed, no signup.

---

## What is actually stored

Nothing clever. The bytes inside the code are the URL, character for character:

```
https://example.com/spring-sale
```

Scanners recognise a leading scheme (`https:`, `http:`, `mailto:`, `tel:`) and hand
the string to the operating system, which opens the default browser. There is no
registry, no lookup, and no server in the middle. This is why a static URL QR code
cannot expire: it is a printed copy of your link, not a pointer to one.

If you type a bare domain, UseQR prepends `https://` before encoding. That matters —
a code containing `example.com` with no scheme is treated as plain text by many
scanners and shows the user a string instead of opening a page.

## Length drives density, and density drives minimum size

Every extra character adds modules. Roughly, at error-correction level M:

| URL length | QR version | Modules | Minimum print width at 30 cm |
|---|---|---|---|
| 25 chars | 2 | 25 × 25 | ~2.0 cm |
| 50 chars | 3 | 29 × 29 | ~2.3 cm |
| 100 chars | 5 | 37 × 37 | ~3.0 cm |
| 200 chars | 8 | 49 × 49 | ~3.9 cm |
| 400 chars | 12 | 65 × 65 | ~5.2 cm |

A 400-character tracking URL produces a code with more than six times the module
count of a short one, and every module has to survive your printer, your substrate
and the scanning camera. Long UTM strings are the single most common cause of a code
that "worked on screen but not in print".

Two fixes, in order of preference: shorten the path on your own domain
(`example.com/sale` rather than `example.com/campaigns/2026/spring/landing?...`),
or put the UTM parameters on a short link you control. Avoid third-party shorteners
for print — if that service disappears, so does your code.

## Uppercase is not a trick, it is a real saving

QR codes have an alphanumeric encoding mode that covers digits, uppercase A–Z, space
and a handful of symbols at 5.5 bits per character, versus 8 bits in byte mode. A URL
written entirely in uppercase can therefore encode about 45% more characters in the
same version.

`HTTPS://EXAMPLE.COM/SALE` works because schemes and hostnames are case-insensitive.
Paths are **not**: `/Sale` and `/SALE` are different resources on most servers. Only
uppercase the scheme and host unless you know your server is case-insensitive on paths.

## What breaks a URL QR code

- **The destination dies.** The code is fine; the page isn't. Point print codes at a
  path you control and can redirect later, not at a campaign URL you will delete.
- **A third-party shortener shuts down.** Every printed code that used it dies at once.
- **The URL is too long for the printed size.** See the table above.
- **Someone re-typed the URL by hand into a design tool.** Always generate from a copied
  link, then scan the proof before it goes to press.

## FAQ

### Does a URL QR code expire?
No. A static URL QR code contains the address itself, so it works for as long as that address works. Nothing depends on UseQR continuing to exist.

### Can I change where it points after printing?
Not with a static code — the URL is physically in the pattern. If you need to change the destination later, point the code at a URL on your own domain and change the redirect server-side. That gives you editability without depending on anyone else's platform.

### Should I use a link shortener before generating?
Only one you control. A shorter URL genuinely produces a less dense, more scannable code, but a third-party shortener adds a permanent dependency and a redirect that some corporate networks block.

### Do I need https?
Yes. Modern browsers warn on plain http, and some scanners refuse to open it silently. UseQR prepends https:// when you leave the scheme off.

## Try it

- https://useqr.app/url
- https://useqr.app/validate
- https://useqr.app/size-calculator
