# How to add UTM parameters to a QR code

> Append UTM parameters to the URL before generating: set utm_medium to qr, utm_source to the physical placement, utm_campaign to the campaign and utm_content to the individual asset. Budget for density: a full UTM set adds 60 to 100 characters, which can push the code up three versions.

Source: https://useqr.app/docs/how-to/how-to-add-utm-parameters-to-a-qr-code · Last reviewed 2026-08-21 · UseQR is free forever, no signup.

---

## The pattern

A [UTM parameter](/glossary/utm-parameter) is just a query-string tag your analytics
reads on arrival. Append the set to the destination, then encode:

```
https://example.com/spring?utm_source=poster&utm_medium=qr&utm_campaign=spring26&utm_content=window
```

The [URL generator](/url) has UTM fields built in, so you fill in four boxes rather
than hand-assembling a query string (and hand-assembly is where stray spaces and `?`
vs `&` mistakes come from).

## A convention that keeps the data useful

- **`utm_medium=qr`, always.** One filter then isolates every QR scan across all
  campaigns. This is the parameter that earns its keep.
- **`utm_source`** = the physical placement: `poster`, `packaging`, `receipt`,
  `table-tent`.
- **`utm_campaign`** = the campaign name you use everywhere else.
- **`utm_content`** = the individual asset, so the window poster and the counter card
  become comparable: this is how you learn *which* placement works.

You will also see teams use `utm_source=qr&utm_medium=offline`. It functions; the
grouping is just coarser. What matters is picking one convention and never mixing them,
mixed conventions split your traffic into unmergeable buckets. The reporting side of
this is covered in [Google Analytics with QR codes](/docs/how-to/how-to-use-google-analytics-with-qr-codes).

## The density cost, in numbers

Parameters are payload, and payload is modules. Take a 26-character destination:

| Encoded URL | Length | Version (EC M) | Grid |
|---|---|---|---|
| `https://example.com/spring` | 26 chars | **2** | 25 × 25 |
| Same + full UTM set above | 99 chars | **6** | 41 × 41 |

At a printed width of 3 cm, that is the module shrinking from **1.2 mm to 0.73 mm**,
a 39% loss of module size for identical human-visible behaviour. Why length explodes
density is explained in [why longer URLs make denser codes](/docs/spec/why-longer-urls-make-denser-codes);
whether your printed size still covers the scan distance is a
[size calculator](/size-calculator) question.

For screens, none of this matters: pixels are free. For print, it often does.

## Having both: the short-link pattern

The standard resolution is to keep the tags **out of the code and in the redirect**:

```
Code encodes:   https://example.com/p/win     (29 chars, version 2–3)
Server 302 →    https://example.com/spring?utm_source=poster&utm_medium=qr&...
```

The code stays low-version and print-friendly; analytics still receives the full UTM
set. This is Option 2 of [tracking QR scans without a paid tool](/docs/how-to/how-to-track-qr-code-scans),
and it additionally gives you a destination you can
[change later](/docs/how-to/how-to-change-what-a-qr-code-points-to). If you use a
shortener instead of your own domain, read
[shortening before making a QR code](/docs/how-to/how-to-shorten-a-url-before-making-a-qr-code)
for the dependency you are taking on.

Before printing: decode the final artwork in the [validator](/validate) and read the
query string back character by character: UTM typos (`utm_souce`, duplicated `?`)
silently discard your attribution.

## FAQ

### What UTM parameters should I use for a QR code?
Set utm_medium to qr so all scans segment together, utm_source to the physical placement, utm_campaign to the campaign, and utm_content to the specific asset. Keep one convention across every code you print.

### Do UTM parameters make a QR code harder to scan?
They make it denser. A full set adds 60 to 100 characters, which can raise the version by three or more and shrink every module at a fixed print size. Either print larger or move the tags behind a short redirect.

### Should utm_source be qr or the placement?
Either convention works if applied consistently. Putting qr in utm_medium and the placement in utm_source preserves more information: medium filters all QR traffic, source compares placements.

### Do UTM parameters change what the person scanning sees?
Normally nothing beyond a longer URL in the address bar: the parameters are read by analytics, not the page. They are visible to the user, so keep values professional; anyone can read them.

## Try it

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