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 October 4, 2026.
How to Track QR Code Scans Without a Subscription: featured image from QR Codes Made Easy

Add UTM parameters to your link, put that tagged link into a static QR code, and measure attributed visits in analytics you already run. These reports are not proof of every scan or a count of unique people who scanned.

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

Some managed QR services charge for redirects and reporting. This guide shows a different approach: use a static code with campaign tags and analytics on a destination you control.

You need access to the destination analytics and permission to collect the data. This generator adds no QR subscription; your hosting and analytics services retain their own costs and terms.

What free scan tracking actually measures

Here is the honest version up front. A dynamic QR service may report requests to its redirect URL as scans. When someone opens the encoded link, the redirect server receives a request before forwarding them. It cannot detect a camera merely viewing the code. The metric depends on the service's reporting and filtering rules.

The free method measures something slightly different, and usually more useful: the visits attributed to your tagged link. You tag your link so analytics can group traffic by the campaign labels you supplied. Anyone using a shared copy of that tagged link can appear in the same group, even without scanning. These are attributed visits or sessions, not a count of unique people or every scan. Shared links, repeat visits, consent choices, and blocked analytics can affect the totals.

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. Use Google's Campaign URL Builder to avoid malformed links. If adding them by hand, use ? only when the URL has no query string; otherwise use &. Put query parameters before any # fragment. 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. The generator encodes your supplied link without adding its own redirect. Any redirect already in that link retains its own dependencies. 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 from Google's campaign URL documentation.

ParameterWhat to putWhat it means
utm_sourceqrWhere the visit came from. Use qr to group traffic attributed to these links.
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 hypothetical 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 inspect sessions attributed to that campaign, not how many people scanned. And if some tents used utm_content=window-decal instead, I can see which spot pulled better.

Read attributed sessions in Google Analytics 4

Once the tagged link is live and permitted analytics records visits, you can inspect attributed sessions 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 shows sessions attributed to the tagged source and medium, not an exact scan count.
  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. Reporting is not necessarily immediate; allow for processing delays and verify your analytics setup with a test visit.

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 your hosting provides access logs, use them as a separate measure of page requests. Bots, cached pages, and shared links make request totals different from scans. A dedicated landing page helps isolate a campaign but does not prove how every visitor arrived.

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 measures attributed visits, not every camera scan. Analytics must load and be permitted to record the visit. Consent choices, blockers, failed loads, and shared tagged links affect the results. A dynamic redirect service also cannot count a camera that reads a code without opening its link. Its dashboard measures redirect requests, subject to its filtering rules.

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 may be able to edit the destination after printing and view redirect-request reporting in its dashboard.

Both features depend on the redirect service. Fees, usage limits and what happens after cancellation vary by provider. Before printing, check the encoded URL and the specific provider policy.

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 need to change destinations after printing or want a managed redirect dashboard, consider a dynamic service and check its cancellation policy. 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, if you have suitable destination analytics. Put a tagged URL in a static QR code and measure attributed visits, not every camera scan. Server logs measure page requests and have different limits. Hosting and analytics may have their own costs.

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 attributed sessions, not an exact scan count.

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?

There is no subscription to keep this generator's static code active. A linked domain, hosting plan or supplied redirect still has its own terms and must remain available. The printed pattern must also remain readable.

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