QRAnalytica

What UTM Parameters Should I Use for a QR Code?

Use utm_source for the printed item, utm_medium=qr on every code, utm_campaign for the promotion, and utm_content for the placement. Lowercase, always.

Nookesh Karri · 7 min read
A QR code on a flyer with a tagged URL beside it, showing source, medium, campaign and content labels

Use four UTM parameters on a QR code: utm_source for the printed item (flyer, poster, table tent), utm_medium for the channel (I use qr on every code), utm_campaign for the promotion, and utm_content for the exact placement or version. Write every value in lowercase and keep the same spelling on every code you print. Skip utm_term, because it’s meant for paid search keywords.

The three you always need

Google’s help page on collecting campaign data with custom URLs is blunt about it: you “should always use utm_source, utm_medium, and utm_campaign.” Leave one out and that field shows up as “(not set)” in your reports.

Behind a QR code, they map like this:

ParameterQuestion it answersQR example
utm_sourceWhat physical thing carried the code?flyer, yard_sign, menu, billboard
utm_mediumWhat kind of channel was it?qr
utm_campaignWhich promotion or offer?spring_sale, oak_street_listing
utm_contentWhich placement or version?front_window, table_12, design_b

Google itself lists billboard as an example source value. The source can be a physical object.

Which value to put in utm_medium

Guides split three ways here: print, offline, or qr. What decides it for me is how GA4 groups traffic. GA4 assigns every visit to a channel using fixed rules on source and medium. Email traffic needs a medium of email. Display needs display, banner, cpm and a few others. Referral needs referral, app or link. There is no rule for qr, print or offline. When nothing matches, GA4 files the visit under Unassigned, which Google defines as the value it uses “when there are no other channel rules that match the event data.”

Your QR visits will sit in Unassigned until you tell GA4 what they are. You do that with a custom channel group: in Admin, under Data display, open Channel groups, copy the default group, and add a channel called something like “QR codes” with the rule medium exactly matches qr. A standard property gets 2 custom groups with up to 50 channels each, and Google says custom groups “can be applied to your reports retroactively,” so scans you already collected get relabeled too.

Use qr. Medium is supposed to say how the person arrived, and qr says exactly that. A printed flyer might also show a short URL that people type by hand, and you want those visits separate from scans. Don’t borrow display or referral to dodge Unassigned. Your print campaign gets mixed in with web banners or partner links, and you’ve traded an empty-looking channel for a misleading one.

Get the naming rules right before you print

Google’s page says “Parameter values are case sensitive” and tells you to “use lowercase as a standard practice.” Flyer and flyer become two rows in every report, and you won’t notice until someone asks why the numbers don’t add up.

Ohio University’s analytics team recommends a “shared naming convention for your entire team” and notes that “using lowercase and underscores consistently improves clarity.” Write yours down before the first print order:

  • Lowercase only.
  • Underscores between words, never spaces.
  • A fixed list of source values (flyer, poster, menu, packaging, yard_sign), so nobody invents leaflet next month.
  • One campaign name per promotion, agreed before design starts.

Then build each URL with Google’s Campaign URL Builder instead of typing it. Ohio’s guide recommends it because it cuts typing mistakes.

A worked example

Say a café is running a spring promotion with flyers in two places and table tents inside. Each placement gets its own code:

https://example.com/spring?utm_source=flyer&utm_medium=qr&utm_campaign=spring_sale&utm_content=library_board
https://example.com/spring?utm_source=flyer&utm_medium=qr&utm_campaign=spring_sale&utm_content=gym_board
https://example.com/spring?utm_source=table_tent&utm_medium=qr&utm_campaign=spring_sale&utm_content=inside

Filter by campaign in GA4 to see the whole promotion, by source to compare flyers against table tents, and by content to see whether the library board beat the gym board. The GA4 QR tracking guide covers the full setup, including how to check that visits arrive.

The parameters you can skip

  • utm_term: Google describes it as the paid keyword. A printed code has no keyword.
  • utm_creative_format and utm_marketing_tactic: Google says both “isn’t currently reported in Google Analytics properties,” so they’d sit in your URL doing nothing.
  • utm_id: useful only if you upload campaign cost data to GA4, where Google asks you to “use the same IDs that you use when uploading campaign data.” Most small print campaigns don’t, so leave it out.
  • utm_source_platform: meant for the ad platform that sent the traffic. It doesn’t fit a sticker on a window.

On a static code, every extra character makes the pattern denser and harder to scan from a distance.

Static vs dynamic codes change the stakes

A static code encodes the full tagged URL in the pattern. A typo in utm_campaign is permanent, and a long URL makes a busier code. The dynamic vs static guide explains the difference.

A dynamic code holds a short link, and the tags live on the redirect, so you can change the destination after printing to fix a typo or rename a campaign. In QRAnalytica, UTM injection adds the parameters to the redirect automatically: the printed code stays short and you set the tags once per campaign. See the Google Analytics integration page.

What UTM tags can’t tell you

UTM parameters only count visits where your page loads and your analytics tag runs. Someone who scans and closes the browser before the page finishes, or whose browser never runs the tag, never reaches your GA4 report. UTMs also do nothing for codes that open a vCard, a phone call or a Wi-Fi network, since there’s no web page to read them.

So UTM numbers usually come out lower than a scan counter’s. The guide to tracking QR code scans compares the methods. Run both: the scan counter for “how many,” and UTMs for “what did they do next.”

FAQ

Do I need utm_term for a QR code?

No. Google describes utm_term as the parameter for a paid keyword, and a printed code has no keyword. Leave it out.

Why does my QR traffic show as Unassigned in GA4?

GA4 sorts visits into channels using fixed rules on source and medium. A medium like qr, print or offline matches none of them, so the visit lands in Unassigned. A custom channel group with a rule for your medium fixes the report, and it applies to past data too.

Should I use utm_medium=print or utm_medium=qr?

Either works if you use it on every code. I use qr because it separates scans from printed URLs people type by hand, which can carry their own tags.

Is utm_content worth adding?

Yes, whenever the same campaign has more than one placement or design. It is the only parameter that tells you which flyer, table or window drove the visit.

Can I change UTM parameters after the code is printed?

Only on a dynamic code. A static code has the full URL baked into the pattern, so a typo in a tag stays there for as long as the print does.

Sources

Track your dynamic campaigns. 7-day trial, no credit card.
Generate Dynamic QR