Back to Blog

How to Track QR Code Scans (Static Tells You Nothing)

You printed a QR code on a flyer, a menu, or a business card, and you have no idea if anyone scanned it. Here's why a static QR tells you nothing, what a dynamic short-link QR actually tracks, and how to wire up scan analytics in ten minutes.

Karan Bhakuni
Karan Bhakuni
Founder, Flyn
GuideJun 25, 202612 min readUpdated Jun 25, 2026
How to Track QR Code Scans (Static Tells You Nothing)

The Uncomfortable Truth About the QR Code You Already Printed

Here is the question that exposes the problem: how many people scanned the last QR code you printed? If you printed a static QR, the honest answer is "I have absolutely no idea," and that will never change. The code is working, people may be scanning it every day, and not one of those scans is recorded anywhere you can see.

This catches out marketers, restaurant owners, event organisers, and small businesses constantly. You generate a QR from a free website, slap it on a menu or a flyer or a table-tent, send it to print, and assume the data shows up somewhere. It does not. A plain QR code is a one-way street: it sends people to your URL and tells you nothing in return.

The good news is that the fix is simple and free, and it does not require a different printer, a different design, or a different camera app. It requires changing what the QR encodes: a tracked short link instead of a raw URL. That single swap turns an invisible code into a measurable channel. This guide walks through exactly why static codes are blind, what a dynamic code captures, and how to set one up.

Diagram showing a phone scanning a QR code, the resulting request passing through a Flyn short link redirect, and the scan appearing as a row in an analytics dashboard with location, device, and time
When a QR encodes a short link, every scan passes through a redirect you control, so each scan is logged with location, device, and time before the user ever reaches your page.

Why "I think it's working" is not good enough

Print is the only marketing channel most teams still run completely blind. You measure every email open, every ad click, every page view, then you spend money on a print run and measure nothing. A QR code is the bridge that lets offline behaviour show up in the same dashboards as your digital channels, but only if the code is built to report back.

Why Static QR Codes Capture Zero Data

To understand why static codes are blind, you have to know what is physically encoded in the pattern. A QR code is just a visual encoding of a string of text. Scan it and your phone reads that string. There is no server in the middle, no log, no counter.

What a static QR actually contains

In a static QR code, the string is your destination URL itself: https://yoursite.com/spring-menu is literally drawn into the black squares. When someone scans it, their phone reads that URL and opens it directly. Your web server might see the resulting page view, but it has no way to know the visitor came from a QR code versus a typed URL, a bookmark, or a link in a text message. The scan, as an event, is never recorded anywhere.

That creates two permanent limitations that no amount of analytics tooling can work around:

  • No scan data. Total scans, unique scanners, where they scanned from, what device they used: none of it exists. The scan event happens entirely on the phone and is gone.
  • No editability. The URL is baked into the dots. If the page moves, gets renamed, or 404s, the code is dead. Your only option is to reprint every asset that carried it.
  • No attribution. Even if the destination page logs the visit, you cannot separate QR traffic from organic, social, or direct traffic without extra tagging the static code cannot carry reliably.

People often assume the QR generator they used is "tracking" things behind the scenes. For a static code, there is nothing to track: the generator drew an image and walked away. Once the PNG is on your flyer, the website that made it has no involvement in any scan.

Watch out

Many "free QR generator" sites produce a static code by default, then upsell "tracking" as a paid add-on that quietly converts your code to their redirect domain. Read the fine print: some revoke that redirect after 30 to 60 days unless you pay, which kills every code you already printed. If the generator's brand name appears in the URL when you test-scan, you do not own the code. The fix is to control the redirect yourself, which is exactly what a short link does.

The Exact Metrics You Can Track on a Scan

Once your QR points at a tracked short link, every scan produces a row of data. Here is precisely what gets captured and what each metric is good for. None of this is available on a static code, and none of it requires anything on the destination page itself: the redirect captures it all.

Infographic of the six signals a dynamic QR records on every scan: total scans, location, device and OS, time of day, and referrer or campaign
The six signals every dynamic QR logs on each scan, none of which a static code can capture.

The six metrics every scan records

  • Total scans. The raw count of how many times the code was scanned. The headline number that answers "is anyone using this?"
  • Unique scans. Distinct devices, so you can separate ten people scanning once from one person scanning ten times. Critical for honest reach numbers.
  • Geographic location. IP-derived, accurate to city level. Tells you where your code is being scanned, which surfaces in which regions are working, and whether a code is being shared far from where you placed it.
  • Device and OS. iOS versus Android, browser, and OS version. Useful for spotting that, say, half your scanners are on an in-app browser that breaks your form.
  • Time-of-day and date. Every scan is timestamped to the second. Bucket by hour and weekday to find peak scanning windows, which is gold for restaurants, events, and retail.
  • Referrer and source. Whether the scan came from the native camera, a lens app, or an in-app browser, plus any UTM tagging you add to the destination.
The difference between a static and a dynamic QR is not the dots on the page. It is whether you are guessing or knowing. A static code makes you the only person in marketing who runs a channel completely blind.

What you can do with this data

Numbers are only useful if they change a decision. Geo clustering reveals where to place your next batch of flyers. Time-of-day peaks tell you when to schedule matched social posts. Unique-versus-total ratios tell you whether a code is reaching new people or just being re-scanned by regulars. Device data tells you whether your lander is breaking for a chunk of your audience. On a Pro plan these breakdowns are charted for you; on the free plan you still get the core counts. To audit where any existing printed code currently lands, run it through the QR Destination Audit, or decode a printed code back to its raw URL with the QR Code Reader.

How to Set Up a Trackable QR Code with Flyn

This is the whole point: making a trackable code is not harder than making a blind one. It is the same number of steps, you just shorten the URL first. Here is the full flow, start to finish.

Five steps from raw URL to tracked scan

  1. Create a free account. Sign up for Flyn so your scans are saved to a dashboard you can return to. You can generate a code without an account, but the analytics live behind the login.
  2. Shorten your destination. Paste the URL you want the QR to open. Flyn returns a short link like flyn.to/menu that redirects to it and logs every hit.
  3. Generate the QR. Open the QR Code Generator, drop your short link into the URL tab, and download the SVG (for print) or PNG (for digital).
  4. Audit before you print. Run the destination through the QR Destination Audit to confirm the page is live, on HTTPS, redirect-clean, and mobile-fast. Catching a dead page on your desk beats finding it on a thousand flyers.
  5. Print, place, and watch. Put the code in market. Open your dashboard and you will see scans appear, each with location, device, and time.

That is it. The code you printed will keep working for years, and if your destination ever changes, you edit the short link instead of reprinting. The same trick powers click tracking on any link, so once you understand it for QR codes you understand it for every link you share.

Pro tip

Always download the SVG version for anything going to a print shop. It is vector, so it scales from a business card to a billboard without pixelation. Reserve the PNG for digital use, like slides, social posts, and email banners, where vector is not required. A blurry, upscaled PNG is one of the most common reasons a printed code fails to scan, which our guide on why QR codes don't scan covers in detail.

UTM Tagging: Make Scans Show Up in Google Analytics

The short link captures the scan in your Flyn dashboard. UTM parameters carry that scan into GA4, Mixpanel, or PostHog as a named channel. Without them, QR traffic lands in your analytics as "(direct)" and is impossible to credit. With them, offline becomes a measurable line item next to your paid social.

What a tagged QR destination looks like

You tag the destination URL, not the short link. A trackable QR destination looks like this:

https://yoursite.com/menu?utm_source=table-tent&utm_medium=offline&utm_campaign=summer-2026

Build these with the free UTM Builder, which blocks the casing typos (Facebook versus facebook versus FB) that silently fragment your reports. Flyn can append UTMs automatically when you fill in the campaign fields at link creation, so you never hand-type them. To check an existing tagged URL parses cleanly before it goes to print, run it through the UTM Parser.

The two-layer tracking model

  • Layer one, the short link, tells you the QR is being scanned: count, geo, device, time. This lives in Flyn.
  • Layer two, the UTMs, tells you what happened after the scan: did they convert, bounce, or buy. This lives in your downstream analytics.

Get both layers right and a scan flows from a flyer all the way to a tracked conversion event, fully attributed. If you want to verify your short links preserve UTMs correctly through the redirect, the UTM Redirect Preservation Checker tests a whole batch at once.

Reading Your Scan Dashboard Like an Analyst

Raw counts are a start, but the real value is in the patterns. Here is how to turn a list of scans into decisions you can defend to whoever signs off the print budget.

Total vs unique: your honest reach number

If a code has 500 total scans but 120 unique scans, you are reaching roughly 120 people, several of whom scan repeatedly (common for menus and schedules). Report the unique number as reach and the total as engagement. Conflating the two is how print campaigns get over-credited and then quietly defunded when someone checks.

Time-of-day patterns

Bucket scans by hour and weekday. A menu QR peaking at noon and 7pm confirms meal times. A transit-poster QR peaking at commute hours tells you when to schedule matched social. An event-badge QR peaking during session breaks tells you when attendees are actually free to engage. These rhythms are invisible without timestamped scan data.

Geographic clustering and the sharing signal

Even a single physical placement produces a spread of scan locations, because people scan, move, and reconnect elsewhere. Clusters far from where you placed the code reveal sharing: someone scanned it, screenshotted it, and sent it to a friend in another city. That is an audience-discovery signal you cannot get from almost any other channel, and it only exists because the redirect logs location.

Cost per scan and cost per conversion

Divide the placement cost by its scans for a cost-per-scan figure, then by its conversions (from your UTM data) for cost-per-conversion. Now a $400 batch of flyers that produced 600 scans and 30 conversions sits in the same spreadsheet as your paid-ads CAC, directly comparable. This is the moment offline marketing stops being an act of faith.

Common Mistakes That Kill Your Scan Data

Most tracking failures are not exotic. They are a handful of avoidable mistakes that quietly zero out your data or make it untrustworthy. Here are the ones we see most often.

A real, scannable QR code on a white card that opens the Flyn QR Code Generator when scanned
A real, scannable code: point your phone camera at this to open Flyn's QR Code Generator and build your own trackable code.

The mistakes, ranked by how often they happen

  • Printing a static code and expecting data. The original sin. If the QR encodes your raw URL, there is nothing to track. Encode a short link instead.
  • One code on every surface. You lose per-placement attribution. Use one short link per physical surface.
  • No UTMs on the destination. Scans land as "(direct)" in GA4 and you cannot credit the channel. Tag every destination with the UTM Builder.
  • A destination that dies after printing. The single most common failure for codes printed six months ago. With a dynamic code you simply re-point the link; with a static code you reprint. Audit destinations quarterly with the bulk health checker.
  • Upscaling a low-res PNG for print. The code prints blurry and fails to scan, so your scan count is artificially low. Use the SVG for print.
  • No quiet zone or weak contrast. Crowding the code or using low-contrast colours breaks scanning on older phones. The fixes are in our QR not scanning guide.

The test that catches most of them

Before any print run, scan your own code with a few different phones and confirm it opens the right page, then check that the scan appeared in your dashboard. If the scan shows up with the correct location and device, your tracking works. If it does not, you almost certainly printed a static code or pointed the QR at a raw URL instead of a short link. For codes already in the wild, decode a sample with the QR Code Reader to see exactly what they encode, and check the live destination with the QR Destination Audit.

Start Tracking the Code You Are About to Print

The whole shift comes down to one decision made before the artwork goes to print: encode a tracked short link, not a raw URL. Do that and every scan becomes a logged event with location, device, and time, and you keep the freedom to change the destination forever without reprinting. Skip it and you ship another blind code into the world and go back to guessing.

You can build the trackable version free in about ten minutes: create a Flyn account, shorten your URL, drop it into the QR Code Generator, audit the destination with the QR Destination Audit, and print. See every scan on a free or Pro plan, browse the full free tool kit, and read the companion guides on dynamic QR codes for print and digital and the QR codes marketing strategy playbook for placement, sizing, and attribution at scale.

Frequently Asked Questions

How do I track how many times my QR code has been scanned?
Point the QR code at a tracked short link instead of directly at your destination URL. Every scan of that short link passes through a redirect server that records the event, so your dashboard shows total scans and timing on every plan, with location and device on Pro. Create the short link for free, drop it into the QR Code Generator, and print. A raw-URL (static) QR cannot be tracked at all because the scan never touches a server you control, so this swap is the entire difference between knowing your scan count and guessing it.
Can a static QR code be tracked at all?
No. A static QR code encodes your destination URL directly into the dots, so when someone scans it their phone opens that URL with no server in the middle to log the event. Your website might record the resulting page view, but it cannot distinguish a QR scan from a typed URL, a bookmark, or a shared link. The only way to track scans is to encode a short link you control (a dynamic QR), so that every scan passes through a redirect that records it before forwarding the user on.
What data does a dynamic QR code capture on each scan?
Every scan of a dynamic short-link QR records six things: total scans, approximate geographic location (IP-derived, city-level), device and OS (iOS or Android, browser, version), the exact timestamp, and the referrer or source. Add UTM parameters to the destination URL with the UTM Builder and those flow into GA4 too, so you can follow a scan all the way to a conversion. On a Pro plan these are charted into geo, device, and time-of-day breakdowns; the free plan still gives you the core counts.
Do I need a paid plan to see QR scan analytics?
No. You can track total scans on a free Flyn account, which is enough to answer the basic question of whether anyone is scanning your code. A Pro plan unlocks the detailed breakdowns: per-scan geo down to city level, device and OS splits, time-of-day charts, and longer data retention. For a single flyer or menu the free counts are often enough; once you run multiple placements and want to compare them or attribute spend, the Pro breakdowns pay for themselves.
Can I change where my QR code points after it is printed?
Yes, if it is a dynamic QR code (one that encodes a short link). Open the link in your Flyn dashboard, edit the destination, and save. The change takes effect on the next scan, and the printed code never needs to change because it points at your short URL, not the underlying page. This is why every printed asset with a lifespan over 24 hours should be dynamic. A static code, by contrast, has the destination baked into the dots, so changing it means reprinting every asset. See our dynamic QR codes guide for the full reasoning.
Why do my QR scans show up as "(direct)" in Google Analytics?
Because the destination URL has no UTM parameters, GA4 has no way to know the visit came from a QR code, so it files it under "(direct) / none". The short link tracks the scan in your Flyn dashboard, but to make scans appear as a named channel in GA4 you must tag the destination URL with UTMs. Build them with the free UTM Builder (for example utm_source=flyer&utm_medium=offline&utm_campaign=summer-2026) and validate them with the UTM Parser before printing.
How do I know which flyer or sign drove the most scans?
Use one unique short link per physical placement instead of the same code everywhere. Create separate links such as flyn.to/menu-window and flyn.to/menu-table, generate a QR for each, and your dashboard will show scans broken out by surface. The QR designs can look identical; only the encoded URL differs. This per-placement attribution is impossible with a static code or with one shared dynamic code, and it is what lets you compare a window poster against a receipt footer and put your next budget where the scans actually are.
How can I check whether a QR code I already printed is being tracked?
Scan it and read what it contains. Decode the code with the free QR Code Reader: if it shows a short link (like flyn.to/...), it is dynamic and trackable; if it shows your full destination URL, it is static and capturing nothing. Then run the destination through the QR Destination Audit to confirm the page is still live, on HTTPS, and mobile-fast. If the code turns out to be static, regenerate a dynamic version pointing at a short link before your next print run.

Ready to try Flyn?

Free plan includes 25 links/month, full analytics, and access to all 30+ free tools above. No credit card required.

Already a member? Log in

Karan Bhakuni
Karan Bhakuni· Founder, Flyn

Karan Bhakuni is the founder of Flyn. He writes about branded links, click analytics, and the link-management tooling growth teams and creators actually need, drawn from building Flyn and reading a lot of user feedback.