How to Measure Static QR Code Scans Without Dynamic Codes
The standard advice is that you cannot measure a static QR code, and that if you want scan counts you need a dynamic code with a redirect you pay for. That is roughly true but slightly lazy. You cannot count scans — but you can measure visits, and for most business questions visits are the number you actually wanted.
The distinction matters because the two numbers diverge. Not every scan becomes a visit: a person may scan, see the preview URL and decide not to open it. Not every visit comes from a scan: the URL may be typed in by someone who read it off a poster. What you lose with a static code is the scan event. What you keep is everything downstream of it, and that is usually the part worth optimising.
Method 1: UTM parameters, the workhorse
Append campaign parameters to the destination URL before you encode it. A URL like
https://example.com/menu?utm_source=qr&utm_medium=print&utm_campaign=window tells your
analytics that the visit came from the printed code in the window, and separates it from organic search
and social traffic.
Three rules make this work in practice. Keep the parameters short — every character you add
increases the number of modules in the code, which forces either a larger print size or a harder scan.
Use lowercase and underscores consistently, because analytics treats QR and qr as
different sources. And keep a spreadsheet of every code you print, with its UTM string and its physical
location, or you will be guessing in six months what campaign=test2 referred to.
Method 2: a dedicated landing page per placement
If you only have a handful of placements, skip parameters and give each one its own short path:
example.com/window, example.com/table4, example.com/receipt. Each
path redirects to the real destination and is counted separately. This is more robust than UTM because it
survives users copy-pasting the link, and it produces a much shorter string to encode — which makes
for a smaller, more reliable code.
It also gives you an escape hatch that static codes otherwise lack. Because the path redirects at your
server, you can change where /window points next month without reprinting anything. You
cannot change the URL inside the QR image, but you never needed to: you can change what that URL does.
Method 3: server logs for the honest number
Analytics tools miss visitors who block scripts, and their totals are frequently 10–30% below reality. If you control the server, grep the access log for the path or the UTM string. You get raw hits, including bots, so filter obvious crawlers — but the number is unfiltered by consent banners and ad blockers, which makes it a useful cross-check when your analytics dashboard looks suspiciously quiet.
Method 4: compare against a control period
Sometimes the cleanest measurement is not a parameter at all. Put the code up on a known date and compare the destination's traffic in the four weeks after against the four weeks before, ideally the same weeks in the previous month to cancel out weekly seasonality. This is crude, and it breaks if you ran other marketing at the same time, but it requires no tagging and no redirect — and for a small business with one window sticker it is often good enough.
What you genuinely cannot measure
Be honest about the gaps, because they determine whether a dynamic code is worth paying for:
- Scan count. No redirect means no scan event. Visits are a lower bound on scans.
- Device and location at scan time. You get these for the visit, but only for the visitors who consent to analytics.
- A/B testing the code itself. You can A/B test destinations, but not the code design, without a dynamic code per variant.
- Retargeting the scanner. Building an audience of "people who scanned" requires the redirect to fire a pixel, which static codes do not do.
If you need any of those four, buy a dynamic code service — and read Static vs Dynamic QR Codes first, because you are also buying a dependency: when that provider shuts down, every printed code stops working.
A practical setup that takes twenty minutes
Create one short redirect path per placement, point each at the real destination, add
utm_source=qr to the redirect target so your analytics still groups them, and log every
mapping in a spreadsheet alongside a photo of the printed code. Then generate the QR code from the short
path. You get per-placement counts, a short string that prints small, the ability to retarget later, and
no third-party subscription.
One caveat: check that your redirect is a 301 or 302 served by your own domain, not a public URL shortener. Shorteners have been known to shut down, change terms or start inserting interstitial ads, and you would be putting that between your customer and your content permanently.
FAQ
Can static QR codes be tracked at all?
Not the scan itself, but the resulting visit can be attributed with UTM tags or a dedicated landing page. For most purposes that is the more useful number anyway.
Do UTM tags make the QR code harder to scan?
They add characters, which adds modules and makes the code denser. Keep the tags short so the code stays easy to scan at your chosen print size.
Is a URL shortener a good idea here?
Prefer a short path on your own domain. Public shorteners can disappear or change terms, and that would break every code you have already printed.
Why do my analytics show fewer visits than expected?
Consent banners, ad blockers and script blocking all suppress analytics. Compare against your server access log to see the unfiltered figure.
Should I use one code for all placements?
Only if you do not care which placement works. One code per placement costs nothing extra and is the only way to learn where to invest next time.
Related guides
If you are choosing between the two code types, start with Static vs Dynamic QR Codes. For turning the numbers into better placements, see QR code campaign best practices. Restaurants measuring table codes should read restaurant menu QR setup, and anyone tagging destination URLs will want How to Create a QR Code for a Website.