Google Analytics QR code tracking isn't a feature built into a QR generator — it's a URL trick that works with any of them. Add UTM parameters to the link a code points to, and Google Analytics attributes every visit arriving through that link to a source and medium you define, the same way it tracks a link in an email or an ad. A MakeQR code, static or dynamic, works for this because it encodes the URL exactly as typed, UTM parameters included, with nothing stripped or rewritten along the way.
Setting up UTM tracking on a QR code link
Build the destination URL with UTM parameters
Add utm_source, utm_medium and utm_campaign to the end of the page's URL — for example utm_source=qr, utm_medium=print, utm_campaign=storefront-poster — using Google's Campaign URL Builder or typing them in directly.
Paste the full URL into the generator
Use the complete link, parameters included, as the code's content. Nothing about a QR code affects how the parameters travel; the phone opens exactly the URL that's encoded.
Choose static or dynamic based on whether the campaign will change
A one-off flyer with a fixed campaign name is fine as a free static code. A poster reused across campaigns benefits from a dynamic code, since the underlying link and its UTM parameters can be updated without reprinting.
Confirm the parameters survive a real scan
Scan the printed or on-screen code with your own phone and check the address bar shows the full URL with parameters intact before relying on it for a live campaign.
Check Google Analytics after the first scans come in
Traffic tagged with utm_source=qr appears in Analytics' acquisition reports after the platform's normal processing delay, grouped by whatever source and medium values were set.
What Google Analytics actually sees
Analytics has no idea a QR code was involved — it only sees a visit arriving at a URL with certain parameters attached. That's why the parameters have to be set deliberately: without them, a scan looks identical to someone typing the same address directly, and the two get grouped together in reports.
Two counts, tracking two different things
MakeQR's own dynamic codes show a separate count of how many times the code itself was scanned. Google Analytics tracks the opposite: everything that happens once someone lands on the page, tied to the UTM tag rather than to the code. Running both together gives a fuller picture than either alone — a scan count that doesn't line up with the matching Analytics figure usually means some scans didn't finish loading the page, worth investigating on its own.
Keeping campaign names usable as they grow
Consistency in the UTM values matters more than the exact words chosen. Using one fixed utm_medium value across every printed code, rather than mixing 'qr', 'QR-code' and 'scan' between campaigns, is what keeps the source data usable once a handful of codes becomes dozens.
What's actually stored in the code
The full destination URL, parameters and all, exactly as built — nothing UTM-specific happens inside the QR pattern itself. A scanner reading the raw code sees the same link as anyone reading the URL directly.
https://example.com/menu?utm_source=qr&utm_medium=print&utm_campaign=storefront-posterPrinting a tracked code without changing the rules
UTM parameters add length to the encoded URL but don't otherwise change how the code should be sized or placed — print it at roughly one-tenth the intended scanning distance, at least 20mm on a card.
Print it at least 20 mm (2.0 cm) wide
Where UTM-tracked codes go wrong
Reusing one UTM tag across every code
A single generic tag on every printed code collapses all campaigns into one line in Analytics, which defeats the purpose. Give each placement — storefront, flyer, vehicle wrap — its own campaign value.
Forgetting the code after the campaign plan changes
A static code with an outdated UTM tag still works and still gets scanned, but every visit is now misattributed. A dynamic code lets the underlying link update without a reprint; a static one needs a new code entirely.
Not testing the parameter string for typos
A single misspelled parameter name means Analytics won't recognize it at all, and the traffic falls into an unassigned or direct bucket instead of the intended campaign.
Static or dynamic for a UTM-tagged code
Static works for a fixed campaign that won't be revised. Dynamic is worth using one of the free tier's two codes for if the same physical sign or card gets reused for a different campaign later — updating the UTM tag behind a dynamic code is a link edit, not a reprint.
How dynamic QR codes workSituations where UTM tracking on a QR code helps
- A retailer comparing scan volume from a window sticker against an in-store table tent.
- A direct-mail postcard measured against the same offer run as a QR code in a print ad.
- A trade show badge insert tracked separately from the booth's own standee code.
- A vehicle wrap code tagged distinctly from a matching flyer to see which drives more site visits.