Guide

UTM Tracking With QR Codes: A Step-by-Step Guide

How to measure QR campaign performance in Google Analytics without any special tools

You don't need a specialized platform to know whether a QR code campaign is working. If your destination is a website you already track with Google Analytics or a similar tool, UTM parameters let you tag exactly where traffic came from before you even generate the code. Because a UTM-tagged link is still just a plain URL, it works perfectly inside a standard static QR code, no dynamic code or subscription required. This guide walks through building UTM links correctly, encoding them into a QR code, and reading the resulting data without common mistakes that quietly break tracking.

What UTM parameters actually do

UTM parameters are short pieces of text appended to the end of a URL that your analytics platform reads to categorize where a visit came from. They don't change what the page shows visitors; they're purely metadata, invisible unless someone looks closely at the address bar. A URL like example.com/menu?utm_source=poster&utm_medium=qr&utm_campaign=summer_menu still loads the exact same menu page, but your analytics dashboard will now log that visit under the 'poster' source and 'qr' medium.

The five standard parameters are source, medium, campaign, term, and content. Source identifies where the traffic originated, such as a specific poster or storefront. Medium describes the channel type, which for QR codes is almost always simply 'qr'. Campaign names the broader initiative the code belongs to, while term and content are optional and mostly used for more granular testing, like distinguishing two versions of the same flyer.

Because this tagging happens entirely in the URL itself, it works with any static QR code generator. The QR code doesn't need to know or care that UTM parameters are present; it just encodes whatever text string you give it, and the parameters do their job the moment someone lands on the page.

Planning your naming convention before you start

The biggest source of broken UTM tracking isn't a technical error, it's inconsistent naming across multiple codes and campaigns. If one poster uses utm_source=front_door and a nearly identical one from the following month uses utm_source=frontdoor, your analytics tool treats them as two separate sources, fragmenting data that should be combined for comparison.

Before generating any QR codes, write down a simple naming convention in a shared document: lowercase only, underscores instead of spaces, and a consistent structure such as location_or_channel for source, always 'qr' for medium, and a short campaign name tied to the specific initiative. Keep this list updated every time a new code goes out so nobody invents a new variant by accident.

It also helps to decide in advance how granular you want source values to be. Tracking every single flyer individually gives more detail but creates more values to manage, while grouping by broader category, like 'in_store' versus 'direct_mail', is easier to maintain but loses some resolution. Choose based on how much detail you'll actually act on.

Building the tagged URL

Start with the destination URL exactly as it should appear to a visitor, then append a question mark followed by each parameter in the format key=value, joined with ampersands. A complete example looks like: https://example.com/spring-sale?utm_source=storefront&utm_medium=qr&utm_campaign=spring_sale_2026. Order doesn't matter to analytics platforms, but keeping source, medium, and campaign in that order across all your links makes them easier to scan visually when double-checking.

If your destination URL already contains a question mark, for example because it points to a page with an existing query string, use an ampersand instead of a second question mark to attach the UTM parameters, since a URL can only have one question mark. Getting this wrong is a common mistake that either breaks the link entirely or causes the original query parameter to be ignored.

Avoid spaces and special characters in parameter values; use underscores or hyphens instead, since spaces can break the link when scanned by certain camera apps. Once the full URL is built, paste it into a browser first to confirm the page loads correctly and the parameters appear intact in the address bar before generating any QR code from it.

Generating the QR code from the tagged link

Once your UTM-tagged URL is confirmed working, treat it exactly like any other website QR code: paste the full tagged link, including all parameters, into a QR code generator's URL field, and generate the code as normal. Because the tagging lives entirely in the text of the URL, there's nothing special about the QR code itself; it's simply encoding a longer string than an untagged link.

It's worth generating and scanning a test copy of the code with your own phone before distributing it widely. This confirms both that the code scans cleanly and that the destination page loads with parameters intact, catching typos in the URL before they end up printed on hundreds of flyers or a large-format banner where a fix means reprinting.

Since UTM-tagged URLs are noticeably longer than a plain link, consider the code's physical size and print quality more carefully, since longer URLs create denser QR codes that need more resolution to scan reliably at a distance. If sharpness is a concern for small print runs, a slightly larger printed code size gives the scanning camera more room to resolve the extra detail.

Reading the data in your analytics tool

In most web analytics platforms, UTM-tagged traffic appears under a dedicated acquisition or traffic-source report, filterable by source, medium, and campaign. Filtering specifically for medium equal to 'qr' isolates every visit that came through any of your QR codes, giving you a combined view before drilling into individual sources for comparison between placements.

Look beyond raw visit counts to see what those visitors actually did: bounce rate, pages viewed, and any conversion events you have configured, such as form submissions or purchases. A source with fewer visits but a meaningfully higher conversion rate may represent a better-performing placement than one that simply drives more raw traffic without engagement.

Give any new campaign enough time to accumulate a reasonable sample before judging performance, and compare like with like: a code placed for a two-week promotion should be measured against its own two-week window, not against a code that's been up for six months. Consistent measurement windows make campaign-to-campaign comparisons far more reliable.

Common mistakes that quietly break tracking

The most frequent error is a typo in the parameter keys themselves, such as writing 'utm_soruce' instead of 'utm_source'. Analytics platforms only recognize the exact standard parameter names, so a misspelled key is silently ignored rather than flagged as an error, meaning the visit still happens but gets attributed as if no tagging existed at all.

Another common issue is reusing the exact same tagged URL, and therefore the same QR code image, across genuinely different physical placements. If the same code appears at two separate store locations, all their traffic gets merged under one source value, making it impossible to tell which location is actually performing better without generating a distinct tagged URL, and therefore a distinct code, for each one.

Finally, remember that because static QR codes cannot be edited after printing, any UTM link baked into a printed code is permanent. If a campaign name or destination changes after the code is already distributed, the old code will keep pointing to outdated tagging or a stale page indefinitely, so it's worth finalizing campaign details before the final print run rather than after.

Combining UTM tracking with basic scan awareness

UTM parameters tell you what happened after someone reached your website, but they say nothing about people who scanned the code and then closed their browser before the page finished loading, or scanned it out of curiosity without any real intent. Keep this gap in mind when comparing QR performance to other channels that might be measured differently.

For campaigns where knowing raw scan counts, independent of what happens afterward, matters as much as destination behavior, a dynamic QR code with built-in scan analytics adds that layer on top of UTM tracking, since the two aren't mutually exclusive. The dynamic code's redirect can still point to a UTM-tagged URL, giving you both scan-level and destination-level data from the same campaign.

For most simple, single-destination campaigns, though, UTM tracking on a static code is more than sufficient, and has the advantage of costing nothing beyond the time it takes to build the link correctly. Start there, and only add a dynamic layer if you find yourself specifically needing scan counts that UTM data alone can't provide.

Frequently asked questions

Do UTM parameters work with any QR code generator?

Yes. UTM parameters are just extra text appended to a URL, so any generator that accepts a website link as input will happily encode the full tagged URL, no special QR feature required.

Will UTM parameters make the QR code harder to scan?

Longer URLs produce denser QR codes, which can be marginally harder to scan at small print sizes or from a distance. Printing the code a bit larger, and testing a sample scan before wide distribution, resolves this in almost all cases.

Can I edit the UTM parameters after a static QR code is printed?

No. A static QR code encodes its destination permanently, so any parameters baked in at generation time are fixed once printed. Finalize your naming convention and campaign details before generating the final code for print.

Do I need Google Analytics specifically for this to work?

No, UTM parameters are a general web standard recognized by most analytics platforms, not just Google Analytics. As long as your website's analytics tool supports UTM-based traffic source reporting, tagged QR code links will show up correctly.

Create your free QR code

Related guides