QR code UTM tracking: a simple naming system you can actually trust
QR codes are offline, but your measurement does not have to be.
If you put a QR code on a poster, menu, product label, or event badge, you should be able to answer:
- how many people scanned it
- which placement performed best
- whether people converted after the scan
UTM parameters are still the easiest way to get clean attribution into analytics tools.
The problem is that most teams add UTMs in a way that creates:
- broken links
- unreadable URLs
- inconsistent naming
- duplicates across campaigns
This guide gives you a simple system that scales.
Related reading:
TL;DR
- Use UTMs on the final destination URL, but do not encode long URLs into a static QR code.
- For printed QR codes, use a dynamic QR that points to a short redirect URL.
- Adopt one naming convention and enforce it.
- Keep your UTMs boring. Boring UTMs are reliable UTMs.
What are UTMs?
UTM parameters are query parameters appended to a URL.
Example:
https://example.com/signup?utm_source=poster&utm_medium=qr&utm_campaign=spring_sale&utm_content=main_entrance
When someone visits that URL, many analytics tools can capture those fields as attribution metadata.
The core UTMs:
utm_source(where it came from)utm_medium(the channel type)utm_campaign(the campaign name)
Optional but useful:
utm_content(variant: placement, creative, version)utm_term(typically paid search, but you can repurpose carefully)
The QR specific problem: long URLs create dense codes
A static QR code stores the full URL inside the code.
If you add UTMs directly to a long URL and encode it into a static QR, the code becomes dense, which can reduce scan speed and reliability.
That is why printed campaigns should usually use a dynamic QR code.
A dynamic QR code encodes a short redirect URL. You can then:
- keep the QR pattern simple
- change the destination later
- update UTMs without reprinting
Related: Dynamic vs static QR code.
A naming convention that works
Here is a convention that is simple enough to follow and strict enough to compare results.
utm_medium
Use:
qr
Do not invent ten versions of “QR.” Pick one and stick to it.
utm_source
Use the physical source or placement type, not a vague channel name.
Examples:
postermenuproduct_labelreceiptevent_badgetable_tent
utm_campaign
Use a stable campaign name that maps to your planning.
Examples:
2026_q1_launchspring_promostore_opening_amsterdam
utm_content
Use utm_content for the variant you want to compare.
Examples:
front_windowcashiertable_12booth_a3
If you do this well, you can answer: which placement converts best.
Examples you can copy
Poster to signup
Final destination:
https://yourdomain.com/signup?utm_source=poster&utm_medium=qr&utm_campaign=2026_q1_launch&utm_content=main_entrance
Menu to reviews
https://yourdomain.com/review?utm_source=menu&utm_medium=qr&utm_campaign=always_on&utm_content=back_page
Product label to instruction page
https://yourdomain.com/setup?utm_source=product_label&utm_medium=qr&utm_campaign=packaging&utm_content=v2
Common mistakes (and how to avoid them)
1) Mixing naming styles
If half your team uses Spring Sale and the other half uses spring-sale, your analytics will split the data.
Fix: decide on one style.
Recommendation:
- lowercase
- underscores
- no spaces
2) Putting the campaign name in utm_source
This makes reporting confusing.
Fix: utm_source should answer “what object did they scan,” not “what quarter is it.”
3) Encoding UTMs into a static QR for print
This often results in a denser QR pattern.
Fix: use a dynamic QR and keep the encoded URL short.
4) Redirect chains that slow down the scan
If your QR goes:
QR -> shortener -> tracker -> router -> landing page
you increase latency and increase failure rate in weak connectivity.
Fix: minimize hops.
Related: QR code redirects: best practices.
5) Using UTMs as a replacement for first-party analytics
UTMs are useful, but they are not an event pipeline.
Fix: track scans and conversions as events, then use UTMs as attribution metadata.
A simple QR measurement workflow
- Pick your UTM convention
- Create one destination URL per placement
- Use a dynamic QR per placement
- Verify the destination loads fast on mobile
- Test on real phones in real lighting
- Review scans and conversions weekly
CTA: track QR scans without breaking the scan
If you want QR analytics that stays clean even when you iterate, use QRShuffle.
You can:
- generate dynamic QR codes
- edit destinations and UTMs later
- keep the QR pattern simple for faster scans
- track performance per placement
Create your first QR code: https://qrshuffle.com