"Trackable QR code" is a slightly misleading phrase. No QR code is trackable. What is trackable is the redirect a dynamic code points at — and everything you can and cannot learn follows from that one fact.
What makes a code trackable
A static code encodes your destination directly. The phone reads the pattern and goes straight there. Nothing sits in between, so nothing counts anything. This is not a limitation a better tool can fix; it is how the format works.
A trackable code encodes a short link you control. The scan hits your redirect service, which logs what the HTTP request reveals and then forwards the visitor. The tracking is a side effect of the detour.
That detour costs a few hundred milliseconds and buys you every number in your dashboard.
What a scan record actually contains
An HTTP request carries a limited, specific set of information. Understanding it prevents both disappointment and over-claiming.
Available Not available
Exact timestamp Identity of the person
Device type and operating system GPS position
Approximate location from IP Reliable repeat-visitor detection
Which code was scanned Behaviour after leaving your site
Browser and language Anything if the scan is abandoned
Two points deserve emphasis because vendor material routinely blurs them.
Location is derived from IP address, not GPS. On wifi it usually resolves near the actual place. On mobile data it can resolve to the carrier's gateway, sometimes a different city entirely. Treat it as directional, never as a map pin.
"Unique scans" are an estimate. Without a cookie or a login there is no reliable way to distinguish one person scanning twice from two people scanning once. Providers infer it from IP and user agent, which is a guess that fails on shared networks and succeeds by accident elsewhere.
Making codes genuinely comparable
The most common setup failure is one code for an entire campaign. It produces a single number with no decision attached to it.
The alternative costs nothing extra:
One code per physical placement — not per campaign, not per channel.
Names describing the placement, not the campaign. counter-store-3 is still meaningful in six months; spring-b is not.
Distinct UTM parameters per placement so the trail continues into GA4.
The distributed quantity recorded alongside each code.
That fourth item converts scans into a scan rate, and only the rate is comparable. Two hundred scans is a strong result from 250 table cards and a poor one from 10,000 flyers.
Where the numbers stop matching
Scan counts and web analytics sessions will disagree, typically by 10 to 30 percent, with scans higher. This is normal and has three causes: people who scan and close before the page loads, tracking prevention and ad blockers suppressing the analytics hit, and bots or link previewers touching the redirect.
A gap above roughly half usually means something is wrong on the destination — most often a slow page or a redirect chain. Treat the ratio as a diagnostic rather than an annoyance.
Static codes and the partial workaround
If a code is already printed and static, you are not entirely without options. Encoding a URL that carries UTM parameters lets web analytics attribute the session to that campaign.
What this cannot do is confirm the visit came from a scan. Anyone typing or sharing that URL is counted identically. And separating placements requires a distinct URL per placement, which for already-printed material is not possible. It is a partial measure for a single surface, not a substitute.
Privacy is part of the setup, not an afterthought
Scan logs contain IP addresses, which are personal data under GDPR. Providers differ substantially: some store raw IPs indefinitely, some hash them, some truncate the last octet, some discard them once a country has been resolved.
If you operate in the EU, get that answer before choosing a provider, because it determines what has to appear in your privacy notice and what your retention period is. Respecting the Do Not Track header costs a small amount of precision and removes a compliance question from a marketing metric.
A setup that produces decisions
Start with one placement you already have in print. Give it its own dynamic code, its own UTM combination, and write down how many units are in circulation. Measure for two weeks without changing anything.
You now have a scan rate that applies to your business rather than to an industry average. Every future placement gets compared against it, and the comparison is the thing that changes decisions — not the raw count.
Use a measurement log, not memory
Keep one row per code with its destination, placement, launch date, number of pieces distributed and planned decision. Then review the row on a fixed date: keep, move, change the CTA or retire it. This small record prevents a familiar failure mode: seeing a dashboard total months later and no longer knowing what physical object created it.
Do not optimize every metric at once. First establish that a placement is scanned. Then improve the landing page or the offer if scans do not become useful visits. Separating those questions stops a weak poster from being blamed on a perfectly good destination, or the reverse.
For the full measurement workflow including print campaigns, see the QR code tracking guide. For the underlying difference between the two code types, see static vs dynamic QR codes.

Top comments (0)