OpenQR

Basics

How to track QR code scans (and the honest catch)

It is one of the most common questions about QR codes, and the honest answer is rarely given straight: a plain static QR code cannot be tracked. There is no counter inside it. To measure scans you need either a dynamic code or a trackable link behind it. This guide explains exactly how each approach works, including a free method, and the trade-offs of each.

9 min read · Updated 24 June 2026

First, the crucial bit of honesty. A static QR code encodes its destination directly in the image. When someone scans it, their phone goes straight to that URL — your device, the code and the website never report back to you. There is simply no mechanism for the code itself to count a scan. Any tool that claims to track a static code is, in reality, not tracking the code at all; it is tracking a link or a page. Understanding this is the foundation of static versus dynamic QR codes.

What 'tracking' actually means

You are never tracking the QR image. You are tracking what happens after the scan — a request to a server. That request can come from a redirect link (dynamic codes) or from analytics on the page itself. The QR code is just the doormat.

Why static codes can't be tracked

OpenQR, like any in-browser generator, creates static codes. The data you enter is baked into the pattern and the code points straight to it, free and forever. That permanence is a feature — it never expires and no third party can change it — but the flip side is that there is no server in the middle to log scans. We are upfront about this: OpenQR does not and cannot offer scan tracking, because tracking requires a routing layer that a static, in-browser tool does not have.

Option 1: a dynamic QR code

A dynamic QR code does not encode your real URL. Instead it encodes a short link that points to a provider's server, which then redirects the visitor to your destination. Because every scan passes through that server, it can be counted — and the provider can show you scan totals, times, rough locations and device types.

This is the only way to get tracking that sits with the code itself, and it brings a bonus: you can edit the destination later without reprinting. But there are real costs and caveats.

  • It needs an account and usually a subscription — free tiers are limited and often expire
  • It can stop working — if the provider folds, you stop paying, or the redirect is removed, the code dies (see do QR codes expire)
  • You depend on a third party — your code's destination is controlled by their server, not by you
  • It is more complex — overkill if you just want a quick code for a poster or business card

Dynamic codes can expire

Because a dynamic code relies on a provider's redirect, it is only alive as long as that link is. Static codes never expire. If you choose dynamic for tracking, make sure you understand the renewal terms before printing thousands of them.

Here is the part most generators will not tell you: you can get useful scan data from a free static code by making the link trackable rather than the code. The code stays simple and permanent; the measurement happens on the destination you already control.

Two free approaches, used together or separately.

  1. 1

    Add UTM parameters to the URL

    Append campaign tags to your link before generating the code, for example yoursite.com/menu?utm_source=qr&utm_medium=poster&utm_campaign=spring. When people scan, those tags flow into your website analytics, so any visit from that code is attributed to it.

  2. 2

    Read it in your own analytics

    If your destination is a page you own, your existing analytics (such as a privacy-friendly analytics tool, or your CMS stats) will already log the visits. The UTM tags let you filter to exactly the scans from that code.

  3. 3

    Use a dedicated landing page

    Point the code at a unique page or path used nowhere else. Every hit to that page is effectively a scan, so even basic server logs give you a count with no extra tooling.

  4. 4

    Optionally add a free short link

    A free link shortener that offers click stats can sit between the code and your page. You keep a static QR image, but you get a click counter. The trade-off is a dependency on that shortener staying online.

This approach keeps the benefits of a static code — free, no account, no expiry — while still answering 'how many people scanned this?'. The data is attributed to visits rather than raw scans, but for most campaigns that is exactly what you want to know anyway.

Comparing your options

ApproachCostTracks scans?Editable later?Can expire?
Plain static codeFreeNoNo (reprint)No
Static code + UTM tagsFreeVisits, via your analyticsNo (reprint)No
Static code + free short linkFreeClicks, via shortenerSometimesIf shortener closes
Dynamic codeAccount / subscriptionYes, detailedYesYes

Which should you choose?

If you mainly want to know whether a campaign is working and roughly how much traffic it drives, the free UTM approach is usually enough — and it never expires. If you need to edit destinations on the fly, run lots of campaigns, or want granular per-scan analytics with location and device data, a dynamic code earns its keep despite the cost and the expiry risk.

Decide before you print

Switching from static to dynamic (or back) means reprinting, because the encoded link is different. Choose your tracking approach before committing a code to thousands of flyers or a permanent sign.

What OpenQR does

OpenQR makes static codes in your browser, free and watermark-free, so it does not track scans — and we would rather say so than pretend otherwise. The practical recommendation: generate a static code pointing at a URL with UTM tags, and read the results in your own analytics. You get a permanent, free code and a sense of how it performs, with no account and no third party in the loop. For more on truly free generation, see our no-watermark generator guide.

Create a free static QR codeAdd UTM tags to your link, then measure scans in your own analytics. No account needed.
Not the code directly — a static code points straight to its destination with no server in between to count scans. You can, however, track the visits it generates by adding UTM parameters to the link and reading them in your own website analytics.

Related reading