One of the oldest problems in marketing is connecting offline touchpoints, like a print ad, a billboard, or product packaging, to actual online results. Before QR codes were common, marketers relied on vanity URLs, unique phone numbers, or promo codes to approximate this connection, all of which required extra effort from the person seeing the ad. QR codes offer a more direct path: a scan is a concrete, trackable action that bridges the physical and digital worlds, and there are a few different ways to capture and measure that bridge depending on how much detail you need.
The attribution problem QR codes solve
Traditional out-of-home and print advertising has always struggled with a basic measurement gap: you know the ad ran, and you know your overall sales or web traffic changed, but connecting the two definitively is difficult without a clear mechanism tying the physical exposure to a digital action. QR codes close much of that gap by giving the viewer a single, trackable action, the scan, that leads directly to a specific, identifiable destination.
This is valuable across a wide range of formats: direct mail, billboards, product packaging, transit ads, flyers, and in-store signage all benefit from having a QR code that funnels interested viewers to a specific, measurable landing page rather than relying on them to remember a URL or search for your brand later. Even when only a fraction of viewers actually scan, that fraction gives you a real signal about which placements and creative are driving engagement.
It's worth being realistic that not everyone who's influenced by an ad will scan a code; some will remember the brand and search for it later, some will visit a physical location directly, and QR scans capture only one slice of the overall response. Treat scan data as one useful signal among several rather than a complete picture of a campaign's total impact.
The simplest approach: UTM-tagged static QR codes
For most single-campaign print or packaging runs, the simplest and most cost-effective approach is a free, static QR code that links to a URL with UTM parameters attached, such as tagging the source as the specific placement (for example, utm_source=billboard_mainst) and the campaign name. When someone scans and lands on your site, your existing web analytics tool records that visit with those tags attached, letting you see exactly how much traffic and, downstream, how many conversions came from that specific placement.
This approach requires no special QR features beyond a standard URL code, since the tracking intelligence lives entirely in the UTM parameters and your website analytics setup, not in the QR code itself. It's an efficient way to compare multiple placements against each other, for example seeing whether a QR code on packaging or on in-store signage drove more traffic to the same landing page over the same period.
The main limitation is that UTM tracking only tells you about people who actually completed the visit and were correctly attributed by your analytics tool; it won't tell you the raw number of physical scans, since some scans might fail, some might not load a full page, and ad blockers or privacy settings can occasionally interfere with analytics tracking on the landing page itself.
When you need scan-level detail: dynamic QR codes
If you want to know precisely how many times a code was scanned, regardless of whether the visit converted or was fully tracked by your website analytics, that level of detail comes from a dynamic, editable QR code with built-in real-time analytics, which is a paid feature. Unlike a static code, a dynamic code routes scans through a redirect the platform manages, allowing it to log the scan itself before sending the person on to your destination page, and the destination link can also be changed later without reprinting the code.
This is especially useful for campaigns spread across multiple physical locations, such as billboards in different cities or in-store displays across several retail partners, where a scan map view lets you see which geographic locations are driving the most engagement without waiting on separate analytics setups for each location. It also helps when the destination page itself doesn't have reliable analytics of its own, for instance if it's a third-party page you don't control, since the scan count is captured independently at the QR level.
For recurring or long-running campaigns, dynamic codes also offer practical flexibility: you can update the destination link seasonally, for a promotion, or after a campaign wraps, without needing to reprint packaging, signage, or direct mail that's already in circulation, all while keeping the same printed code in place.
Choosing between the two approaches
For a single print run with a fixed destination and a reasonably well-tracked website, a free static QR code with UTM parameters is usually sufficient and requires no ongoing subscription. This covers the majority of small business and single-campaign use cases well, since the combination of a clean UTM setup and standard web analytics gives a workable picture of performance.
Reach for a dynamic QR code with built-in analytics when you specifically need raw scan counts independent of website analytics, when you're running the same printed materials across multiple campaigns and want to change the destination without reprinting, or when you want a scan location map to compare geographic performance across placements. These needs tend to show up most with larger, recurring, or multi-location campaigns rather than a single flyer or one-time mailer.
It's reasonable to start with a static, UTM-tagged approach for a first campaign and upgrade to dynamic codes once you have a clearer sense of which specific tracking gaps matter most for your particular use case.
Setting up UTM parameters correctly
Keep your UTM naming conventions consistent across every campaign, using the same structure for source, medium, and campaign name each time so your analytics reports stay clean and comparable over months or years. A common structure is utm_source for the specific placement (billboard, flyer, packaging), utm_medium for the general channel type (print, out-of-home, direct-mail), and utm_campaign for the specific initiative name.
Test the full tagged URL yourself before generating the QR code, confirming it loads the correct page and that your analytics tool is correctly picking up the parameters in real time. A small typo in a UTM parameter, such as an inconsistent capitalization or spelling between campaigns, can fragment your reporting and make it harder to get a clean total for a given placement type.
Keep a simple spreadsheet log of every QR code you generate for a campaign, noting the placement, the exact tagged URL, and the print date, so you have a clear record to cross-reference against analytics later, especially for larger campaigns with many different placements running simultaneously.
Common attribution mistakes to avoid
One common mistake is linking every placement in a campaign to the exact same generic URL without any UTM tagging at all, which makes it impossible to distinguish later which specific placement, whether a billboard, a flyer, or packaging, drove a given visit. Always tag distinctly, even for placements you assume will perform similarly, since the actual data often surprises you.
Another mistake is linking to a landing page that doesn't match the messaging or offer shown in the physical ad, which creates a disjointed experience and can suppress conversion even when the scan itself succeeded. Keep messaging consistent from the physical touchpoint through to the landing page so the person who scanned feels like they've arrived at the right place.
Finally, avoid over-interpreting a low scan count as a failed campaign without considering the broader picture; some campaigns primarily build brand awareness rather than driving immediate scans, and a low QR scan rate doesn't necessarily mean the placement had no impact on brand recall or later direct visits and searches.
Reporting on real-world campaign performance
When reporting results to stakeholders, present QR-driven traffic and conversions alongside other available signals, such as overall website traffic during the campaign period, in-store foot traffic if relevant, or direct search volume for your brand name, rather than treating scan data as the sole measure of success. This gives a more honest, complete picture of how a campaign performed across the different ways people might have responded to it.
Compare performance across placements using consistent metrics, such as scans or tagged visits per thousand impressions where you have exposure estimates, to fairly judge which formats and locations are worth repeating in future campaigns. This is particularly useful when comparing very different placement types, like a large billboard against a small flyer, where raw scan counts alone wouldn't account for the very different audience sizes each format reaches.
Keep a running log of which combinations of placement, design, and offer performed best across campaigns over time, since this kind of institutional knowledge compounds and makes each subsequent campaign's targeting and creative decisions more informed than the last.
Frequently asked questions
Can a free, static QR code track how many times it was scanned?
Not directly. A static code only encodes a fixed link, and any tracking has to come from parameters added to that link plus your website's own analytics tool recording the resulting visit. For raw scan counts independent of the landing page, a dynamic QR code with built-in analytics is needed, which is a paid feature.
What's the difference between UTM tracking and dynamic QR code analytics?
UTM tracking measures visits that reach and are recorded by your website analytics after a scan, while dynamic QR code analytics count the scan itself at the code level, before the redirect even happens, giving a more complete picture that isn't affected by landing-page tracking gaps.
Do I need a dynamic QR code for a single flyer campaign?
Usually not. A free static QR code with UTM parameters on the destination link is typically enough for a single, one-off campaign with a fixed destination and a well-tracked landing page.
Why might my QR code scan count seem low even though the campaign felt successful?
Many people exposed to an ad don't scan the code at all, instead remembering the brand and visiting or searching later through other channels. Scan data captures only one slice of a campaign's total impact, so it's best considered alongside other signals like overall traffic and brand search volume.