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— alwaysqr, so you can filter all QR traffic at onceutm_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
- Create a free RubyQR account — it includes 3 dynamic QR codes.
- Make one code per placement and name it clearly.
- Add UTM tags to each destination URL.
- 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.
