qr code scan tracking
How I set up QR code scan tracking
A practical QR code scan tracking workflow for printed campaigns: one campaign per placement, clean UTM links, proof scans, and readable reports.
Updated 2026-07-09
QR code scan tracking starts before the QR code is printed. I decide what the printed code is supposed to prove, then build the destination and campaign record around that one job.
For most local campaigns, I want to know which printed placement was scanned and what happened after the scan. That means the QR campaign needs its own short link, and the destination usually needs campaign parameters too.
Create one tracked code per placement
Do not reuse one code everywhere
The scan count is only useful when I know where the code was printed. A counter sign, table stand, direct-mail card, receipt footer, and window sticker should not share the same tracked QR code if I need to compare them later.
I name the campaign after the physical placement: Orchard counter sign, July flyer, front-window review card, or table tent A. The name is not for the customer. It is for the person reading the report two months later.
Use a short redirect URL
The printed QR code should stay clean
A dynamic QR code stores a short URL in the symbol. When someone scans it, the short URL records the scan and redirects to the current destination. That keeps the printed symbol cleaner than encoding a long URL with tracking parameters directly.
DENSO WAVE documents QR Code versions from Version 1 through Version 40. Higher versions add more modules. If the printed size stays the same, a denser code gives each module less room, which makes the print proof more important.
Add campaign parameters to the destination
Separate scan tracking from website analytics
The QR platform can count scans. The website analytics tool can report sessions, conversions, and behavior after the redirect. I use both because they answer different questions.
Google Analytics supports custom campaign URLs through parameters such as utm_source, utm_medium, and utm_campaign. For a printed QR placement, I usually use utm_source=qr, utm_medium=print, and a campaign name that matches the printed asset.
If I have several versions of the same campaign, I use utm_content for the placement or creative: counter_sign, flyer_front, or table_tent_a. I keep the values lowercase so the reports do not split the same campaign into separate rows.
Save the print record
Tracking needs context
- Campaign name and short URL.
- Final destination URL.
- UTM values used on the destination.
- Printed placement and quantity.
- Print date and design file.
- Who approved the proof scan.
Without that record, a scan chart is easy to misread. A spike might be a successful campaign, a staff test, a reprint, or one person scanning the same code several times while checking a layout.
Test the scan path
Check the real printed proof
I test the printed proof before the full print run. The browser preview only proves the generated image exists. The printed proof checks size, contrast, quiet zone, paper finish, distance, and the actual camera path.
DENSO WAVE describes the quiet zone as the clear margin around the QR symbol and says a QR Code requires a four-module margin on every side. I keep text, borders, logos, folds, and trim edges out of that space.
After scanning, I check the redirect destination, the campaign record, and the final URL in the browser. If UTM parameters are part of the setup, I confirm they survive the redirect.
Read scan counts carefully
A scan is not a conversion
A scan tells me someone opened the QR link. It does not prove that the person bought, booked, reviewed, or even waited for the page to finish loading.
The useful report compares placements. If the front counter sign gets scans and the window sticker gets none, I can move the sticker, change the call to action, or stop printing that placement.
My default setup is simple: one dynamic QR code per important placement, a clean campaign URL, a saved print record, and one proof scan from a phone that did not create the campaign. That is enough to track QR code scans without making the workflow heavy.