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.
The same sessions either way. Or set the primary dimension to Session source / medium and look for flyer / qr.
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.
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.
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.
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.
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.
Copy-paste conventions for common QR Codes campaigns.
FAQ
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.
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.
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.
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.
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.
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.
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 freeCreate branded tracking links with UTMs in seconds.
Track any URL and see who clicks, when, and from where.
Compare the top free tools for tracking link clicks.
Measure clicks, devices, and locations on every link.
Start tracking links for free, no credit card required.
Watch clicks land live as they happen on your links.