Skip to content

How to track QR code scans

11 min read

To track QR code scans, you need a dynamic QR code: it goes through a short link that counts every scan, and you read the numbers in the code's stats. To also see what people do on your website afterward, add UTM tags to the link and read them in Google Analytics 4.

In short

  • A static code can't count scans. The most you can track is visits to your own site, if you add UTM tags before printing.
  • A linqr code counts scans and unique scans on the Free plan; cities, the heatmap, a year of history and CSV export come with Pro.
  • UTM tags show visits from the code in GA4, plus what people did next, like a sign-up or a purchase.
  • Scans and GA4 sessions rarely match. Compare ratios and trends, not exact numbers.
  • One code per placement is the simplest way to see which postcard, sign or sticker works.
Contents
  1. 1.Can you track a static code?
  2. 2.Built-in stats of a dynamic code
  3. 3.How to track QR code scans with UTM tags and GA4
  4. 4.Why scans and GA4 sessions differ
  5. 5.Total vs unique scans
  6. 6.One code per placement
  7. 7.Privacy basics
  8. 8.Questions

Can you track a static code?

Not directly. A static code stores the full web address in its pattern, so the phone opens the page with nothing in between. There's nobody along the way to see the scan and log it.

If the site is yours, you can add UTM tags to the link before printing and see visits from the code in Google Analytics as their own campaign. That counts visits, not scans: someone who closes the tab before the page loads won't show up.

Not sure what kind of code you have? Scan it and look at the address your phone shows. Your full website address means it's static; a short link from a QR service (like onsonara.com/q/…) means it's dynamic.

Static QR code with the address of this guide
This code is static: it holds the full address of this guide, so your phone shows the long page address, not a short link. Nobody can count its scans.

Built-in stats of a dynamic code

A dynamic code contains a short link. The scan hits a server first, which logs it and redirects the phone to your address right away. That's why the counter works on any phone and for any destination. linqr is a free QR code generator where every code is dynamic and has its own stats. Here's how to check them:

  1. Open My codes

    Above the list: scans and unique scans across all your codes for the last 30 days, plus a 14-day chart next to each code.

  2. Click the code's name and choose Stats

    At the top: scans, unique scans and the change vs the previous period. Below: the chart, countries and devices.

  3. Change the range

    7 days shows scans hour by hour, 30 days day by day. Pro adds 90 days and Year, plus cities, operating systems, browsers, languages and the heatmap.

  4. Download the data on Pro

    Export CSV saves every scan in the range as its own spreadsheet row.

For everything on Free and Pro, see QR code tracking. A quick test before printing: scan the finished code and refresh the Stats tab, and the scan appears within seconds.

How to track QR code scans with UTM tags and GA4

UTM tags are short labels at the end of a link that tell Google Analytics where a visitor came from. Google recommends always using three: utm_source, utm_medium and utm_campaign. They only help when the link leads to a site with GA4 installed, so tagging an Instagram profile or a Google review link gets you nothing.

  1. Pick your names

    For example utm_source=postcard, utm_medium=qr, utm_campaign=fall_sale. Stick to lowercase and one spelling: Google's help says values are case sensitive, so “Postcard” and “postcard” show up as two sources.

  2. Add them to the link

    Put a question mark after the page address and separate the tags with &, all as one string with no spaces: yoursite.com/sale? utm_source=postcard &utm_medium=qr &utm_campaign=fall_sale. If the address already has a question mark, start with &.

  3. Paste the whole link into the generator

    In linqr, paste it into The link to turn into a QR code. The redirect passes the link and its tags through unchanged.

  4. Check that the tags arrive

    Scan the code and look at the address bar on your phone: the link should end with your tags.

  5. Read the results in GA4

    Go to Reports > Acquisition > Traffic acquisition and switch the table's dimension to Session campaign or Session source/medium. Your campaign shows up under its utm_campaign name.

Changing the link in linqr doesn't reset your stats. For the next campaign, change only utm_campaign in the link: the door hangers you already printed keep working, and GA4 keeps the campaigns apart.

Why scans and GA4 sessions differ

The scan count in linqr is usually higher than the GA4 sessions from the code. That's expected, because the two tools measure different things:

  • A scan isn't a visit. We count the moment the short link opens. If the page loads slowly or someone closes the tab after a second, there's a scan and no session.
  • Cookie consent. If your site asks for consent and a visitor declines analytics, GA4 either collects nothing about them or only models the gap, depending on how consent mode is set up.
  • Ad blockers. Google lists them among the causes of traffic with no known source.
  • Missing UTM tags. Google says visits from links without UTM parameters, including offline documents, can end up as (direct) / (none).

So compare ratios, not exact numbers. If postcard A gets twice the scans of postcard B and clearly more GA4 visits too, you have your answer even when the totals don't match.

Total vs unique scans

A scan is every time the short link opens. A unique scan is a person's first scan of a code in a day. At a taco truck, a customer scans the menu while in line and again at the window, and a friend does the same on their own phone. That's 4 scans and 2 unique.

  • The day runs on UTC, so it resets at 8 p.m. Eastern in summer and 7 p.m. in winter.
  • Unique scans over 30 days are the sum of each day's unique scans. A regular who scans every day adds 30.
  • It's an estimate, not a list of people. We don't store IP addresses, so a phone that switches from Wi-Fi to cellular during the day can count twice.

One code per placement

One code on a postcard, a yard sign and a business card gives you one total and tells you nothing about what works. Make a separate code for each placement and name it after the spot: “Postcard, Maple St.”, “Yard sign, Oak Ave.”, “Counter sticker”. The links can be identical: the code is what gets counted, not the address.

A coffee shop can put one QR code for Google reviews on the counter and another on receipts, then see after a month which one people scan more. A realtor with signs at two open houses sees which street gets attention. Free includes 3 active codes, so you can compare three placements right away. For a print campaign, see our guide to putting a QR code on a flyer.

Privacy basics

Code stats show numbers, not people. We don't store IP addresses or full browser identifiers; we keep the date and time, approximate location, device type, operating system, browser and language. So there's no way to see who scanned a code. With UTM tags and GA4, that's your own site and analytics tool, with your own rules for cookies and consent.

Make a QR code that counts its scans

Paste a link, save the code, and see results in the Stats tab from the first scan. Basic stats are on the Free plan.

Make a trackable QR code

Questions

Can I track a QR code for free?

Yes. On the Free plan every code has a Stats tab with total scans, unique scans, a 7- or 30-day chart, your top 3 countries and a device breakdown. Free includes 3 active codes, with no trial and no scan limit. Cities, operating systems, browsers, languages, the heatmap, a year of history and CSV export come with Pro.

Can QR code tracking tell me the name or phone number of the person who scanned?

No. The stats are anonymous: we don't store IP addresses or full browser identifiers, so there's no way to point to a person. You see how many scans there were, from which countries and on which devices. To hear from the people who scan, send the code to a sign-up form or an offer where they leave their contact details.

Why do my scans and Google Analytics visits not match?

Because they're two different measurements. We count a scan the moment the short link opens; GA4 sees a visit only once the page loads and the analytics script runs. Along the way you lose people who closed the tab, declined cookies or use an ad blocker, and visits without UTM tags can land in direct traffic. Compare ratios and trends instead.

What is a unique scan?

It's a person's first scan of a code in a day. Scan a code three times in one day and you add 3 scans and 1 unique; come back the next day and you add another unique. The day runs on UTC. We count unique scans without storing IP addresses, so the number is an estimate, not a list of people.

Can I track a static QR code I already printed?

Not the scans. A static code opens your page directly, so nothing counts them, and you can't change its link either. If the page is yours, the visits can show up in your analytics, usually mixed in with direct traffic. On the next print run, switch to a dynamic code: a linqr code counts every scan from the first one.

How do I compare two flyers to see which QR code gets more scans?

Give each flyer its own code and name it after the version, like “Flyer A, red” and “Flyer B, blue”. The links can be identical, because linqr counts scans per code, not per address. After a week or two, open Stats for each code and compare total and unique scans for the same range. The Free plan's 3 active codes are enough for a two- or three-way test.

Do bots and link previews count as QR code scans?

Not in linqr. Link previews, prefetch requests and known bots are recognized and left out of the stats, so a short link pasted into a chat app doesn't inflate your numbers. Only real openings of the short link are counted. If you share the short link itself online, clicks on it also count, so use a separate code for print if you want clean numbers.

Can I see which city my QR code was scanned in?

Yes, on Pro. The Cities list in Stats shows approximate locations based on the network the phone uses, not GPS, so a scan can show up in a nearby larger city. The Free plan shows your top 3 countries. We don't store IP addresses, so a location never points to a specific person or address.

Can I see what time of day people scan my QR code?

Yes. On any plan, the 7 days range shows scans hour by hour. Pro adds the When people scan heatmap, which shows scans by day of week and hour over the chosen range and names the busiest slot. That helps with things like staffing a counter or timing a follow-up email.

How far back can I see QR code scan history?

On the Free plan, Stats covers the last 7 days or 30 days. Pro adds 90 days and Year, so you can compare this season with the last one and export the range with Export CSV. Changing the code's link never resets the counts, so the history of one printed code stays in one place.

Do I need Google Analytics to count QR code scans?

No. A dynamic code counts scans on its own: linqr logs each opening of the short link and shows it in Stats, whatever the destination is, even an Instagram profile or a PDF. Google Analytics only helps when the link leads to your own website and you want to see what visitors did there, like a sign-up or a purchase.

Sources

  1. Google Analytics Help: Collect campaign data with custom URLs,
  2. Google Analytics Help: Traffic acquisition report,
  3. Google Analytics Help: Understand (direct) / (none) traffic,
  4. Google Analytics Help: Consent mode on websites and mobile apps,