QR code tracking: what it tells you and what it misses
QR code tracking counts scans, not people. You get how many, roughly when, roughly where, and on what kind of device. You don’t get a name, an email, or anything that identifies who scanned. A plain printed code can’t be tracked at all, because there’s nothing in the middle to count.
Worth clearing up first: this is about counting scans, not about tracking objects. If you came looking for a way to tag equipment or run an inventory, that’s a different job and this won’t help with it.
Why anything gets counted at all
A plain QR code holds the address itself. The phone reads the squares, goes straight to the page, and nothing in between ever knows it happened.
A trackable code holds a short link instead. The phone asks that short link where to go, the link answers, and the phone follows it on. That extra step is the whole mechanism. Something in the middle got asked a question, so something in the middle can keep a tally.
That’s also why the two kinds of code are not interchangeable. Static and dynamic differ by exactly this, and tracking rides along with it.
What you genuinely get
Every scan is a web request, and a web request carries a few ordinary things with it. Read together, over a few hundred scans, they tell you a surprising amount:
- How many, and when. Counts by day and by hour. This is the one that earns its keep.
- Roughly where. Worked out from the network address, so it lands on a city or a region rather than a street.
- What kind of device. Phone or desktop, which browser, which operating system.
- Where they came from, when there’s anything to go on.
- Which code. If you printed ten different codes, you can tell them apart.
That last one is the quiet winner. One code per poster, per table, per mailing, and the numbers stop being trivia and start answering which placement did the work.
What you don’t get
Here’s the part the feature pages skip.
You don’t get a person. No name, no email, no account, nothing that reaches anybody. A scan is an event, not a visitor you can follow up with.
You don’t get a unique human. One curious passer-by scanning three times is three scans. So is one person checking a menu twice at lunch. There’s no way to tell those apart from three different people.
You don’t get a street address. Location is derived from the network the phone was on, which is why it reports a city and sometimes reports the wrong one. A phone on mobile data can land wherever that carrier routes.
You don’t get a sale. A scan says somebody looked. What happened next is on the page they landed on, and that is a different measurement entirely.
None of this is a flaw in a particular product. It’s what a redirect can observe, and anybody telling you otherwise is selling something.
Why your printed code shows nothing
If you made a plain code and you’re looking at an empty dashboard, this is why. There was never anything to count.
The code points straight at your page. The only record of the visit is in your website analytics, mixed in with everybody who arrived some other way. Nothing marks it as having come from a code.
The fix isn’t a setting. It’s a different code, and if the old one is already printed, you’re reprinting or redirecting.
What the numbers are actually good for
Keep the bar where it belongs and this is genuinely useful.
One code per placement tells you which placement worked. Counts by day tell you when the poster got noticed and when it stopped. Device splits tell you what the landing page needs to look like.
What it will not do is tell you who to call. If that’s what you need, the scan has to land on a page that asks. At that point it’s the page doing the work, not the code.
Where ours fits
QRFLOW.codes counts scans on every dynamic code, grouped by day, country, city, device, browser, operating system and referrer. Plain static codes stay free and uncounted, because a code that will never change rarely needs measuring either.
What it holds is the request, not the person. We never see who scanned, because nothing in a scan says so, and what we do keep is in the privacy policy.