Every QR code scan is a data point - a person choosing to act on your print material, product packaging, or event signage. Whether that data reaches you or disappears into the physical world depends on one decision made before generating the code: how you plan to set up QR code tracking.
This guide covers the two tracking methods available for QR codes, how to set up UTM parameter tracking in Google Analytics for free with static codes, how to read the results in GA4, and when dynamic QR code tracking is worth paying for.
Two Tracking Methods - Which One Do You Need?
QR code tracking works through one of two mechanisms, and choosing the right one before generating the code saves significant effort later.
UTM parameter tracking - you add tracking parameters to the destination URL before generating the QR code. When a user scans and the destination page loads, Google Analytics receives the UTM data and attributes the session to the correct campaign, source, and placement. No subscription required. Works with any free static QR code. Limitation: tracking only fires when the destination page loads - it cannot capture a scan that does not complete to a full page load.
Dynamic QR code tracking - the code links to a short URL on the dynamic platform's servers. Every scan hits that server first, which logs the scan event (device type, time, approximate location), then redirects to your destination. The platform provides a scan dashboard regardless of whether the destination page loaded. Requires a subscription ($10-30/month). You can change the destination URL without reprinting the code.
For most marketing campaigns, UTM tracking in GA4 is sufficient. Dynamic tracking adds value when you need raw scan counts before page load, device or location breakdowns, or a redirect URL that you can update for existing printed materials.
Method 1 - UTM Parameter Tracking (Free, Works Today)
UTM parameters are tags appended to the end of a destination URL. When the URL loads in a browser, Google Analytics reads the tags and attributes the session to the correct campaign and placement.
| Parameter | What it identifies | QR code example value |
|---|---|---|
| utm_source | Where the scan came from | poster, magazine, direct-mail |
| utm_medium | The channel type | qr-code |
| utm_campaign | The campaign name | summer-sale-2026 |
| utm_content | The specific placement | bus-shelter-main-st, postcard-a |
| utm_term | Optional keyword (rarely used for QR) | - |
To build a UTM-tagged URL: use Google's Campaign URL Builder (ga-dev-tools.google/campaign-url-builder) to construct the URL without typing errors. Paste the completed URL into the free QR code generator URL tab and generate the code.
Three-placement example - one campaign, three separate QR codes:
| Placement | utm_source | utm_content |
|---|---|---|
| Bus shelter poster | poster | bus-shelter-main-st |
| Magazine insert | magazine | tech-mag-june |
| Direct mail postcard | direct-mail | postcard-a |
All three codes link to the identical destination page. The UTM parameters differentiate them in Google Analytics so you can compare performance per placement.
Reading QR Code Results in Google Analytics 4
After deploying UTM-tagged QR codes, find campaign results in GA4 through this path:
Reports → Acquisition → Traffic acquisition → set primary dimension to Session source / medium → filter for your utm_medium value (e.g., “qr-code”)
What the report shows:
- Sessions - how many times the destination page loaded after a scan
- Engaged sessions - sessions lasting more than 10 seconds or triggering a key event, indicating meaningful visits rather than immediate exits
- Conversions - if a GA4 conversion event is configured (form submission, purchase, add to cart), how many QR code sessions resulted in that conversion
- Per-placement breakdown - add utm_content as a secondary dimension to compare bus shelter vs magazine vs postcard performance directly in the same report
Technical limitation: UTM tracking fires when the destination page loads in the browser. A scan that does not complete to a full page load - because the user closed the tab, or scanned in a low-signal area - is not recorded in GA4. In practice, this loss is typically 1-5% for fast-loading destination pages in connected locations, which is acceptable for most campaign reporting.
Per-Placement Tracking - One Code Per Location
The most actionable use of QR code analytics is per-placement attribution: knowing exactly which physical touchpoint drove each session and each conversion. Generate a separate QR code for each placement, each with its own UTM-tagged URL using a unique utm_content value.
| Placement | utm_source | utm_content | Sessions | Conversions |
|---|---|---|---|---|
| Poster - Main St | poster | main-st-shelter | 241 | 18 |
| Poster - Park Ave | poster | park-ave-shelter | 87 | 4 |
| Direct mail - Version A | direct-mail | postcard-a | 632 | 71 |
| Direct mail - Version B | direct-mail | postcard-b | 588 | 62 |
| In-store receipt | in-store | digital-receipt | 44 | 2 |
This table - built entirely from free UTM tracking in GA4 - shows which poster location outperforms the other, which postcard version converted better, and that receipt QR codes generate minimal traffic compared to direct mail. No paid subscription required to reach those conclusions.
See the marketing campaign QR code guide for the full UTM setup process applied to specific campaign types including print, retail, and event campaigns.
Method 2 - Dynamic QR Code Tracking
Dynamic QR code platforms - Bitly, Uniqode, QR TIGER, and others - track scans at the moment the code is scanned, before the destination page loads, because every scan routes through their server first.
What dynamic tracking provides that UTM cannot:
- Raw scan count - total scans regardless of whether the destination page loaded (offline environment, browser closed before load, slow connection)
- Device type - iOS vs Android breakdown, useful for confirming the destination is optimized for your audience's majority device
- Scan time - time-of-day and day-of-week patterns, useful for understanding when your audience most often engages with a specific physical placement
- Approximate location - country, region, or city level based on IP address at scan time
- Scan-to-visit ratio - comparing the dynamic platform's raw scan count to the GA4 session count reveals what percentage of scans are failing to complete to a page load
The scan-to-visit ratio is the metric that makes dynamic tracking analytically compelling. If your dynamic dashboard shows 500 scans but GA4 records 270 sessions from the same code, approximately 46% of scans are not completing to a page load. That gap typically reveals a slow-loading destination page, a login wall, or a poor-signal physical location - each fixable once the data surfaces the problem.
See the static vs dynamic QR code guide for a full cost-benefit comparison and guidance on when the subscription is justified.
UTM vs Dynamic - Which Do You Actually Need?
| Capability | UTM tracking (free) | Dynamic ($10-30/month) |
|---|---|---|
| Campaign attribution in Google Analytics | ✓ | ✓ |
| Per-placement session and conversion data | ✓ | ✓ |
| Raw scan count before page load | ✗ | ✓ |
| Device type breakdown (iOS vs Android) | ✗ | ✓ |
| Scan time and day-of-week patterns | ✗ | ✓ |
| Approximate scan location | ✗ | ✓ |
| Scan-to-visit ratio | ✗ | ✓ |
| Update destination URL after printing | ✗ | ✓ |
| Cost | Free | $10-30/month |
If your primary question is which print placements are driving web traffic and conversions, UTM tracking in GA4 answers it completely for free. If your primary question is how many people physically scanned the code, what device they use, when and where they scanned, or what percentage of scans are failing to reach your page - dynamic tracking is the only option that provides those answers.
Start with the free approach: go to the free QR code generator, build your UTM-tagged URL using Google's Campaign URL Builder, paste it into the URL tab, generate a separate code for each placement, and download as SVG. Your first campaign scan data arrives in GA4 within hours of deployment - at no cost.