Printed QR codes can send people to the same offer while still helping you compare campaign placements. Add UTM parameters to the destination URL before generating the QR code, then check your analytics for attributed visits and conversions. This guide shows how to choose consistent values, distinguish print placements, and interpret the results without treating every scan as a session.
Key Takeaways
- UTM parameters label the destination link; they do not create a QR code.
- Choose consistent values for
utm_source,utm_medium, andutm_campaignbefore printing. - Use
utm_contentto compare placements under one campaign, or distinct campaign values when you need separate campaign rows. - Test the printed code and tagged landing page before distribution.
- Analytics can report visits and conversions associated with tagged links, but scans do not always become measurable sessions or conversions.
Plan your QR campaign values
A tracking plan is easier to use when the values answer clear questions:
- Source (
utm_source): Where is the QR placement distributed, such ascity_fairorpartner_name? - Medium (
utm_medium): What kind of channel brought the visitor? Pick a label such asqrorprint_qrand use it consistently. - Campaign (
utm_campaign): Which promotion or initiative is this? For example,spring_open_house. - Content (
utm_content): Which specific creative or placement should you compare, such asfront_desk_poster?
UTM values are labels, not a universal naming standard. Agree on the terms with everyone who will review the reports. Keep them lowercase, use a consistent separator such as underscores, and avoid mixing near-duplicates like QR, qr-code, and qr for the same medium. Analytics tools may treat differently capitalized values as distinct.
Before printing, write down the values in a campaign plan. Do not include names, email addresses, phone numbers, or other personal information in UTM parameters: these values can appear in browser history, analytics reports, and shared links.
Build the tagged destination URL
Suppose a shop is promoting the same spring offer at a community fair. The landing page is https://example.com/spring-offer. A tagged version might be:
https://example.com/spring-offer?utm_source=city_fair&utm_medium=qr&utm_campaign=spring_open_house&utm_content=booth_poster
The parameters identify the source, medium, campaign, and placement. They do not change the offer or the page itself. If the destination already has query parameters, add UTM parameters with & rather than starting a second query string with ?. Put the query string before any URL fragment, such as #details.
You can assemble the URL by hand or use the [UTM Builder](UTM Builder). Check the final URL carefully: confirm the landing page is correct, that each parameter name appears once, and that reserved characters in values are encoded appropriately. Avoid adding spaces or punctuation that could be interpreted inconsistently.
Generate the QR code separately
A UTM-tagged URL is still just a web address. To make a scannable code, copy the complete tagged URL into a QR-code generator and create the image as a separate step. Do not encode the untagged page URL by mistake.
Before sending artwork to print:
- Scan the QR code from the final design, not just from the generator preview.
- Confirm that it opens the intended page on a phone and that the full tagged URL survives any redirects.
- Check that the page works on mobile and that the offer is visible without unnecessary steps.
- Use a short, descriptive test label or a dedicated test campaign so test visits do not get confused with live results.
- Keep a copy of the final QR image and the exact URL encoded in it.
A redirect can change or remove query parameters if it is configured incorrectly. If the code goes through a short link or tracking redirect, test the entire journey from scan to landing page.
Compare different print placements
If the offer stays the same but the QR codes appear in different places, decide how you want the reports grouped.
Keep one campaign and distinguish the placement
For a unified campaign report, keep utm_campaign=spring_open_house and give each code a different utm_content value:
https://example.com/spring-offer?utm_source=city_fair&utm_medium=qr&utm_campaign=spring_open_house&utm_content=booth_poster
https://example.com/spring-offer?utm_source=city_fair&utm_medium=qr&utm_campaign=spring_open_house&utm_content=welcome_desk_card
This keeps the campaign together while allowing a placement comparison where your analytics platform reports content values.
Use distinct campaign values for separate campaign rows
If your reporting process requires each placement to appear as its own campaign, use distinct campaign values while keeping the destination and offer unchanged:
https://example.com/spring-offer?utm_source=city_fair&utm_medium=qr&utm_campaign=spring_open_house_booth
https://example.com/spring-offer?utm_source=city_fair&utm_medium=qr&utm_campaign=spring_open_house_welcome_desk
This makes the placements easier to separate by campaign value, but splits the results across multiple campaign labels. Choose one approach before printing; do not mix the two patterns unpredictably. For a larger print campaign, keep a simple spreadsheet mapping each code to its full URL, placement, and naming convention.
Check analytics after launch
After the codes are distributed, use your analytics platform's acquisition or campaign reporting to review visits associated with the UTM values. Look for the source, medium, and campaign you chose, and compare placement values if you used utm_content or distinct campaign names. Then review relevant outcomes, such as offer-page engagement, sign-ups, or purchases, using the conversion events your site already measures.
Check that tagged traffic is appearing under the expected labels before drawing conclusions. If it is missing or grouped unexpectedly, test the exact printed URL again and inspect redirects, analytics consent settings, and the site's analytics implementation. Reporting labels and interfaces differ across tools, so use the equivalent campaign or session dimensions in your platform.
A recorded visit is not the same thing as a QR scan. A person may scan but close the page before it loads, lose connectivity, or decline analytics tracking. One person can also scan more than once or use a different device later. Conversely, a visit to a copied or shared tagged URL may be counted even if it did not originate from a physical scan. Conversions can be missed or attributed differently when they happen later or through another channel. Treat the results as useful campaign signals, not a perfect scan counter.
Common Mistakes
- Generating the QR code before adding UTMs: the code then points to an untagged URL. Finalize and test the destination first.
- Changing naming conventions between placements: inconsistent values fragment reporting and make comparisons harder.
- Using a new campaign value for every code without planning: this can split one promotion into many report rows. Use distinct values only when that separation is useful.
- Assuming a scan equals a session: a scan may not lead to a loaded or measurable page visit.
- Forgetting to test redirects: a redirect may send visitors to the right page while dropping query parameters.
- Putting personal data in a URL: UTM parameters are not private storage.
Best Practices
- Define the reporting question first: compare one campaign's placements, or report each placement as a separate campaign?
- Keep a shared naming convention and record the exact URL encoded in every QR code.
- Test every final code on a phone before printing and again from a proof or printed sample.
- Use a distinct, descriptive placement label when you need placement-level comparison.
- Review analytics after launch, but explain the limits of attribution when sharing results.
Conclusion
To track QR code scans with UTM parameters, tag the destination URL consistently, generate the QR code from that complete URL, and test the whole path before printing. Use placement labels that match your reporting needs, then treat analytics as an indicator of campaign activity—not an exact count of physical scans.
