Articles

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.

Sources checked

Create a trackable QR code