Skip to main content

Home / Blog

How to Track QR Code Scans (and Measure Offline Campaigns)

How to Track QR Code Scans (and Measure Offline Campaigns)

Online ads tell you exactly how many people clicked. A stack of 2,000 flyers, a poster in an elevator, or the back of a product box usually tells you nothing. QR codes change that — if you set them up right.

Static QR codes can't be tracked

A static QR code stores the destination URL directly inside the pattern. When someone scans it, their phone goes straight to that URL. No server sits in between, so nobody can count the scan.

A dynamic QR code stores a short redirect link instead. The scan hits the redirect first, which records it — time, device, rough location — and then forwards the visitor to your real destination. That one extra hop is what makes tracking possible. Static vs. dynamic QR codes explains the trade-offs in more detail.

Rule #1: one code per placement

The most common mistake is printing the same code on the flyer, the poster and the business card. You'll see a total, but you won't know which placement worked.

Create a separate dynamic code for each placement, all pointing to the same landing page:

Code name Where it's printed
flyer-campus-oct Flyers handed out at the campus gate
poster-elevator Elevator poster in residential buildings
box-back-panel Back of the product box

After two weeks, compare scan counts. You'll know where the next print budget should go.

What a dynamic QR code records

With a free RubyQR account, every dynamic code logs:

  • Scans per day and per hour — when people actually engage
  • Device and operating system — iPhone vs. Android share
  • Country and city — where scans happen

Hour-of-day data is surprisingly useful. If a restaurant flyer peaks at 11:00 and 17:00, that's when a lunch or dinner promo should run.

Add UTM tags to track all the way to revenue

Scan counts tell you how many people were interested. To see how many bought, add UTM parameters to the destination URL so Google Analytics attributes the visit:

https://shop.example.com/sale?utm_source=flyer&utm_medium=qr&utm_campaign=october
  • utm_source — the specific placement (flyer, poster, box)
  • utm_medium — always qr, so you can filter all QR traffic at once
  • utm_campaign — the campaign name

In Google Analytics you'll then see sessions, conversions and revenue for each code.

Calculate cost per scan

A simple formula lets you compare print against paid social:

Cost per scan = total print & distribution cost ÷ number of scans

If 2,000 flyers cost $60 to print and distribute and bring 300 scans, that's $0.20 per scan. Put it next to your cost per click on Meta or Google Ads and decide where the next dollar goes.

Change the message mid-campaign

Because the code only points to a redirect, you can change the destination at any time. If the landing page converts poorly after a week, swap it for a different offer — the flyers already in people's hands keep working. That's A/B testing for print.

Getting started

  1. Create a free RubyQR account — it includes 3 dynamic QR codes.
  2. Make one code per placement and name it clearly.
  3. Add UTM tags to each destination URL.
  4. Check the analytics after one to two weeks and double down on the winner.

Need more than 3 dynamic codes for a bigger campaign? Contact us about Pro.

Create a free QR code now

No sign-up needed. Want dynamic QR codes with scan tracking? Create a free account.