How to track QR codes in Google Analytics (GA4)
By Diljit Ramachandran · Published · 5 min read · AI-assisted guide
To track QR codes in Google Analytics, add UTM parameters to the code's destination URL before you generate the code — GA4 then reports every scan as a labelled session instead of burying it in Direct traffic. That is the whole trick. Google Analytics has no idea a QR code exists; it only sees the visit that follows the scan, and UTM parameters are what tell it where that visit came from.
Here is the exact setup, a worked example, and the one decision that determines whether you can ever fix a mistake after printing.
Step 1: Build the UTM-tagged destination URL
Take the page the code should open and append three parameters: utm_source (where the code lives), utm_medium (the channel) and utm_campaign (the campaign name). A window poster pointing at a menu looks like this:
https://example.com/menu?utm_source=qr&utm_medium=print&utm_campaign=autumn_menu&utm_content=window_poster
Keep utm_source=qr and utm_medium=print consistent across every printed code, and use utm_content to tell placements apart — one value for the window poster, another for the table tent, another for the flyer. The free UTM builder assembles and validates the URL so a typo doesn't split your report into two rows.
Step 2: Generate the QR code for that URL
Generate the code for the full tagged URL, not the bare page address. Make it a dynamic QR code rather than a static one: a dynamic code points at a short redirect you control, so the UTM-tagged destination stays editable after printing. Name the campaign wrong, launch a second landing page, or decide mid-campaign to split placements — you change the destination and the printed code never knows. A static code bakes the tagged URL into the print forever; the only fix is a reprint.
Step 3: Test the scan, then read it in GA4
- Scan the code with your phone and check the page opens with the UTM parameters visible in the address bar.
- Open GA4 → Reports → Realtime and confirm your test visit appears.
- After a day, open Reports → Acquisition → Traffic acquisition and search for
qr / printin the Session source/medium column. Add Session campaign or Session manual ad content as a secondary dimension to split results by campaign or placement.
GA4 processes standard reports with a delay, so judge the campaign from the next day onward, not from the first hour.
Why scan counts and GA4 sessions never match
If you use dynamic codes, you get a second measurement for free: the scan itself is recorded at the redirect, before the landing page loads. The two numbers will not agree, and the gap is informative. Google Analytics loses visitors that the redirect still counts: people who decline the cookie banner, in-app browsers that restrict scripts, and anyone who closes the tab before the tag fires. A 20–40% gap is routine. Read scans as "how often the printed code was used" and GA4 sessions as "what those visitors did next" — the full breakdown is in the guide to tracking QR code scans.
| Question | Google Analytics | QR-level analytics |
|---|---|---|
| How many times was the code scanned? | Undercounts (consent, in-app browsers) | Counted at the redirect, every scan |
| When, and on what device? | Only for consented sessions | Timestamp, device and city per scan |
| What did visitors do on the site? | Full behaviour and conversions | Not visible past the redirect |
| Can the destination change after printing? | — | Yes, with dynamic codes |
Use both: UTMs for GA4's behavioural picture, the scan log in the QR code analytics dashboard for true usage of each placement.
Create a trackable, editable QR code
UTM-tagged destination, per-scan analytics, and a destination you can still change after printing.
Generate a dynamic QR code7-day trial, no credit card · 5 dynamic codes · Paid plans from $9/month.