UTM parameters are small tags you add to the end of a destination URL so your analytics can tell exactly where a visitor came from. When you print a QR code, the person scanning it lands on your website, but without tags every scan looks the same as any other traffic. By tagging each destination link with its placement — this flyer, that shop window, that product insert — you can see which printed location actually brings people in, and compare them honestly.
This article explains what the five UTM parameters do, how to build tagged links for printed codes, how to keep the links short so the QR pattern stays simple, and how tagging works together with a dynamic QR code that counts scans on its own.
What UTM parameters are
UTM stands for "Urchin Tracking Module", a leftover name from an analytics product that Google acquired long ago. The name does not matter much; what matters is that a UTM link is just a normal URL with a question mark and a few key-value pairs appended. Everything after the question mark is ignored by your website as far as the page content is concerned — the visitor sees exactly the same page — but your analytics tool reads those values and records them with each visit.
A tagged link looks like this:
https://example.com/spring-sale?utm_source=flyer&utm_medium=print&utm_campaign=spring2025 There are five standard parameters. You will usually use three of them; the other two are optional.
utm_source — where the visit came from
The source is the origin of the traffic in the broadest sense. For QR codes on printed material, the source is usually the physical item or channel: flyer, poster, businesscard, catalog, receipt. Some people use the publication name instead, for example a magazine that ran an advert. Pick one interpretation and stick to it across all campaigns, because mixing interpretations makes later comparisons unreliable.
utm_medium — the type of channel
The medium describes the general category of the channel. For anything printed, print is the obvious choice. Other common values elsewhere in marketing are email, social or cpc, but for QR campaigns you will mostly use print. Keeping the medium consistent lets you filter all offline print traffic in one click later.
utm_campaign — the specific campaign
The campaign identifies the push the placement belongs to: spring2025, grand-opening, loyalty-relaunch. This is what lets you group all placements of one campaign together and compare campaigns against each other over time. Use a short, lowercase name with no spaces.
utm_term — paid keywords, rarely used for print
The term parameter exists mainly for paid search, where it records which keyword triggered an ad. For QR codes on printed material it is usually left out. If you ever run a QR campaign with several distinct messages you want to compare, you could repurpose it, but most teams never touch it.
utm_content — telling placements apart
The content parameter is the one that makes one-code-per-placement possible. It distinguishes versions of the same campaign: utm_content=front-page versus utm_content=back-page, or window-left versus window-door. When everything else in the link is identical, the content value is the only difference — and that difference is exactly what you want to measure.
Why printed QR codes need tagging at all
When someone scans a QR code, their phone opens a URL. Your web server sees a visit from a mobile browser, but it cannot know what piece of paper the phone was pointed at. Without tags, all those visits blend into "direct" traffic or whatever default your analytics assigns, and you have no way to answer basic questions: did the flyer work better than the shop window? Is the product insert worth reprinting?
Tagging solves this with no extra technology. The tags travel with the URL, your analytics records them, and every placement becomes a separate line in your reports. You can then compare placements within a campaign, compare campaigns across seasons, and make reprint decisions based on real scan counts rather than guesses.
There is a second benefit: tagged links also tell you what people do after scanning. Because the visit is attributed to a placement, you can see how far each placement's visitors get — whether flyer visitors read the page and leave, while insert visitors go on to buy. Attribution plus behaviour is what turns a QR code from a gimmick into a measurable channel.
Building a tagged link, step by step
Start with the plain destination URL — the page you want scanners to land on. Ideally this is a dedicated landing page rather than your homepage, because a dedicated page makes the visit meaningful and gives you a clean conversion point.
Then append the parameters. The first one is preceded by a question mark; all following ones are joined with ampersands:
https://example.com/offer?utm_source=flyer&utm_medium=print&utm_campaign=spring2025&utm_content=front Rules worth following:
- Use lowercase everywhere. Many analytics tools treat
Flyerandflyeras two different sources. Lowercase-only naming avoids accidental splits. - Use hyphens or underscores instead of spaces. Spaces in URLs get encoded as
%20, which makes links longer and uglier. - Keep values short and meaningful.
spring2025beatsspring_campaign_2025_final_v2. - Be consistent across campaigns. If
flyeris your source name this quarter, it should be next quarter too.
You do not need any special tool to build these links; typing them by hand following the pattern above is perfectly fine. Just test the finished link in a browser before generating the QR code, to confirm the page loads correctly with the parameters attached.
A naming scheme you can reuse
Consistency is the whole game. Here is a simple scheme that works for a typical small business running printed QR codes:
utm_medium=print— always, for all printed material.utm_source— the physical item:flyer,window,insert.utm_campaign— the campaign name and period:spring2025.utm_content— the specific placement within the item:front,back,door,counter,page3.
Applied to three placements of one campaign:
Flyer, front side: https://example.com/offer?utm_source=flyer&utm_medium=print&utm_campaign=spring2025&utm_content=front
Shop window, door sticker: https://example.com/offer?utm_source=window&utm_medium=print&utm_campaign=spring2025&utm_content=door
Product insert, inside the box:
https://example.com/offer?utm_source=insert&utm_medium=print&utm_campaign=spring2025&utm_content=page1
With this scheme, a report filtered on spring2025 shows all three placements side by side. Want to know whether the window sticker outperformed the flyer? The answer is one filter away. Want to compare this spring against last spring? Keep the same source and content names, change only the campaign value, and the year-over-year comparison builds itself.
Write the scheme down once — even a plain text file is enough — and reuse it. The most common UTM failure is not technical; it is three people naming the same thing three different ways.
Keep links short: the QR pattern grows with the URL
A QR code is essentially a picture of the URL it encodes. Longer URLs produce denser QR patterns — more and smaller modules — and dense codes are harder for phones to scan, especially from a distance or on a slightly crumpled flyer. Since every UTM parameter you add lengthens the URL, tagging and scannability pull in opposite directions.
Three habits keep the balance right:
- Shorten the destination path.
example.com/offerinstead ofexample.com/promotions/spring/landing-page-2025. The path is yours to choose; make it short. - Use only the parameters you need. Source, medium, campaign and content are enough for print. Skip
utm_termunless you genuinely use it. - Use a short domain if you have one. If your brand owns a short domain, pointing QR codes there and redirecting onward keeps the encoded string small.
As a rule of thumb, a tagged URL under roughly a hundred characters produces a comfortably scannable code at typical print sizes. If your link is much longer, shorten something before you print.
Also keep the quiet zone — the blank margin around the code — and print the code large enough for its scanning distance. A shop window code read from the pavement needs to be far larger than a code on a product insert read at arm's length. No amount of URL shortening rescues a code printed too small for where it lives.
One code per placement, always
The single most important operational rule: generate a separate QR code for every placement, each pointing at its own tagged URL. Never reuse one code across a flyer and a shop window, even if both go to the same page.
The reason is simple. The QR code is your measurement unit. If one code appears in five places, its scan count is a mixture of five unknown shares, and no analytics trick can separate them afterwards. If each placement has its own code, the counts are clean from day one, and the extra cost is a few minutes of generator work.
This also gives you freedom to fix mistakes without reprinting everything. If one placement underperforms, you can change where its code points (with a dynamic code, covered next) or redesign just that item. And if a code gets damaged or removed, you know exactly which placement died.
Label your codes as you create them — in a spreadsheet, a note, or the generator's own naming — with the same scheme as the UTM values. Six months later, when someone asks "which code was on the receipt?", the answer should take seconds, not archaeology.
Never put personal data in the link
This rule has no exceptions. Do not encode anything that identifies a person into a QR destination URL: no names, email addresses, phone numbers, customer IDs, discount codes tied to an individual, or anything else personal.
Two reasons. First, URLs are visible: they appear in browser history, may be passed along in screenshots, and are visible to anyone holding the printed item. Second, tagged campaign URLs are often shared — a delighted customer might forward the link — and a link containing someone's personal data leaks it to whoever they share it with.
Campaign tags themselves are not personal data; utm_source=flyer describes the medium, not the person. Keep it that way. If you need per-person tracking, do it after the landing page loads, through your normal website mechanisms, not in the printed URL.
How tagging works with dynamic QR codes and scan counts
There are two kinds of QR codes. A static code encodes the destination URL directly; it never changes and costs nothing to keep working. A dynamic code encodes a short redirect URL owned by the QR service; the service counts each scan and can point the code at a new destination later without reprinting.
These two mechanisms answer different questions, and they work best together:
- The dynamic code's scan count tells you how many people scanned, including people who scanned but closed the page before it loaded, or who never triggered a page view in your analytics.
- The UTM tags tell your analytics who scanned, where they came from, and what they did on the site afterwards.
The counts will not match exactly, and that is normal. Phones may fail to load the page after a scan; some browsers and privacy tools limit analytics tracking; the dynamic service counts scans your analytics never sees. Treat the dynamic count as the upper bound of interest and the analytics-attributed visits as the engaged subset. The gap itself is informative — a large gap on one placement may mean the landing page loads too slowly, or that the code sits somewhere people scan without following through.
A practical setup: use a dynamic code whose redirect target is your fully tagged URL. You get scan counting, the ability to correct the destination after printing, and clean placement-level attribution in analytics — all from one code. If you only ever need the destination fixed forever and want the simplest possible artefact, a static code with a tagged URL also works; you simply lose the scan counter and the post-print redirect.
One caution with dynamic codes: they depend on the QR service staying online. If you use them, choose a provider you expect to keep around, and avoid pointing important printed material at codes that could stop resolving.
Conclusion
UTM parameters turn printed QR codes from a one-way door into a measurable channel. Tag every destination link with a consistent source, medium, campaign and content value, generate one code per placement, keep the URL short so the pattern stays scannable, and keep personal data out of the link entirely. Combine the tags with a dynamic code when you also want scan counts and the ability to retarget after printing. The takeaway: a QR campaign is only as useful as your ability to compare its placements — and comparison costs nothing but a few well-named parameters typed once, before you print.