QR Code Analytics: The 9 Metrics Marketers Should Actually Track
What a QR scan can and cannot tell you, metric by metric — nine numbers worth reporting and two that only look like data.
A QR code scan tells you that a device requested a specific redirect, at a specific moment, from a specific rough location. It does not tell you who that person is, whether they read the page, or whether they bought anything. Every genuinely useful QR metric is built from that one narrow event, a timestamped request, so the honest starting point is knowing what such a request can and cannot support before you put a single number into a report.
What a scan actually is, before the metrics
When someone scans a dynamic QR code, their phone's camera opens a short link — a tilg.in/{code} address, for example — and that request is what gets logged before the redirect fires. The log entry can capture that the request happened, when it happened, an approximate location inferred from the network the device is on, and what kind of device and operating system made the request. It cannot capture a name, an email address, or anything about the person unless they hand that over themselves on the destination page.
A static code produces no such event at all. There is no redirect step for anything to observe, which is precisely why static and dynamic QR codes are a different decision from an analytics standpoint, not just a printing one. Everything from here on assumes a dynamic code.
It also matters that this is per-code reporting, not per-campaign. If the same dynamic code is printed on a shelf-talker, a receipt, and a social post, every scan from all three lands in one merged set of numbers, with no way to separate them after the fact. A code is the smallest unit anything below can measure. If you want to know which placement did the work, that decision has to be made before printing, by giving each placement its own code, not after the numbers come in.
What retention means for how you report
Scan data is kept for a defined period and then purged automatically rather than accumulating indefinitely. That's a reasonable privacy default, and it has a practical consequence worth planning around: any number you'll need for a quarterly review, a client report, or a year-on-year comparison has to be recorded before the retention window closes, not pulled from the dashboard whenever the request comes in. Treat the numbers below as things to log on a schedule, not as an archive you can query at will months later.
The nine metrics worth tracking
Each of these should answer a specific question and drive a specific decision. If a metric can't do both, it doesn't belong in a report, however easy it is to pull.
| Metric | What it answers | What it cannot tell you | Decision it drives |
|---|---|---|---|
| Scan volume (total scans) | How much attention a placement is getting, in raw terms | Whether anyone engaged, converted, or was even the intended audience | Whether a placement is worth its physical space at all |
| Unique scans | Roughly how many distinct people or devices scanned | Whether one person scanned twice on two devices, or two people shared one; it's an estimate, not a headcount | How many people plausibly saw the destination, as distinct from how many times it was hit |
| Scans over time (time series) | The shape of engagement across the code's life: a launch spike, a slow build, a flatline | Why the shape looks the way it does, without matching it to your own campaign calendar | When a placement's useful life has ended, and when to plan the next print run |
| Time of day, read from the time series | When in the day people are actually scanning | Why: whether it's a commute, a lunch break, or something about the placement itself | Whether to time a promotion, a stock refresh, or staffing around the peak hours |
| Day of week, read from the time series | Whether scanning follows a weekly rhythm | Whether a quiet day is the placement's fault or an unrelated calendar effect | Which day to schedule anything tied to the code, from an offer to a restock |
| Geography (top locations, city-level) | Roughly where the scanning devices' networks are located | Street-level or in-store precision; it can be wrong under a mobile carrier's shared network or a VPN | Which regions deserve more stock, more staff, or a regional language variant |
| Device and OS | What device and software opened the redirect | Whether the destination page actually rendered correctly, or whether the visit went anywhere after that | Which device to test the landing page on first, and how heavy that page can afford to be |
| Repeat-scan ratio (the gap between total and unique) | How often the same device or session returns to one code | Whether repeats mean enthusiasm or a landing page that's failing and being retried | Whether a placement rewards repeat visits (a menu) or is quietly masking a broken one |
| Post-scan conversion, measured on your own site | Whether the visit turned into the outcome you actually wanted | Nothing on the QR platform's side measures this; it has to be tracked where the visitor landed, using your own analytics or CRM | Which placement earned its print budget, not just its scan count |
Geography is worth one honest number here, self-reported by a vendor but the most-cited figure in the field: MaxMind, one of the primary IP geolocation data providers, publishes its own city-level accuracy at roughly 20 to 75 per cent, against over 99 per cent at country level, and notes that mobile network IPs can shift hundreds of kilometres between users within minutes as carriers reassign addresses. Read a "top city" report as a regional signal worth sanity-checking, not a location record.
Three of these deserve deeper treatment than one row can give them: reading your scan curve names the specific time-series shapes worth recognising, what QR location data can and cannot tell you covers exactly where the geography estimate breaks down, and device and OS data covers turning that row into actual landing-page decisions.
Notice that the ninth metric doesn't come from QR analytics at all. That's deliberate, not an oversight: a scan is only half a story, and the platform that generated the code has no visibility past the redirect. UTM parameters are what carry the placement's identity across that boundary so your own site's analytics can pick the story back up.
Total vs unique: the most misread pair in QR reporting
These two numbers get conflated more than any other pair on this list, and the gap between them is where the actual information usually is. A large gap can mean two very different things: people genuinely returning to a code on purpose, which is a good sign on something like a menu or a reference document, or people scanning repeatedly because the first attempt didn't work, which is a bad sign wearing a good sign's clothes. The two situations produce an identical number and opposite conclusions, so the ratio alone is never enough. Total scans vs unique scans walks through how to tell them apart from the time series shape alone, without any extra tooling.
Two "metrics" that are actually vanity numbers
A raw scan count with no denominator. "Twelve thousand scans" sounds like a result. Without knowing how many people had the opportunity to see the code at all, it's not a rate, a conversion figure, or evidence of anything, it's just a count. The same twelve thousand scans is a disappointment on a packaging run of ten million units and a remarkable result on a standee that stood in one shop for a week. Report the rate, or report the context alongside the number, or don't report the number.
A city list presented as reach. "Scanned from fourteen cities" is the geography metric doing the opposite of its job. Thirteen of those fourteen might be a single scan each, probably from someone forwarding a link rather than genuine regional demand. Geography is useful as a ranked, weighted breakdown that tells you where to focus. As a badge of how far a code "travelled", it tells you nothing you can act on.
The test for whether a number belongs in a report is the same test as the one for the nine metrics above: name the decision it's supposed to change. If nothing changes whichever way the number comes out, cut it.
A leaderboard of codes with no context for what each one was for. Ranking twenty codes by raw scan count and presenting the top five as "best-performing" treats a packaging code seen by ten million shoppers and a business-card vCard seen by forty as comparable, because both are QR codes. They're not comparable placements, and stacking them on one leaderboard manufactures a story about winners and losers that the underlying numbers never supported.
Why the ninth metric is the hardest one to trust
Post-scan conversion, the metric that matters most, is also the one most likely to under-report, for a reason that has nothing to do with QR codes: cookie consent. Where a consent banner defaults to declining non-essential tracking, as good privacy practice increasingly requires, a meaningful share of visitors will never be counted by whatever analytics tool sits on the destination page, even though they scanned, arrived, and possibly converted. That's not a bug in your setup. It's consent working as intended, and it means your post-scan numbers should be read as a floor, not a precise count. Server-side, first-party measurement on your own site narrows this gap; it doesn't close it entirely, and no honest report should imply otherwise.
Reading one campaign end to end
Here's how the nine metrics fit together in practice, using an illustrative set of numbers rather than measured data from any real campaign, since the reasoning is the point.
A dynamic code sits on a shelf-talker for a limited product run. Over an eight-week placement, it logs a total of 3,400 scans against 2,150 unique scans, a repeat-scan ratio of roughly 37 per cent. The time series shows a sharp climb in the first two weeks, a plateau through the middle, and a gentle decline toward the end, which is the shape of a placement doing its job and gradually exhausting the shoppers who pass it, rather than the flatline of a placement nobody notices. Scans cluster heavily between early evening hours on weekdays and mid-afternoon on weekends, matching typical footfall patterns for the store type rather than anything about the code itself. Geography concentrates in two or three metro areas where the product is actually stocked, which is a sanity check passing rather than a discovery. Device data skews heavily toward one operating system, which by itself changes nothing, but combined with a heavy landing page would be the signal to lighten it before the next run.
None of that is the number that matters most. The number that matters most is how many of those 2,150 unique visitors completed the action the shelf-talker was there to drive, tracked on the destination site itself through the UTM parameters the code carried. A campaign with excellent scan numbers and poor post-scan conversion is a landing-page problem wearing a placement's clothes, and only the ninth metric, the one QR analytics doesn't report, can tell the two apart.
Put the two reports side by side and the difference in what they justify becomes obvious. The QR platform's numbers justify keeping or dropping the shelf-talker itself: is it getting noticed, is that attention holding up over eight weeks, is it concentrated where the product actually sells. The site's own numbers justify everything downstream of the scan: whether the landing page did its job, whether the offer was worth the print run, whether to repeat the mechanic on the next product. A manager asking "did the QR code work" is usually really asking the second question, and it's the one number on this list that the QR platform was never going to be able to answer alone.
What this means for your next campaign
Report total and unique together, never one alone. Attach a denominator or comparison to volume before it goes in front of anyone who'll act on it. Read time-of-day and day-of-week patterns from the time series rather than expecting a separate chart for each. Treat geography and device data as sanity checks and planning inputs, not as precision instruments. Record the numbers you'll need before the retention window purges them, rather than assuming they'll still be there when the quarterly report is due. And build the post-scan step into your own site's tracking before the campaign launches, knowing it will under-count by design, because it's still the only one of the nine that answers the question everyone actually asked for: did this work.
Set this reporting up once, per code, before the first placement goes to print, and every campaign after it becomes a comparison rather than a fresh guess.
Whichever placement you're measuring, where you put the code in the first place still does more to determine these numbers than any dashboard will.
When one number should worry you more than a low one
A scan-rate number on its own, high or low, means less than most reports imply, because it has no fixed benchmark to compare against across placements and channels. What a good QR scan rate looks like, by channel sets out honest ranges and the denominator each one assumes, which matters more than the number itself.
See exactly which of these nine metrics get reported, and how they're presented per code.
Straight answers
Does QR code analytics tell me who scanned the code?
No. A scan is logged as an anonymous request: a timestamp, an approximate location, and a device type. Nothing identifies the person unless the destination page itself asks them to log in or fill in a form after the redirect. Treat every scan as anonymous by default.
Why do my total and unique scan counts differ?
Total counts every scan; unique estimates the number of distinct scanning devices or sessions. The gap between them is repeat scanning, which can mean genuine repeat interest (a menu people return to) or a landing page failing and people retrying the same code.
Can I export raw QR scan data to build my own dashboard?
Not directly. Scan analytics are reported per code within the dashboard itself, rather than as a downloadable export or a ready-made campaign-level rollup across several codes. If you need cross-campaign reporting, the practical workaround is to record each code's numbers manually, on whatever cadence you already report on.
How long is scan data kept before it's deleted?
Scan data is kept for a defined retention period and then purged automatically. That's good practice for data minimisation, but it means any number you'll need for a later report should be recorded before the retention window closes, not pulled up after.
If I print the same QR code in five different places, can I tell which one drove a scan?
No. Analytics are reported per code, not per placement, so one code used in five places produces one merged set of numbers. Use a separate code for each placement, or vary the destination's UTM parameters, if you need to know which one is working.
-
City-level IP geolocation accuracy (roughly 20–75%, vs over 99% at country level) and mobile-network IP volatility, self-reported by IP geolocation provider MaxMind
https://www.maxmind.com/en/geoip/ip-geolocation-accuracy