
How to track a print campaign with QR codes
Track a print campaign with QR codes: use dynamic codes to count every scan, attribute results by placement, and prove print worked. Here is how to set it up.
ScanKit · Organization
· 9 min read
Print has always had a measurement problem. You can count how many flyers you handed out and how many posters went up, but the moment they leave your hands the trail goes cold. Online, every click is logged. Print, by tradition, tells you nothing. A QR code is the bridge, and for an agency it means a print campaign can finally answer the question every client asks: did it actually work? This guide walks through the whole setup, from the redirect that makes a scan countable to the design choices that decide whether anyone scans at all.
Why print was always so hard to measure
A poster cannot tell you anyone looked at it. A flyer cannot report that it sent someone to a website. For years the workarounds were vanity URLs, dedicated phone numbers, and promo codes, and all of them leaked. People mistype URLs, ignore phone numbers, and lose the flyer before they get home. Most of the response went uncounted, so print got judged on gut feel instead of numbers. A QR code takes that friction out. Point the phone, one tap, you are on the page. And if the code is dynamic, that tap gets recorded.
How a QR code turns a flyer into a measurable channel
A dynamic QR code does not fire the phone straight at your landing page. It goes through a redirect you control first, then forwards on. That half-second hop is where the measuring happens: the scan is logged before the visitor ever sees the page. A static code skips the hop entirely, which is why it can never be measured. That distinction is worth understanding before you print anything, and it is the whole subject of dynamic versus static QR codes.
So a stack of flyers stops being a black box. You can see how many got scanned, when, and whether interest built or fizzled over the run. Print becomes a channel you can put in the report next to paid and organic, instead of the line everyone hand-waves past.
Set it up in five steps
The mechanics are quick. Getting the structure right at the start is what makes the data worth reading later.
- Use a dynamic code, always. A static code cannot be measured and cannot be fixed after printing. A dynamic one records every scan and lets you repoint it later, which on a printed asset is the difference between an experiment and a gamble.
- Give every placement its own code. If the flyer, the poster, and the mailer share one code, you learn that the campaign got scans. You do not learn which piece did the work. A separate code per placement, all pointing at the same page, lets you compare them and spend the next budget where the scans actually came from.
- Name and group the codes before you print. "Code 47" means nothing in a client deck. "Spring flyer, in-store" means everything. Name each code for its placement and group them by campaign up front, and the analytics arrive already sorted the way the report needs them.
- Tag the destination so it reaches Google Analytics. By default GA4 treats a QR visitor as if they typed the address by hand, so the whole channel vanishes into direct traffic. Add UTM parameters to the destination URL (
utm_source=flyer,utm_medium=qr,utm_campaign=spring-sale) and the scans show up as their own line you can report on. Keep the values lower case and consistent, because GA4 readsFlyerandflyeras two different things. - Send each scan somewhere relevant and fast. A scan is a warm lead who just acted on a specific message. Drop them on a generic homepage and you waste it. Match the page to what the printed piece promised, make sure it loads fast on a phone, and the scan is far more likely to turn into something real.
Design the code so it actually scans
A perfectly tracked code is worthless if nobody can scan it. Most failed QR campaigns fail right here, on physics and design, not on strategy. A handful of rules cover almost all of it.
Size it for the scan distance
The working rule of thumb is ten to one: a code should be about a tenth as wide as the distance it will be scanned from. A flyer or business card read at arm's length needs roughly two to three centimetres. A poster scanned from a metre or two wants ten centimetres or more. A billboard read from across a forecourt has to be measured in feet, not inches. When in doubt, go bigger. A code that is slightly too large costs nothing; one that is too small costs you the whole scan.
Leave the quiet zone
A QR code needs a clear margin of empty space around it, four modules wide on every side, where a module is one of the small squares. The format's inventor specifies it, and scanners rely on it to find where the code begins and ends. Crop the code tight against text or artwork and a lot of phones simply will not see it. If the code sits on a busy background, give it more room, not less.
Keep it dark on light, with real contrast
Scanners read brightness, not colour. The dots must be clearly darker than the background, and the contrast needs to be strong, in the region of forty percent or more. That clever inverted look, light dots on a dark field, breaks on a lot of phones because many readers will not flip it. A deep brand colour on a pale background is fine. Pale grey on white, or a busy gradient, is asking for trouble.
Pick the right error correction
QR codes carry redundant data so they still scan when slightly damaged or dirty. There are four levels, from about seven percent recoverable up to about thirty. Medium is the sensible default for clean indoor print. Step up to the highest level when the code will live outdoors, take handling, or carry a logo in the middle, because to a scanner a logo is damage the correction has to absorb. Keep any logo small, centred, and clear of the three corners.
Give people a reason to scan
A bare code with no words next to it underperforms every time. Tell people what is behind it. "Scan for the menu," "Scan for 20% off," "Scan to watch the demo" all beat a silent square or a generic "scan me," because they answer the only question the passer-by is actually asking: what is in it for me?
Test before the print run
Print one proof at final size, put it where the real piece will live, under the same light and behind the same glass if there is glass, and scan it with a few different phones. Five minutes here saves a five-thousand-piece reprint. This is the single most skipped and most valuable step in the whole process.
What the data tells you, and what it doesn't
Be straight with clients about both sides.
What you get:
- Scan counts per piece, over whatever window you care about.
- The shape of the response, whether that is a launch spike, a slow burn, or a weekend rhythm.
- Rough context: device and operating system, and broad city-level location if you switch it on.
What you don't:
- Who scanned. A scan is anonymous, a device and an estimated location, never a name.
- Proof of a sale on its own. For that you follow the UTM link into Google Analytics and watch what the visitor did after the page loaded. The scan count and the on-site behaviour together tell the whole story; either one alone tells half.
Reading the results
The story is almost always in the timing and the comparison, not the headline total. A spike in launch week says the creative landed. One placement beating the rest three to one tells you where the audience actually is. A code still pulling scans weeks later is an evergreen worth reprinting. That is the narrative clients pay for, and the scan data hands you most of it. If you want the full method for turning scans into a report a client will actually read, that is its own subject: which scan metrics matter, and how to report them.
The reprint problem, gone
Because the code is dynamic, nothing is ever locked in. The landing page moves, the offer ends, you want to stretch the run another few weeks, so you repoint the code and every printed piece updates at once. No second print run. The flyers keep working out in the world while you quietly change what they do. Here is exactly how, and when, to change a code's destination without reprinting.
Frequently asked questions
Can you track a printed QR code?
Yes, if it is a dynamic code. A dynamic code routes each scan through a redirect that records it, so you see counts, timing, device, and rough location. A static code sends the phone straight to the destination with nothing in between, so there is nothing to count.
Do people need a special app to scan?
No. Every current iPhone and Android reads QR codes straight from the built-in camera, no app required. That is most of why the format came back: the friction is gone.
Should a print campaign use a static or dynamic code?
Dynamic, for anything you want to measure or might ever need to change. Static is only sensible for a permanent link that nobody needs to track, which on a campaign is almost never the case.
How do I see QR scans in Google Analytics?
Tag the destination URL with UTM parameters before you generate the code, then look under Acquisition, then Traffic acquisition in GA4, and filter to your qr medium. The scans arrive as their own source instead of disappearing into direct traffic.
The short version
A dynamic code is the difference between hoping the print worked and proving it did. Use one code per placement so the numbers compare, name them so the report writes itself, tag the destination so the scans reach your analytics, and design the code so people can actually scan it. Do that once, and print stops being the line you defend on gut feel and becomes the one you defend with a chart.
Keep reading

· 14 min read
How big should a QR code be? Print size, contrast, and the specs that make it scan
How big should a QR code be, and why do printed codes fail to scan? A practical guide to QR code size, quiet zone, contrast, error correction and file format, with a size-by-placement guide and a two-minute test that saves the print run.
Read more
· 9 min read
QR code analytics: which scan metrics matter, and how to report them
QR code analytics are more than a scan count. Here is what each scan metric really means, which numbers drive decisions, how to connect scans to sales with UTM and GA4, and how to turn it into a client report that reads itself.
Read more