# How to track QR codes on print, packaging and signs

> A QR code sends no referrer, so scans show up as direct traffic. How to track scans, visits and sales per placement, and print codes that keep working.

Source: https://datacenter.so/guides/qr-code-tracking
By the Datacenter team. Updated October 23, 2026.

A QR code is just a link printed as a picture. When a phone camera scans it, the phone opens the address inside. Nothing else comes along: no referrer, no app name, no hint that the visit started on a flyer. Without help, every scan lands in your analytics as [direct traffic](https://datacenter.so/guides/direct-traffic-explained).

Tracking a QR code means putting the source into the link itself, and ideally counting the scan before the page loads.

## Static and dynamic codes

- **A static code** holds your full address. It works forever, but what it points to can never change, and nothing counts scans unless your website does.
- **A dynamic code** holds a short link. The short link counts the scan, then forwards to the real page. You can change where it points after printing.

For anything printed in volume, use a dynamic code on a domain you own. A code printed on 10,000 boxes is a long-term promise. If it points to a free QR service's domain and that service changes its terms or shuts down, every box points nowhere.

## Step 1: one link per placement

The value of QR tracking is comparison: the shop window against the flyer, the table card against the receipt. That only works if each placement has its own link.

Use [UTM parameters](https://datacenter.so/guides/utm-parameters) with a fixed scheme:

```text
https://yourshop.com/menu?utm_source=qr&utm_medium=qr&utm_campaign=autumn-menu&utm_content=table-card
```

- `utm_source` and `utm_medium` say it was a scan.
- `utm_campaign` names the push.
- `utm_content` names the placement: `table-card`, `window`, `flyer-oct`, `package-insert`.

GA4 has no default channel for `qr`, so these visits land in "Unassigned" unless you add a custom channel group ([Google](https://support.google.com/analytics/answer/9756891)). Some teams use `utm_medium=print` or `offline` instead. Pick one and use it everywhere.

## Step 2: put a short link in the code

A long tagged address makes a dense code with many small squares, which is harder to scan from a distance or on a curved surface. A short link makes a simpler code and gives you a scan count of its own.

Two numbers then tell you a lot:

- **Scans**, counted by the short link.
- **Visits** with the QR tags, counted by your analytics.

A big gap between them means the page is slow to load on mobile data, or the visitors leave before it does.

## Step 3: count what the scan led to

Decide what a scan is for: an order, a menu view, a signup, a review, a warranty registration. Set it up as a goal, then read results by `utm_content` to compare placements by outcome, not just by scans.

For a physical store, the outcome is often offline: a person scans, then buys at the till. A discount code shown only on the QR landing page is a simple, honest way to connect the two. Count how many times the code is used at the till.

## Printing codes that scan

- **Leave a quiet zone.** The QR standard asks for a blank margin four modules (squares) wide around the code. Do not crop it or place text against it.
- **Keep contrast high.** Dark code on a light background. Inverted and low-contrast codes fail on many phones.
- **Size for distance.** A code read from across a room needs to be much larger than one on a business card. Test it at the real distance, on more than one phone.
- **Pick an error correction level.** QR codes can still scan with part of the code damaged or covered: about 7, 15, 25 or 30 percent at levels L, M, Q and H ([Denso Wave](https://www.qrcode.com/en/about/error_correction.html)). Use a higher level for packaging that gets scuffed or a logo placed in the middle.
- **Download a vector file** (SVG or PDF) for print. A small PNG blown up for a poster blurs the edges.
- **Test the printed proof**, not just the screen version, before the full run.

## Common questions

### Can you track how many times a QR code was scanned?

Yes, if the code points to a short link or a redirect that counts requests. A static code pointing straight to your page is only counted as a visit, and only when your analytics tag loads.

### Why do QR code visits show as direct?

A camera app opens the link with no referrer. Add UTM tags to the link inside the code, so the visit carries its source.

### Do dynamic QR codes expire?

The code itself never expires. The short link it points to stops working if the service behind it ends or your plan lapses. Use a short domain you own, so you can move it if you change tools.

### Can I change where a printed QR code points?

Only with a dynamic code. Change the short link's destination, and every printed code follows.

## Sources

- Google Analytics Help: [Default channel group](https://support.google.com/analytics/answer/9756891). Checked October 2026.
- Denso Wave, inventor of the QR code: [Error correction feature](https://www.qrcode.com/en/about/error_correction.html). Checked October 2026.

## Where Datacenter fits

Every Datacenter short link has a QR code you can download as SVG, with a QR preset that tags the visit, so each flyer, table card or package can be its own row. More: https://datacenter.so/docs/qr-codes
