QR campaign tracking by code, not people
SmartQRCode editorial · Updated October 2026
QR campaign tracking by code means each printed object gets its own hosted short code. Totals count scans, not people. Country and device come from headers. A Canva static file cannot answer how the flyer did, and it is still the right file when you will never edit or count.
How qr campaign tracking by code is counted
Keep one short code per object. Remember scans are not people. Read country from request headers. Classify device type from user agent.
The hop has to hit a server. Redirect and landing-page types do. Wi-Fi does not: it is not trackable and not editable after printing. If the campaign is a guest network card, you will not get a series.
Each scan is a row. The same thumb twice is two scans. That is D120 and it is the number merchandising usually wants, even when they say "people." Unique figures, where they exist, hash owner, IP, and user agent. They are not a CRM match. Privacy detail is QR analytics privacy scope.
UTMs belong on the hosted destination. They ride along after the 302. They do not densify the printed pattern. They also do not split this product's scan total by physical object. If the question is "which endcap," mint two codes. If the question is "which ad set in GA4," use a UTM QR code parameter plan. Smart routing can split one printed code by rule; that is a different lever, covered in enterprise QR smart routing.
Paid options are $1.99, $29, $97, and $197. We do not sell an unpaid tier. The generator faces are tracked QR codes, the website URL generator, and dynamic QR codes. Channel splits at launch sit under product launch placements.
How to give each placement its own short code
Name the physical object first. The code is a label for that object.
- List every distinct printed thing you need a number for: SKU, endcap, insert, vehicle, language.
- Create one hosted URL type per line. Do not reuse a short code across two objects you hope to compare.
- Put campaign parameters on the destination, not in a static payload, so the pattern stays short.
- Export SVG or 300 dpi PNG or PDF at the size it will appear. Do not screenshot /qr-preview.
- Print at least 2 cm across at 30 cm with a four-module quiet zone. Larger for aisle or pavement.
- Proof-scan each code. Confirm the destination and that a row appears.
- Keep a sheet that maps short code to object. Analytics will not infer "left endcap" from a colour.
- When the destination changes, edit the hosted URL. Reprint only if the encoded host must change.
one short code per object is the rule that makes the rest of the report intelligible.
What country and device actually mean
Country from request headers is a coarse geography. It is not a store visit and not a GPS trace. A VPN in another country is that other country. Do not brief a board with "shoppers in France" if you mean "requests whose edge header said FR."
Device type from user agent is mobile, tablet, or desktop as classified on the scan path. Tablets are not phones. A report that once called iPads mobile will not match a routing rule that says tablet. Trust one classifier.
Analytics cannot see the scanner's name or email. If a stakeholder asked for that, refuse the brief rather than stretching F63.
Unique scanners versus raw scans
Raw scans are the operational number: how often the hop ran. Unique scanners versus raw scans is a second number with a caveat. One office network can look like one visitor. One phone that changes network can look like two. Hashes are per owner, so the same phone on two tenants is two unrelated values.
Older rows without a hash cannot be backfilled into unique. A panel that says zero identified scans may mean the hash was not recorded yet, not that the campaign had no people.
Do not divide unique by raw and call it a "quality score." It is an approximation with those failure modes.
Tracking failures that mix two posters
Two codes in one camera frame: the reader typically returns one. Adjacent tent cards produce "it scanned the wrong campaign." Separate them.
Two designs of the same static URL: you cannot tell which design was scanned. D123 wants different hosted destinations or different codes.
Wi-Fi on the same job as a tracked URL: one is silent. The other is not. Do not average them.
A provider pause zeros new scans while the art still looks live. F91 is the outage mode for every hosted counter.
How to brief finance without promising people
Put two columns on the weekly sheet: scans, and a footnote that scans are hops. If someone wants unique, add a third column with the caveat about office NAT and missing hashes. Do not present unique divided by scans as engagement.
Name the object in the same sheet: short code, SKU, location, language. QR campaign tracking by code dies in meetings when the series is called "the QR" as if there were one.
If two agencies ran inserts in the same week, they need two codes. Sharing one "to keep the dashboard clean" mixes their invoices. Clean dashboards that lie are more expensive than extra rows.
UTMs on the destination answer a web-property question. They do not replace the short-code column. If finance lives in GA4, still keep the scan series. The 302 can fail while GA4 still receives other traffic from the same campaign name used on ads.
Wi-Fi cards in the same pack are a separate, silent channel. Label them so nobody asks why the network table tents have no chart.
Seasonal reprints should keep the same short code when the object is the same endcap with a new skin, if you want a continuous series. A new code for a new skin is correct when the question is which skin won. Write the choice. Defaulting to a new code every time fragments the chart until nobody trusts it.
If a third party hosts a microsite that 301s, your 302 still lands, then their 301 freezes. The scan row exists. The shopper may not. Debug destination cache before you blame the short code. QR campaign tracking by code measures hops you control, not every hop after you.
Keep a voided code in the lab that is never printed. Use it to train new staff on analytics without polluting a live SKU. Country from request headers on a lab scan from the office will look like the office country. Say that in the training so nobody thinks the campaign is only local.
A poster that sits next to a paid search ad with the same campaign name will mix in GA4 if UTMs collide. Give the printed object its own utm_content even when the short code already isolates the scan series. Two systems, two labels, one SKU map.
When an uncounted poster is honest
A one-night event, a personal project, a URL that will never move: Canva or another free static generator. QR campaign tracking by code would be a server you do not need.
A national insert with a finance meeting on Friday: mint one hosted code per object, size it, and keep the resolver up. Counts will be scans. They will not be names.
Questions this raises
Country is inferred from request headers, not from a GPS chip in the ink. Device type comes from the user agent. Neither is a name, email, or precise location.
Raw scans count every successful hop. The same person scanning twice is two scans. Unique figures, where they exist, are a keyed hash per owner, not a login.
When you will never change the URL and do not need a count. A Canva one-off is the right file. QR campaign tracking by code requires a hosted type.
No if you want to know which design was scanned. Print-run tests need different hosted codes, not two stylings of the same static URL.
UTMs on a hosted destination feed the same web property. They do not split scan totals by physical object. Use a second code when the question is which carton was scanned.
Keep going
The tools and playbooks this post refers to, one click away.
Make the code this post is about
$1.99 for 7 days, then a paid plan. Pick a type, brand it, and edit the destination whenever you like, even after it is printed.