QRAnalytica

How Do I Tell Which Flyer Location Brought the Most QR Code Scans?

To track QR code scans by flyer location, give every spot its own dynamic code, then compare scans per flyer placed, not the city map.

Nookesh Karri · 8 min read
Dark cover card with the title 'How Do I Tell Which Flyer Location Brought the Most QR Code Scans?' in white and a lime accent bar

To track QR code scans by flyer location, print a different dynamic QR code for each place you leave flyers, name each code after its spot, and compare the scan counts side by side. Don’t rely on the city map in your dashboard to tell the spots apart. Phone location from an IP address is too rough for that, so the code itself has to carry the location.

Why one QR code can’t track flyer location on its own

A single QR code can’t tell you which flyer location got scanned, because the only “location” it records is a guess from the phone’s IP address. That guess is fine for countries and poor for streets.

MaxMind, one of the big IP geolocation providers, says on its accuracy page that country accuracy is “generally very high, exceeding 99%”. City accuracy drops to 20% to 75%, and it’s better in large, dense cities on home internet.

Phones are worse. MaxMind says mobile devices usually resolve to “a broad region” rather than a specific city or postal code, and a cellular IP can move between users hundreds of kilometers apart within minutes. Most flyer scans happen on mobile data, so a dashboard dot is not evidence that someone scanned at the library rather than the gym down the road.

What you need before you print

You need three things before the flyers go out, and all of them are cheap:

  • A dynamic QR code generator with scan counts. Static codes hold the link inside the pattern and can’t count anything. A dynamic code points to a short redirect that logs each scan.
  • Every location on one list, each with a short name for each (gym-front-desk, library-board, cafe-elm-st).
  • How many flyers you left at each spot. Write it down at drop-off, because nobody remembers it a week on.

If you’re printing more than a handful of codes, a bulk QR code generator saves you making them one at a time.

How to set up one code per flyer location

Setting up per-location tracking means every spot gets its own code, while the flyer design and landing page stay the same. Here’s the order I’d do it in:

  1. Create one dynamic code per location. Name each code exactly like your list: flyer-gym-front-desk, not “Code 3”.
  2. Point every code at the same landing page. One page keeps the offer identical, so the only thing that differs between spots is the spot.
  3. Add UTM parameters if you use Google Analytics. Keep utm_source, utm_medium and utm_campaign the same on every code and change only utm_content. Google’s URL builder help page describes utm_content as the field for telling creatives apart.
  4. Use lowercase everywhere. Google notes that utm_source=google and utm_source=Google count as different values, so one capital letter can split a location’s numbers in two.
  5. Print a small location label near each code. A tiny “LIB” or “GYM” in the corner stops a stack of flyers from getting mixed up at the print shop or in your car.
  6. Test one printed copy from each batch with two phones before you hand anything out.

My UTM parameters for QR codes guide covers naming in more detail. The short version for flyers: utm_medium=print, utm_source=flyer, utm_campaign=<your offer>, and utm_content=<location>.

How to compare flyer locations fairly

The fair way to compare flyer locations is scans per flyer placed over the same date range, not raw scan totals. Raw totals mostly tell you which spot took the most paper.

Say the gym counter got twice as many scans as the library board. Sounds like a win for the gym. But if the gym took four times as many flyers, the library got more scans per flyer and deserves the next print run.

Fill in this table at the end of each week:

LocationFlyers placedTotal scansUnique scansScans per flyer
gym-front-deskwrite it downfrom dashboardfrom dashboardtotal ÷ placed
library-boardwrite it downfrom dashboardfrom dashboardtotal ÷ placed
cafe-elm-stwrite it downfrom dashboardfrom dashboardtotal ÷ placed

Three more checks keep the table honest:

  • Same days for everyone. A spot you added on Thursday can’t be compared with one that had a full week.
  • Unique scans next to totals. One curious person scanning five times looks like five people. My post on unique vs total scans explains how tools count repeats.
  • Look at the hour of scans. A café whose scans cluster at lunchtime tells you when people actually read your flyer, which helps when you pick the next drop-off time.

Going past scans: which location brought customers

Scans tell you which flyer got attention, and conversions tell you which location brought customers. If your landing page has a sign-up, booking or purchase, connect the codes to Google Analytics 4 and break down conversions by utm_content.

The Terminus UTM cheat sheet recommends exactly this filter: hold campaign, source and medium fixed, then break down by content. Each row becomes one flyer location. My GA4 QR tracking guide walks through where that report lives.

Watch for a location with lots of scans and no sign-ups. That usually means the flyer is placed where people are curious but not in the market, like a laundromat board for a business-to-business service.

Common mistakes with per-location flyer tracking

Most broken flyer comparisons come from a few setup mistakes, and every one of them is easy to avoid:

  • Mixed stacks. Flyers for two locations end up in one pile. The location label in step 5 prevents this.
  • One code reused “just for now”. Once two spots share a code, you can’t separate them later.
  • Changing the offer mid-test. If one café gets the “20% off” version and another gets “free trial”, you’re testing the offer, not the location.
  • Reading the map instead of the code name. Mobile IP locations can’t tell two streets apart.
  • Testing on screen only. A code that scans on your monitor can fail on glossy paper. Print one first, as my QR code flyer guide explains.

How QRAnalytica handles flyer location tracking

QRAnalytica fits this setup without extra tools. Each dynamic code gets its own scan counts with time of day, city and device, and UTM injection can append UTM parameters to the redirect automatically, so the GA4 side doesn’t need hand-built URLs. Pro adds bulk CSV creation for many codes and GA4 or Meta pixels.

The limitation is the one every IP-based tool shares: QRAnalytica’s city map comes from IP addresses, so on mobile data it is just as rough as anyone else’s. Scan tracking is also anonymized and cookie-free, so you see counts and patterns, never who scanned.

Create the per-location codes in the dynamic QR code generator.

My take

Skip the location map for flyer tests and trust only the code names. I’d also run every test for at least one full week, because a café that’s dead on Monday can be the best spot you have on Saturday morning.

FAQ

Can one QR code tell me which flyer location was scanned?

Not reliably. A single code only records where the phone’s IP address appears to be, and that is often a broad region, not a street. Print a separate code for each location instead.

Do I need a different landing page for each flyer location?

No. Every location’s code can send people to the same page. Only the code, or the utm_content value behind it, needs to be different.

Is the location map in my QR dashboard useless for flyers?

No, it is good for country-level and big-city questions, like whether a campaign reached a new town at all. It just can’t separate two cafés on the same street.

How long should I wait before comparing flyer locations?

Long enough that each spot has had the same number of days out, and include at least one full week so weekday and weekend traffic both count. Compare the same date range for every location.

Sources

Track your dynamic campaigns. 7-day trial, no credit card.
Generate Dynamic QR