Back to articles

Published · August 23, 2026

QR Code Analytics: How to Track Scans and Measure Campaigns

Static QR codes can't be tracked at all. Dynamic codes and UTM-tagged URLs together give you scan counts, sessions, and campaign attribution — but only if you set both up before the code is printed.

Quick Answer

You can't track a static QR code. Its destination is baked in permanently, so there's nothing to log. Tracking takes two things, set up before you print: a dynamic QR code that logs the scan itself, and a destination URL tagged with UTM parameters so Google Analytics (or any web analytics tool) can attribute the visit. Here's how the two pieces fit together, and how to set them up in five steps.

Why Static QR Codes Can't Be Tracked

A static QR code encodes its destination directly in the pattern of black-and-white modules. No intermediary, nothing to log, no way to bolt on tracking once the code's already printed and out the door.

A dynamic QR code works differently. Instead of the final destination, it encodes a short redirect URL that points to an intermediary service. Scan it, and that service logs the event — scan count, timestamp, rough location from the IP address, device type — before forwarding you to wherever the code currently points. Because the redirect lives on a server you control, you can also change the destination later without reprinting a thing. That's the core difference covered in more depth in our guide to static vs. dynamic QR codes.

That server-side log is layer one. What happens after the visitor lands on your page needs a separate setup entirely.

Set Up UTM Parameters Before You Generate the Code

Out of the box, no analytics platform knows a visit came from a QR code — it just looks like a regular page view. To make it attributable, decorate the destination URL with UTM parameters before you generate the code:

  1. Add the parameters. Append utm_source, utm_medium, and utm_campaign — for example, ?utm_source=store_poster&utm_medium=qr_code&utm_campaign=fall_launch.
  2. Keep utm_medium consistent. Same value (qr_code) across every placement, so they roll up together instead of scattering across one-off labels.
  3. Shorten the tagged URL first. Fewer characters means fewer modules, and a code that scans more reliably from a distance or on rough print.
  4. Test it. Scan the finished code yourself. Confirm source, medium, and campaign show up in Google Analytics' Realtime report before it goes anywhere near a printer.
  5. Check back in a day or two. Standard GA4 reports run 24-48 hours behind Realtime — don't judge a launch by an empty Traffic Acquisition report an hour in.

Same discipline behind what's actually working in QR code marketing: measured campaigns, not guesses.

Common Problems and Fixes

Scan count and GA4 sessions will never match exactly. The QR platform logs a scan the instant a camera reads the code, before any page loads. Google Analytics only starts counting once the destination page's script fires — so anyone who scans and bails before the page loads is a scan with no matching session. That gap tends to widen on slower landing pages.

Traffic lands in "Unassigned." Inconsistent utm_medium values fall outside GA4's default channel definitions. Standardize the value across every QR placement, or define a custom channel group if you need finer control.

Platform-level scan counts aren't the whole picture. Ad tools that report QR scans — Campaign Manager 360 counts scans on in-stream video creative, for one — measure the scan interaction itself, not what happened next. Connecting a scan to a purchase or signup still needs the UTM-tagged URL feeding your analytics tool.

Doing This on QRDock

QRDock's dynamic codes come with scan analytics built in — count, time, device — no separate redirect service to stand up yourself. That's layer one, covered automatically.

For layer two, still add UTM parameters to whatever URL you point the code at. The two data sets aren't redundant; they answer different questions, and campaigns that only check one are missing half the picture. QRDock's codes are also editable after printing — the same dynamic QR code management capability that lets you redirect a campaign without touching the physical code. Generate a trackable dynamic QR code at qrdock.app.

Frequently Asked Questions

Can I track scans on a QR code I already printed?

Only if it's a dynamic code pointing at a UTM-tagged redirect URL already. A static code's destination is baked in permanently — there's no scan-level data to retrieve after the fact, so you'd need to reprint with tracking built in from the start.

Why don't my QR scans match my Google Analytics numbers?

They measure different moments. The QR platform counts a scan the instant a camera reads it; GA4 only counts once the destination page's script fires. Scan and bail before the page loads, and that's a scan with no matching session — expect the numbers to diverge.

What UTM parameters should I use for a QR code?

At minimum: utm_source for the placement, utm_medium set consistently to qr_code across every placement so they roll up together, and utm_campaign for the campaign name. Add utm_content if you're testing multiple designs against the same campaign.

Conclusion

QR code analytics comes in two layers: the scan log a dynamic code keeps on its own, and the session and conversion data your analytics tool builds from a UTM-tagged destination URL. Neither substitutes for the other, and neither can be bolted on after the fact — a static code or an untagged link stays unmeasurable no matter how good the campaign is. Set both up before the code goes to print. Next time someone asks whether it worked, you'll have a real answer.