QR Codes · UTM tracking

UTM Parameters for QR Codes: Track Scans in Google Analytics

Quick answer

Put UTM parameters in the destination URL the QR code opens, for example utm_source=flyer&utm_medium=qr&utm_campaign=spring_sale&utm_content=front_window. Google Analytics then labels the visits that follow a scan. GA4's default channel groups have no QR or print channel, so these sessions show as Unassigned in the channel report; filter by session source / medium instead, or add a custom channel group. To count the scans themselves, including people GA4 never sees, make the code from a tracked short link that forwards to the tagged URL.

A QR code is a printed URL, and the visit it starts arrives with no referrer. Without UTM tags, Google Analytics files a scan as direct traffic, mixed in with bookmarks and typed visits. Tagging the destination gives every printed piece its own row. This guide covers where the tags go, a naming scheme, why GA4 calls them Unassigned and how to read them anyway.

Example
holds
go.yourshop.com/springTracked short link, counts the scan
forwards to
https://yoursite.com/offer?utm_source=flyerThe printed piece&utm_medium=qrThe same on every code&utm_campaign=spring_saleThe offer&utm_content=front_windowThe placement
GA4 · Reports › Acquisition › Traffic acquisition
  • Default channel groupUnassigned212 sessions
  • Custom channel group (medium is qr)QR212 sessions

The same sessions either way. Or set the primary dimension to Session source / medium and look for flyer / qr.

The printed code holds a short link that forwards to the tagged URL, and GA4 lists those visits as Unassigned until a custom channel group calls them QR.

Where the UTM tags go

The tags belong on the destination URL, the page people land on. If the code opens https://yoursite.com/offer, the tagged version is https://yoursite.com/offer?utm_source=flyer&utm_medium=qr&utm_campaign=spring_sale&utm_content=front_window. With a static QR code that whole address is baked into the printed pattern: the longer the URL, the denser the code, and any typo is printed for good. With a dynamic QR code the pattern holds only a short link, and the tagged address sits behind it. The code stays simple, and you can fix or change the tags after printing. Build the tagged address with the free UTM builder, then paste it as the tracked link's destination.

A naming scheme for printed codes

Use utm_medium=qr on every code so all scans roll up under one medium. Set utm_source to the printed piece: flyer, poster, postcard, business_card, packaging, table_tent. Put the offer or campaign in utm_campaign, such as spring_sale or open_day_2026. Use utm_content for the placement or batch that tells otherwise identical codes apart: elm_street, front_window, booth_banner. Keep everything lowercase with one separator, because Google Analytics treats Flyer and flyer as two different sources. Some teams flip it, with utm_source=qr and utm_medium=print. That works too, as long as every code follows the same rule.

Why GA4 shows QR scans as Unassigned

GA4 sorts sessions into default channel groups such as Organic Search, Email, Paid Social and Referral, using rules based on source and medium. None of those rules recognises qr or print, so a session tagged utm_medium=qr lands in Unassigned in the default channel report. That is expected, and it doesn't mean the tags are broken. To read your scans, open Reports, then Acquisition, then Traffic acquisition, and change the primary dimension to Session source / medium to find rows such as flyer / qr. Add Session campaign as a secondary dimension to split by offer, or Session manual ad content to see the utm_content placement. If you want QR as its own channel, create a custom channel group in the GA4 admin settings with a channel whose rule matches the medium qr.

What GA4 misses, and what a tracked QR code counts

Google Analytics only records a visit if the landing page loads with its tag running and the visitor allows it. People who close the page before it loads, decline the cookie banner or block analytics never appear, so GA4 usually shows fewer sessions than there were scans. On Track Link, a dynamic QR code counts the scan earlier, at the redirect, before the page loads: the time, approximate country, region and city, the device, operating system and browser, and the UTM tags on the link. Quote the tracked link's number for how many times a code was scanned, and use GA4 for what those visitors did on your site. Neither number is unique people: one person can scan twice, and some phone camera previews and apps load a link without anyone opening it.

One code per placement

UTM tags only separate what you print separately. One code on every flyer, poster and postcard carries the same utm_content wherever it is scanned. Make one tracked link per placement, each with its own utm_content in the destination, and a QR code from each; they can all open the same page. The tracked-link dashboard then shows scans per placement, GA4 shows what each placement's visitors did, and when a page changes after printing you edit the destination instead of reprinting. Tracked QR codes need a free Track Link account, opened with Google or Microsoft sign-in and no credit card. Codes from the no-account QR generator are static: they can carry UTM tags, but the scans themselves aren't counted and the address can't be changed.

QR Codes UTM examples

Copy-paste conventions for common QR Codes campaigns.

Scenario
utm_source
utm_medium
utm_campaign
Door-drop flyer, one batch per street (utm_content=elm_street)
flyer
qr
spring_sale
Shop window poster (utm_content=front_window)
poster
qr
spring_sale
Direct-mail postcard to past customers (utm_content=past_customers)
postcard
qr
autumn_mailing
Trade show booth banner (utm_content=booth)
banner
qr
expo_2026
Product packaging insert (utm_content=box_insert)
packaging
qr
product_launch
Sales team business card (utm_content=sales_team)
business_card
qr
networking

FAQ

Frequently asked questions

How do I add UTM parameters to a QR code?

Add them to the destination URL the code opens, not to the code image: yoursite.com/offer?utm_source=flyer&utm_medium=qr&utm_campaign=spring_sale. With a tracked QR code, paste that tagged URL as the short link's destination and make the code from the short link. The printed pattern stays small and you can change the tags later.

How do I track QR code scans in Google Analytics?

Tag the destination with UTM parameters, then in GA4 open Reports, Acquisition, Traffic acquisition and switch the primary dimension to Session source / medium. Look for your values, such as flyer / qr. GA4 shows the visits that follow a scan, not the scans themselves.

Why do my QR code visits show as Unassigned in GA4?

GA4's default channel groups have no rule for qr or print, so sessions tagged utm_medium=qr fall into Unassigned. The data is fine. Filter by session medium to see it, or create a custom channel group with a QR channel that matches the medium qr.

What utm_medium should I use for a QR code?

qr is the clearest choice, with the printed piece (flyer, poster, packaging) as utm_source. Some teams use utm_source=qr and utm_medium=print instead. Either works if every code follows the same rule; mixing them splits your reports.

Why does Google Analytics show fewer visits than my QR code scans?

GA4 only records a visit when the page loads with its tag running and the visitor allows tracking. People who close the page early, decline cookies or block analytics are missing. A tracked QR code counts at the redirect, before the page loads, so its number is higher. Scans are still not unique people: one person can scan twice, and some camera previews load a link on their own.

Do UTM parameters make a QR code harder to scan?

On a static code they can: a longer URL makes a denser pattern that needs a bigger print size to read reliably. A dynamic QR code holds only the short link, so the UTM tags behind it don't change the pattern at all, and you can edit them after printing.

Track every QR Codes link for free

Build tagged links with the free UTM builder, then track clicks, sources, and conversions in real time. 10 tracked links and 1,500 clicks per month free, no credit card.

Start tracking free