How to Measure Static QR Code Scans Without Dynamic Codes

Published: 15 September 2026 | Reading time: 7 minutes

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.