What you can and can’t measure
With a static code, you measure visits, not scans. When someone scans the code and their browser opens your page, your analytics records the visit and where it came from. If someone scans the code but doesn’t open the link, nothing is recorded. In practice that is the number you care about anyway: people who actually arrived.
Codes that don’t open a web page, such as Wi‑Fi, contact cards or plain text, can’t be tracked this way, because nothing is loaded from the internet.
Method 1: Add campaign (UTM) tags to the link
UTM tags are short labels added to the end of a link. Analytics tools such as Google Analytics read them and report the visit under those labels. There are three you’ll use most:
utm_source: where the code is, for exampleflyer,posterorpackaging.utm_medium: the type of channel. Useqrfor every QR code, so they are easy to group.utm_campaign: what the campaign is, for examplespring-sale.
A fourth, utm_content, is useful for telling apart versions of the same campaign, such as two poster designs.
Put together, a tagged link looks like this:
https://example.com/sale?utm_source=poster&utm_medium=qr&utm_campaign=spring-sale
Make one code per placement, each with a different utm_source or utm_content. The bulk QR code generator can make a whole set from a spreadsheet in one go.
Naming tips
- Use lowercase only. Many analytics tools treat
Posterandposteras two different sources. - Use hyphens instead of spaces.
- Keep a simple list of the tags you’ve used, so the reports stay tidy.
- Keep it short. Every character makes the code denser, so a long tagged link needs to be printed bigger. Two or three short tags are plenty.
Where to see the results in Google Analytics 4
- Open Reports → Acquisition → Traffic acquisition.
- Change the main dimension to Session source / medium. Your codes appear as rows like
poster / qr. - To compare campaigns, switch the dimension to Session campaign.
- Add a filter for medium
qrto see only QR traffic.
Other analytics tools such as Plausible, Matomo and Fathom read the same UTM tags and show them in their own source or campaign reports.
Method 2: Give each placement its own page
If you don’t use UTM tags, or you want even shorter links, give each placement its own address, such as example.com/flyer and example.com/poster. Each page can show the same content, or redirect to your main page. Page views on each address tell you how many visits each placement produced.
This works with any analytics tool, including simple ones like Cloudflare Web Analytics, and even with your web server’s logs. It also keeps the code short and clean.
Method 3: Your own short redirect
For codes on long-lived things like packaging or signs, a redirect on your own domain gives you the most flexibility. Your code contains example.com/go/box, which redirects to whatever page you choose, with UTM tags added in the redirect itself. You can change the destination later, and the printed link stays short. This is effectively a free dynamic QR code that depends only on your own domain. The guide to static vs dynamic QR codes covers how to set one up.
Method 4: Offline signals
Not every result happens on a website. For a shop or restaurant, you can also:
- Show a discount code on the page the QR code opens, and count how often it is used at the till.
- Ask at checkout how customers heard about you.
- Compare sales during and after a campaign.
A worked example
A café wants to know whether its window poster or its table cards bring more people to its online ordering page. It makes two codes:
- Window:
…/order?utm_source=window&utm_medium=qr&utm_campaign=ordering - Tables:
…/order?utm_source=table&utm_medium=qr&utm_campaign=ordering
After two weeks, the Traffic acquisition report shows visits for window / qr and table / qr side by side, along with how many of those visits placed an order, if ordering is set up as a key event. No subscription, and no third party between the guest and the café.
Common mistakes
- Not testing the tagged link. Scan the code and check that the page loads and that the visit shows in your analytics’ real-time report.
- Tagging internal links. Only use UTM tags on links that bring people from outside, like QR codes. Tags on links within your own site overwrite the real source.
- Putting personal data in the link. Never include names, emails or phone numbers in a URL. Links end up in logs and browser histories.
- Expecting perfect numbers. Visitors who decline analytics cookies, use blockers or are in regions with stricter consent rules may not be counted, or may only appear in modelled data. Treat the numbers as a comparison between placements, not an exact count.