# How to track QR code scans without a paid tool

> Point the code at a URL on your own domain carrying UTM parameters, and read the results in your own analytics. That gives you scan counts, timing and placement attribution with no third party in the path and no subscription that can lapse.

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

---

## The pattern

```
Printed code → https://example.com/p/poster-a → 302 → your landing page
```

The redirect runs on your server, so you see every request. You control the code's
destination, and there is nothing to pay for and nothing to expire.

## Option 1: UTM parameters only

Simplest. Encode the destination directly with UTM tags:

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

Your analytics attribute the visit. No redirect needed.

The cost is payload length — a full UTM set adds 60–100 characters, which typically pushes
the code up two or three versions and shrinks every module.

**Conventions that make the data useful:**

- `utm_source` = the physical placement (`poster`, `packaging`, `receipt`)
- `utm_medium` = `qr`, always, so you can segment all QR traffic at once
- `utm_campaign` = the campaign
- `utm_content` = the individual asset, so you can compare the code by the till against the
  one in the window

## Option 2: a short redirect you own

Better for print. Encode a short path and expand it server-side:

```
Code:     https://exmpl.co/p/a1
Server:   302 → https://example.com/sale?utm_source=poster&utm_medium=qr&...
```

The code stays low-version and coarse. You get a server log entry per scan with timestamp,
coarse geography from the IP, and user agent. And you can change the destination later, which
is the thing dynamic-QR products actually sell.

Fifteen lines of server configuration, and no third party.

## What you can and cannot learn

**Can:** total scans, scans over time, which placement performed better, device type, coarse
region, what people did after landing.

**Cannot, reliably:** unique people (no cookie before the first load), exact location, whether
the same person scanned twice, or scans that did not result in a page load.

Note that no QR analytics product can do better on the first three — the code itself carries
no identity. Vendor dashboards showing "unique scans" are inferring from IP and user agent
like anyone else.

## Why not just use a dynamic-QR provider

You can, and for short-lived campaigns it is convenient. The trade is that your printed
material now depends on their uptime, their domain and your subscription. For packaging or
signage with a multi-year life, that is a bad trade — see
[static vs dynamic](/docs/basics/static-vs-dynamic-qr-codes).

## Privacy

Your own server logs are your own responsibility: state the retention period in your privacy
notice, and do not build profiles from them. The advantage of this approach is that no third
party learns anything about the people scanning your codes.

## FAQ

### Can I track QR code scans for free?
Yes. Point the code at a URL on your own domain with UTM parameters and read the results in your own analytics. No third-party product is required.

### Do I need a dynamic QR code to see scan counts?
No. A static code pointing at your own redirect gives you the same counts in your own server logs, without a subscription or a third party in the path.

### What UTM convention should I use for QR codes?
Set utm_medium to qr always, utm_source to the physical placement, and utm_content to the individual asset so you can compare placements directly.

### Can QR analytics tell me who scanned?
No product can. The code carries no identity. Dashboards showing "unique scans" are inferring from IP address and user agent, which you can do yourself.

## Try it

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