How to track QR code scans for free

You don’t need a paid dynamic QR code to find out whether your poster, flyer or packaging is working. A static code and the analytics on your own website can tell you almost everything that matters.

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.

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 example flyer, poster or packaging.
  • utm_medium: the type of channel. Use qr for every QR code, so they are easy to group.
  • utm_campaign: what the campaign is, for example spring-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 Poster and poster as 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

  1. Open Reports → Acquisition → Traffic acquisition.
  2. Change the main dimension to Session source / medium. Your codes appear as rows like poster / qr.
  3. To compare campaigns, switch the dimension to Session campaign.
  4. Add a filter for medium qr to 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.

Common questions

Can you track a static QR code?

Yes. Add UTM tags to the link, or point each code at its own page, and your website analytics shows the visits each code brings.

Can I see who scanned my QR code?

No, and no honest tool can. Analytics shows anonymous visits, roughly where and on what kind of device, not who the person was.

Do UTM tags make the QR code harder to scan?

They make the link longer, which makes the code denser. Keep tags short, or use a short page address per placement, and print the code a little bigger.

Where do QR code visits show up in Google Analytics?

In Reports → Acquisition → Traffic acquisition. Set the dimension to Session source / medium, and your codes appear under the source and medium you put in the tags.

Can I track scans of a Wi‑Fi QR code?

No. A Wi‑Fi code doesn’t open a web page, so there is nothing for analytics to record.

Buy me a coffee