# How to use Google Analytics with QR codes

> Tag each code's URL with UTM parameters, then read scans in GA4 under Acquisition by filtering the session source and medium dimensions. Use the Realtime report to field-test a placement in seconds. GA cannot see scans that never loaded the page, and blockers make it undercount against server logs.

Source: https://useqr.app/docs/how-to/how-to-use-google-analytics-with-qr-codes · Last reviewed 2026-08-21 · UseQR is free forever, MIT licensed, no signup.

---

## The chain: scan → UTM → session attribution

Google Analytics never sees a scan. It sees a **page load carrying parameters**, and
attributes the session from them. So QR tracking in GA4 is three links:

1. The code encodes a URL tagged with [UTM parameters](/docs/how-to/how-to-add-utm-parameters-to-a-qr-code) —
   `utm_medium=qr`, `utm_source` per placement, built with the
   [URL generator's](/url) UTM fields.
2. The phone loads the page; the GA4 tag fires and records the session with that
   source and medium.
3. You segment QR traffic in reports by those dimensions.

Anything that breaks a link in the chain (a stripped parameter, a consent-blocked tag)
silently drops the scan from GA — worth remembering when the numbers look low.

## Where the data appears in GA4

- **Reports → Acquisition → Traffic acquisition**, then filter or search on the
  *session source/medium* dimensions — with the convention above, `medium = qr` shows
  every scan-originated session across all campaigns, and source splits them by
  placement.
- **utm_campaign** appears in the session campaign dimension for cross-referencing
  with your other channels.
- For conversion questions ("did scanners book?"), mark the relevant event as a key
  event and slice it by the same dimensions.

GA4's UI labels drift between versions, but the session source/medium/campaign
dimensions are the stable ground truth — anything you build (Explorations, dashboards)
should sit on those.

## The Realtime field test

The most practically useful GA4 feature for QR work: **Reports → Realtime**. Stand in
front of the freshly hung poster, scan it, and watch the session appear within seconds,
with its source and medium attached. That single test proves the whole chain — code,
URL, tags, GA property — in under a minute, before anyone else scans. Do it once per
placement on install day.

## The landing-page-per-placement pattern

UTMs are the standard, but a parallel belt-and-braces approach is giving each placement
its **own path**: `/qr/window`, `/qr/counter`, `/qr/bag-insert`, each redirecting (with
UTMs) to the real destination. GA4's landing page dimension then separates placements
even if parameters get lost, your server logs independently count every hit, and the
codes stay short — the architecture is Option 2 in
[tracking scans without a paid tool](/docs/how-to/how-to-track-qr-code-scans).

## What GA cannot tell you — honestly

- **Scans that never became page loads.** Someone scans, sees the URL preview, doesn't
  tap: no signal exists anywhere. GA measures visits, not scans; treat every GA number
  as a floor.
- **Blocked and unconsented sessions.** Ad blockers and declined consent banners stop
  the GA tag entirely, so GA undercounts relative to your server logs — if the gap
  matters, count at the redirect (server-side) and use GA for behaviour.
- **Who scanned, or repeat scanners.** The code carries no identity; nothing downstream
  can conjure it.
- **A "good" scan rate.** GA gives you numbers; for calibration on what to expect, see
  [what scan rate is realistic](/docs/marketing/what-scan-rate-should-you-expect) and
  the [scan rate](/glossary/scan-rate) definition.

Before printing, decode the artwork with the [validator](/validate) and check the UTM
string character by character — a typo in `utm_medium` splits your data permanently.

## FAQ

### How do I see QR code scans in Google Analytics?
Encode URLs tagged with UTM parameters, then open GA4's Traffic acquisition report and filter session medium for your QR value. Each tagged placement appears under its own source.

### Why does Google Analytics show fewer scans than expected?
GA only counts loads where its tag ran. Scans abandoned at the URL preview, visitors with ad blockers, and declined consent banners all vanish. Your server logs at a redirect count strictly more.

### Can GA4 tell me which QR placement performs best?
Yes, if each placement gets distinct tags — utm_source or utm_content per asset — or its own landing path. Identically tagged codes are indistinguishable forever, so differentiate before printing.

### Do I need Google Tag Manager for QR tracking?
No. UTM attribution works with a plain GA4 tag. Tag Manager helps only if you want extra events on the destination page, which is independent of how the visitor arrived.

## Try it

- https://useqr.app/url
- https://useqr.app/validate
