There are two reliable ways to track QR code scans. Free: append UTM parameters to your URL, encode that URL in a static QR code, and read the results in Google Analytics. Easier: use a dynamic QR code, which counts every scan and breaks it down by day, country, and device. Exact steps for both are below.
Can a QR code track scans by itself?
No. A QR code is a picture of data — usually a URL. The image has no memory, no server, no counter. It cannot know it was scanned, any more than a printed phone number knows it was dialed.
Tracking happens in one of two places. Either the destination page records the visit, which is what UTM parameters enable. Or the code points at a short redirect link, and the redirect server counts each hit before passing the visitor along. That second approach is what a dynamic code is. The distinction matters for cost, accuracy, and what happens after you print. More on that split in static vs dynamic QR codes.
How do I track QR code scans for free?
Use UTM parameters. These are tags you add to the end of your URL. Your analytics tool reads them and tells you the visit came from your QR code. It costs nothing and works with any static code from any generator.
Here is the full process:
- Start with your destination URL, e.g. example.com/menu.
- Append UTM tags: example.com/menu?utm_source=qr-code&utm_medium=print&utm_campaign=table-tents.
- Use a different utm_campaign value for each placement — table-tents, window-poster, flyer — so you can compare them.
- Paste the full tagged URL into the free generator and download the code. No account needed.
- Scan it once yourself to confirm the page loads with the parameters intact.
- In Google Analytics 4, open Reports, then Acquisition, then Traffic acquisition. Filter by session source = qr-code. Each session is a scan that reached your page.
When do UTM parameters fall short?
UTMs only count visits that load your page with your analytics script running. Several things slip through that net.
They require a website you control with analytics installed. A QR code pointing to a WhatsApp chat, an app store listing, a hosted PDF, or a Google review page gives you nowhere to put the script. WiFi and vCard codes contain no URL at all, so they cannot be tracked by anyone — us included.
They also undercount. Ad blockers, slow connections, and people who close the tab before the page loads all vanish from your numbers. And the tags are baked into the printed code. If you reorganize your site, the old tagged URL breaks, which is the most common reason a QR code stops working.
How do dynamic QR codes track scans?
A dynamic code points at a short redirect link — ours look like qranite.com/r/xxx. The redirect server counts the scan before sending the visitor to your destination. Every scan registers, even if the destination page never loads, because the count happens at the redirect, not on your site.
You get scans by day, by country, and by device type, with no analytics setup on the destination. You can also re-point the link after printing, so a reorganized website or a new menu PDF does not strand your printed codes.
On Qranite, a free account includes 2 dynamic codes with unlimited scans, no ads, and a 7-day analytics window. Pro is $9 a month for 50 codes and 365-day analytics; there is also a $79 lifetime option for 10 codes. Details on pricing. One policy worth stating plainly: if you stop paying, your codes keep redirecting forever. You lose editing and the longer analytics window, not the codes.
UTM tracking vs dynamic analytics: which should you use?
Use UTMs when the destination is your own website, volume is modest, and you will not need to change the URL after printing. Use a dynamic code when the destination is not yours, when you need per-placement counts without GA gymnastics, or when the printed code must outlive the URL behind it.
| UTM + static code | Dynamic code | |
|---|---|---|
| Cost | Free, no account | Free for 2 codes; paid above that |
| What gets counted | Sessions that load your page | Every scan, at the redirect |
| Works for non-website destinations | No | Yes |
| Requires Google Analytics | Yes | No |
| Country and device breakdown | Yes, in GA | Yes, built in |
| Change destination after printing | No | Yes |
| Depends on a third-party server | No | Yes — read the provider's policy |
What about the free tracking other generators offer?
Read the terms before you print. Most free dynamic tiers are structured to fail after your codes are on paper.
Per their support docs, dynamic codes made in qr-code-generator.com's 14-day trial are deactivated when the trial ends, and scans then land on their upsell page. QR Tiger's free dynamic codes stop after 500 scans each, and per their own policy all dynamic codes stop working if your plan lapses. ME-QR's free codes show full-screen interstitial ads to the person scanning; removing ads from all your codes costs $27.99 a month. QRFY pauses codes 7 days after creation unless you subscribe, per their pricing page.
None of this applies to static codes, which never expire from any generator — the image is just data. If a printed code died on you, the redirect link inside it was switched off. We wrote up the mechanics in do QR codes expire.
A practical recommendation
Start with the free UTM method. It answers the basic question — are people scanning this — at zero cost and with zero dependency on anyone's servers. Tag each placement separately and check GA after a week.
Move a code to dynamic when one of three things becomes true: the destination is not a site you control, you need scan counts the moment they happen rather than page-load counts, or the printed run is large enough that a dead URL would cost real money. Two dynamic codes are free to try, which covers most small deployments outright.