How QR code tracking works
A QR code is only a way to write a URL in a form a phone camera can read. It has no tracking of its own. Whatever URL you put inside is what the phone opens, and nothing reports back to you.
Tracking comes from what that URL is. In UTM Link, the QR code for a short link holds the short link on your own domain, plus a small ?qr=1 marker. When someone scans it:
- The phone opens the short link, for example
go.example.com/spring?qr=1. - UTM Link records the visit and flags it as a QR scan because of the marker.
- The visitor is forwarded to the destination, your full URL with UTM parameters. The
qr=1marker is not passed on to your site.
This happens in a fraction of a second. The person scanning sees your page, not a stop on the way.
The same short link can also go in an email or a post. Those visits come in without the marker, so they count as clicks, and the QR scans stay their own number. One link, two numbers, no need to create a separate link just for print.
Static vs dynamic QR codes
Most QR generators sort codes into two kinds. The difference matters once the code is on paper.
| Static QR code | Dynamic QR code | |
|---|---|---|
| What it holds | The final URL | A short link that redirects |
| Counts scans | No | Yes |
| Change destination after printing | No | Yes |
| Code density | Grows with URL length | Stays small |
| In UTM Link | QR code of a plain UTM link | QR code of a short link on your domain |
A dynamic QR code is not a special file type. It is a normal QR code with a redirect link inside. That is why a UTM Link short link works as one: the code stays the same and the link behind it does the work.
Static codes still have a place. If a URL will never change and you only need the visits in GA4, a QR code of the plain UTM link is fine. Try both in the demo above and look at the code: the long UTM URL makes a much denser pattern.
Change the destination after printing
Print runs are slow to fix. A menu changes, a product sells out, a landing page moves. With a static code, the only fix is a reprint or a sticker.
With a short link, you open the link in UTM Link and edit the destination URL. The printed code does not change, because it holds the short link, and every scan after your edit goes to the new page. Earlier scans stay on the link's page, so you keep one history for one printed piece.
You can also pause the link. Scans stop reaching the destination until you switch it back on, which helps when an offer ends before the posters come down.
For short links on your own domain, see branded short links and how to connect a custom domain.
Add UTM parameters to QR codes so GA4 credits print
Scan counts tell you how many people scanned. Google Analytics tells you what they did next. For that, GA4 has to know the visit came from print, and without UTM parameters it can't. A camera app sends no referrer, so a plain scan usually shows up as Direct traffic.
Build the destination in the UTM builder first, then make the QR code from that link. A typical set for a flyer:
utm_source flyer the printed piece
utm_medium print the type of channel
utm_campaign 2026_04_spring_menu
utm_content back_page optional, the placementOne thing to know before you pick a medium. GA4 sorts traffic into channels using fixed rules on source and medium, and none of its default channels is for print or QR codes. A medium like print, offline or qr matches no rule, so those sessions land in Unassigned. The data is still there. You find it by filtering on source, medium or campaign.
Avoid borrowing a medium that does match, like referral or social. It moves print traffic into the wrong channel and makes both numbers wrong. Two better options:
- Keep
utm_medium=printon every printed code and report on that medium. Simple, and nothing else in your data uses it. - Create a custom channel group in GA4 with a channel such as Offline, matching
medium exactly matches print. Print then gets its own row in channel reports.
Whichever you choose, write it down and use the same values every time. Print, print and flyer used as mediums are three rows in GA4. Our guide to UTM naming conventions covers how to set rules your team can't break.
What QR scan data you see
Each short link has its own page in UTM Link. Scans and clicks are stored the same way, with a source column that says QR scan or Link. For every scan you get:
- The date and time of the scan.
- The country, looked up from the IP address.
- The device type, operating system and browser.
- The IP address, which also powers the unique clicks count.
On top of the log, the link page shows a total clicks number, a separate QR scans number, clicks over time and a map of clicks by country. Total clicks includes scans, so clicks from the link itself are the total minus the scans.
What you don't get matters too. UTM Link does not record the city or exact location of a scan, and it does not know who scanned. There is no name, email or account tied to a scan. For the full list of reports, see link tracking.
Read the two sources side by side. UTM Link counts every scan that reached the link, including people who closed the page right away. GA4 counts sessions on your site and can miss visitors who block analytics. Expect the numbers to differ a little. A big gap usually means a broken page or a tagging problem, which our analytics setup guide helps you check.
How to create a trackable QR code in UTM Link
- Create a link and fill in the destination and UTM parameters. The first link guide walks through the form.
- Choose your custom domain so the link becomes a short link. You can also set your own back-half, such as
/spring. - Save the link, then click the QR code button on the link in your list or on its page.
- Download the PNG and place it in your design.
- Print a test copy and scan it before the full run.
The QR code button is on every link, including plain UTM links without a short link. Those codes hold the full UTM URL. They work and GA4 still sees the UTM values, but UTM Link can't count the scans and you can't change where they go.
Printing tips that save a reprint
- Test before you print. Scan the proof with an iPhone and an Android phone, and check that the page that opens is the right one.
- Leave a quiet zone. The downloaded PNG has no white border of its own. Keep clear white space around the code, about four of its small squares wide, with no text or images touching it.
- Print it big enough. Think about how far away people will stand. A code on a table card can be small. A code on a poster across a room has to be much larger. Test at the real size and distance.
- Keep the contrast. The download is black on white, which scans best. Avoid printing it on a dark or busy background.
- Don't stretch it. Resize the PNG evenly and, for large prints, check that the edges of the squares stay sharp.
- Add a line of text. “Scan for the menu” gets more scans than a code on its own, and a short link printed below gives people a way in if their camera fails.
Plans
Any link you create in UTM Link has a QR code. Counting scans and changing the destination after printing need a short link on your own domain, and custom domains come with the Pro and Business plans. The free plan covers plain UTM links, so QR codes made there work as static codes tracked in GA4 only.