QR Codes Made Easy.
Home / Guides / Track QR scans without a subscription
Tracking

How to Track QR Code Scans Without a Subscription

By Bud Hennekes, who built QR Codes Made Easy. Updated July 2026.

You do not need a paid dynamic QR service to know your scans are working. Add UTM parameters to your link, put that tagged link into a static QR code, and read the scan-driven visits in the analytics you already run.

What's here
  1. What free scan tracking actually measures
  2. Step by step: tag the link, then make the code
  3. Read your scans in Google Analytics 4
  4. The honest tradeoffs of the free method
  5. Static vs dynamic: which should you use

Somewhere along the way, QR codes got turned into a subscription. You generate a code, print it on a flyer, and six months later the vendor emails you: your plan lapsed, your code is dead, pay up. I built a free tool because that bothered me. This guide is the other half of the story: how to track your scans without renting anything.

The part paid services would rather you not notice: the scan tracking you actually care about is something you can run yourself, for free, with tools you probably already have.

What free scan tracking actually measures

Here is the honest version up front. A dynamic QR code counts scans at a redirect server it runs through. Every time a phone opens the code, the vendor's server logs a hit before sending the person on to your page. That redirect is what you are paying for.

The free method measures something slightly different, and usually more useful: the visits a scan produced. You tag your link so your own analytics can tell a QR visit apart from every other visit. When someone scans your code and lands on the page, that visit drops into a bucket you named. You see how many people scanned, then actually arrived.

For most real goals (did the flyer work, did anyone open the menu, which table tent pulled better), that is the number that matters. A raw camera-open that never loads your page was not doing anything for you anyway.

Step by step: tag the link, then make the code

The whole method is five steps. It takes about ten minutes the first time and two minutes after that.

  1. Start with your destination URL. This is the page you want people to land on: a menu, a signup form, a product page. Example: https://yoursite.com/menu.
  2. Add UTM parameters to that URL. UTM tags are just labels you bolt onto the end of a link. Google Analytics reads them and files the visit under the source, medium, and campaign you chose. You add them by hand: a ? after the URL, then each label joined with &. Definitions are in the table below.
  3. Put the tagged URL into a static QR code. Paste the full tagged link into the generator and make the static code for your tracked link. Static means the link is baked into the pattern itself, so there is no redirect server, no account, and nothing to expire. Download the PNG or SVG.
  4. Print it. Put it on the flyer, the sign, the table tent, the packaging. If you are sizing it for print, check a guide to the right QR print size so it scans from where people actually stand.
  5. Read the results in Google Analytics. Filter by the source and medium you set, covered in the next section.

Here are the parameters in plain language. These names come straight from Google's own campaign URL documentation.

ParameterWhat to putWhat it means
utm_sourceqrWhere the visit came from. Use qr so every scan groups together.
utm_mediumprintThe kind of surface. Use print, or get specific: flyer, poster, packaging.
utm_campaignspring-menuThe specific push this code belongs to, so you can compare one campaign against another.
utm_contenttable-tentOptional. Which version of the thing, so you can tell two flyers apart.

Put those together and you get one tagged link. Copy this and swap in your own values:

https://yoursite.com/menu?utm_source=qr&utm_medium=print&utm_campaign=spring-menu&utm_content=table-tent

Keep everything lowercase and use hyphens instead of spaces. Google files Print and print as two separate buckets, which splits your numbers for no reason. A real example: say I print table tents for a coffee shop's spring menu. I tag the link like the one above, make a static code, and put it on every table. Two weeks later I can see how many people scanned and loaded the menu. And if some tents used utm_content=window-decal instead, I can see which spot pulled better.

Read your scans in Google Analytics 4

Once the tagged link is live and people start scanning, the visits land in GA4. Here is where to look.

  1. Open GA4 and go to Reports, then Acquisition, then Traffic acquisition.
  2. This report is built on session source / medium, which is exactly what your UTM tags feed. Set the table's primary dimension to Session source / medium.
  3. Find the row that reads qr / print (or whatever source and medium you chose). That row is your scans that turned into visits.
  4. Want to compare flyers or campaigns? Switch the dimension to Session campaign, or add it as a secondary dimension, to break it down further.

Google's documentation confirms these tags show up in the Traffic acquisition report under Session source, Session medium, and Session campaign. So this is not a workaround. It is the path the report was built for. Give it a little time after your first scans, since data can take up to a day to settle.

The other free option: point the code at a page you fully control, like yoursite.com/menu, and read that page's own analytics or server logs. If you run your own site, the server already records every hit to that URL. A jump in visits to a page that is only reachable by scanning the code is your scan count, with no third party in the middle.

The honest tradeoffs of the free method

I am not going to pretend this is free with no strings. Two things you should know going in.

It counts visits, not raw camera opens. The person needs an internet connection and has to actually land on the page for the visit to register. If someone points a camera and closes it before the page loads, that one does not show up. In practice the gap is small, and people who bail before the page loads were not going to convert anyway. But if you need a literal tally of every camera that ever pointed at the code, only a redirect-based dynamic code can give you that.

A static code's destination is fixed once printed. The link lives inside the pattern, so you cannot change where a printed code points. Two clean ways around this: point it at a URL you are confident stays put, or point it at a page you control (like yoursite.com/menu) and change the contents of that page whenever you want. The code stays the same. The page behind it changes.

Static vs dynamic: which should you use

Let me be fair to dynamic codes, because they do buy you two real things. You can edit the destination after printing, and you get scan counts in a built-in dashboard without touching analytics.

The cost is the part nobody flags at signup. Both features run through the vendor's server, which means a monthly fee, and if you stop paying, the code can stop working. Your printed flyer points at their server, not your page. When the plan lapses, a dynamic code can expire even though the pattern is printed forever. You end up renting your own codes.

The free method flips that. The destination is baked into a code that belongs to you and never expires, and the tracking runs on analytics you own. The trade is that you set it up once by hand instead of clicking a button, and later you change the page rather than the code.

My rule: if you truly need to re-point a code after it is printed, or you need a raw scan tally down to the camera-open, pay for a dynamic code and go in with your eyes open. For everything else (flyers, menus, signs, packaging, events) tag your link, make a static code, and keep tracking you actually own.

FAQ

Can you track a QR code for free?

Yes. Add UTM parameters to your destination link, put that tagged link in a static QR code, and read the scan-driven visits in Google Analytics or your own server logs. No subscription, no dynamic code.

How do I know if my QR code was scanned?

In GA4, open Reports, then Acquisition, then Traffic acquisition, and look for the row matching the source and medium you tagged (for example qr / print). That row shows how many scans turned into visits.

Do static QR codes have analytics?

The code itself does not count anything. It just holds a link. You get analytics by tagging that link with UTM parameters, so the visits it sends show up in the analytics you already run.

What is a UTM parameter?

It is a small label added to the end of a URL that tells your analytics where a visit came from. utm_source, utm_medium, and utm_campaign are the three main ones. Google reads them and files each visit accordingly.

Can I track QR scans without an app?

Yes. This method needs no app on your phone and no app for the person scanning. The tracking happens in your web analytics after they land on the page.

Will my static QR code stop working if I stop paying?

No. There is nothing to pay for. A static code encodes the destination directly in the pattern, so it keeps working with no server and no account behind it. The expiration risk belongs to dynamic codes that route through a paid redirect.

Make the static code for your tracked link

Paste your UTM link into QR Codes Made Easy for a static code that never expires. Free, no account.

Build your QR code