qr code tracking google analytics
How I track QR codes with Google Analytics
A practical GA4 workflow for QR code tracking with consistent UTM parameters, one URL per placement, verified redirects, and outcome measurement after the scan.
Updated 2026-07-11
Google Analytics can attribute visits from a QR code when the destination URL carries consistent campaign parameters. I use the QR platform for scan counts and GA4 for what happens after the browser opens.
Those are different measurements. A scan report counts the redirect request. Google Analytics records activity only after the destination page loads and its Analytics tag runs, subject to consent, blocking, connection failures, and the site's measurement setup.
Build one campaign URL per placement
Start with source, medium, and campaign
Google documents utm_source, utm_medium, and utm_campaign as the core custom campaign parameters. I use a physical placement for the source, qr_code for the medium, and a stable campaign name for the promotion.
A counter card might use utm_source=front_counter, utm_medium=qr_code, and utm_campaign=july_reviews. A flyer for the same promotion gets utm_source=july_flyer. Separate source values let me compare placements without inventing a new campaign for each print file.
I add utm_content when two QR codes share the same placement but use different designs or calls to action. Google uses that parameter to distinguish creatives that otherwise belong to the same source, medium, and campaign.
Keep UTM names consistent
Capitalization creates separate values
Google's campaign URL guidance says parameter values are case sensitive. I use lowercase names, underscores, and a short written convention so front_counter and Front-Counter do not appear as separate report rows.
- utm_source identifies the printed placement.
- utm_medium stays qr_code across printed QR campaigns.
- utm_campaign identifies the promotion or ongoing program.
- utm_content separates design or call-to-action variants when needed.
Put the tagged URL behind the QR code
Preserve parameters through redirects
For a static QR code, I can encode the complete tagged destination. For a dynamic QR code, I save the tagged URL as the final destination while the printed symbol contains the service's shorter redirect URL.
I test the redirect in a private browser window and confirm the final address still contains the UTM parameters. A redirect rule that drops the query string also drops the campaign attribution I intended to measure.
Verify the visit in GA4
Check acquisition after the tag runs
Google says custom campaign values appear in the Traffic acquisition report through session source, medium, and campaign dimensions. I run a proof scan, wait for processing, and check that the expected values appear before printing the full batch.
I do not expect GA4 sessions to match scan counts exactly. Staff tests, repeated scans, consent choices, ad blockers, slow page loads, and redirect failures can make the two systems count different things.
Measure the action after the scan
Traffic alone does not show the result
The campaign row tells me that the visit came from the printed placement. I still need the destination site to measure the useful action: a form submission, booking, purchase, download, review-link click, or another defined key event.
I keep a campaign sheet with the short URL, final tagged URL, print placement, print date, quantity, and proof-scan result. When a QR campaign underperforms, that record lets me separate a broken redirect from a weak placement or landing page.
My normal setup uses one tagged destination per placement, a consistent qr_code medium, a short dynamic redirect when I need edits or scan counts, and a GA4 key event for the action that matters after the visit.