Why Google Analytics cannot see your QR scans
How to track QR code scans in Google Analytics
Track QR code scans in Google Analytics by putting UTM parameters on the page the code points at. Every scan that reaches the page arrives as a tagged session you can segment by source and campaign. That works, but GA4 runs on the destination page, so it counts sessions that landed, never scans that happened.
The mechanism is worth setting up and takes a minute. What is worth understanding first is the gap it leaves, because that gap is where most confused campaign reporting comes from.
The scan and the session are different events
A QR scan is a camera resolving a symbol and handing a URL to a browser. A GA4 session is a page executing a tag. Between those two things sits a redirect, a DNS lookup, a TLS handshake and a page load, and every one of them can fail or be abandoned.
So a person who scans a poster on a moving bus, loses signal, and gives up has scanned. Google Analytics will never know they existed. The redirect will, because the request reached it.
The number that is too high, for the opposite reason
Then the correction runs the other way. Paste a short link into Slack, WhatsApp or iMessage and the app fetches it to build a preview card. That fetch is a real request to the redirect, made by no one.
Unfurl traffic can inflate a raw redirect count several times over on a link shared in group chats, which is why a count that does not classify it is not a count of people. Klip separates them by user agent and records them as bot rather than quietly dropping or quietly counting them, the totals are published as scans, taps and bots so the arithmetic is visible rather than trusted.
Google Analytics mostly avoids this problem, because a preview fetcher does not execute JavaScript. That is the one place GA4 is the more honest of the two numbers.
Why GA4 cannot separate a scan from a tap
Print a code and put the same short link in an email, and both audiences arrive at the same tagged URL. To GA4 they are indistinguishable, same source, same medium, same page. If half your audience is holding a phone in front of a poster and half is at a desk, that difference is invisible at exactly the moment it matters for deciding what to print next.
It has to be marked before the redirect. Klip encodes a marker in the payload the QR code carries, so a camera scan and a tap on the identical link arrive as different events and the totals reconcile: clicks are scans plus taps, and that holds by construction rather than by estimate.
Use both, and know which question each answers
- Google Analytics answers what happened after the landing. Did they read the menu, did they book, did they bounce. Nothing measures that better.
- The redirect answers what happened before it. How many scanned, on which platform, in which hour, in which region, and how much of it was a preview bot.
Tag the destination so GA4 can do its job. Our UTM builder writes the parameters and lower-cases them, which matters more than it sounds: analytics platforms treatFacebook and facebook as two sources, and one campaign silently becomes two rows that each look half as effective.
One thing not to do: do not encode the fully tagged URL into the QR symbol itself. Long payloads make denser codes that need to be printed larger for the same scanning distance, the size calculator shows the difference. Encode a short link and let the redirect carry the tags.
Questions
The things people ask before they commit something to paper.
How do I track QR code scans in Google Analytics?
Put UTM parameters on the destination the code points at, and every scan that reaches the page arrives as a tagged session you can segment. That is the whole mechanism, and it works. What it cannot do is count the scan itself, GA4 runs on the page, so a scan that never loads the page was never there.
Why is my QR scan count higher than my Google Analytics sessions?
Because they measure different events. The redirect counts every request that reaches it, including link previews generated when somebody pastes the URL into a chat app. GA4 counts sessions on the page, and drops anyone who left before the tag loaded. Both numbers can be correct and still differ substantially.
Can Google Analytics tell a scan from a click?
Not on its own. A camera scan and a tap on the same link arrive at the destination as the same tagged pageview. The distinction has to be made before the redirect, Klip adds a marker to the payload the code encodes, so a scan is identifiable at the moment it happens rather than inferred afterwards.
Should I use UTM parameters or a link shortener for QR tracking?
Both, for different jobs. UTM tags tell Google Analytics where a session came from once it lands. A dynamic short link is what lets you count the scan, change the destination after printing, and separate bot prefetch from people. Neither replaces the other.
Do UTM parameters make my QR code bigger?
Yes, if you encode the tagged URL directly, more characters means a denser symbol, which needs to be printed larger to stay scannable. Encoding a short link instead keeps the payload small and puts the tags on the redirect. Our size calculator shows how much difference the payload length makes.