How do I track QR code scans from each billboard?

Give every billboard its own dynamic QR code, name each code after the site, and compare scans per site in your QR code dashboard. One shared code across all your billboards tells you the campaign total, but not which board did the work.

By Daniel Zaremba, founder of BetterQR · Updated

Why does every billboard need its own QR code?

A QR code can only report where it was scanned from if it exists in one place. Print the same code on five boards and you get one number: 340 scans, say, with no way to tell whether they came from the busy high-street site or were spread evenly across all five. Give each board its own code and you get five numbers you can compare with each site's cost.

Location data from the phone doesn't fix this. Scan location is estimated from the phone's IP address, which usually resolves to a town or city, not a street corner. Two boards a mile apart will often show the same city. The code itself is the only reliable placement label.

Should billboard QR codes be static or dynamic?

Dynamic. A static code encodes the final web address, so the only way to count scans is to read your website analytics, and the only way to change the destination is to reprint. A dynamic code encodes a short redirect link. Each scan passes through the redirect, which counts it, records the time and device, and sends the person on to the landing page you've set.

Static codeDynamic code
Scans countedNo (only website visits, if tagged)Yes, every scan
Change destination after printingNo, reprintYes
Pattern densityGrows with URL lengthFixed, short link
Keeps working if the landing page movesNoYes, repoint it
CostFreePaid plan

Being able to repoint matters more on billboards than anywhere else. A board can stay up for weeks after a campaign's landing page has been taken down; with a dynamic code you can send late scanners to your current offer instead of a 404.

How should I name billboard QR codes?

Use one naming pattern for every code, and use the same words in the code's name and its UTM tags so your QR dashboard and Google Analytics line up. A pattern that works for most small campaigns is campaign_format_site, all lowercase, hyphens inside each part.

Code namePlacementutm_content
spring-26_48sheet_a40-westboundRoadside 48-sheet, A4048sheet-a40-westbound
spring-26_6sheet_high-st-north6-sheet, High Street north6sheet-high-st-north
spring-26_shelter_station-rd-stop-cBus shelter, Station Road stop Cshelter-station-rd-stop-c
spring-26_window_shop-frontOwn shop windowwindow-shop-front

Put anything you'll want to filter by into the name: format, area, media owner or creative version. Add the media owner's site reference if they gave you one, so you can match your report to their proof of posting. The UTM and GA4 guide covers the full tagging scheme.

How do I set up tracking for a billboard campaign?

  1. Export the media plan to a spreadsheet: one row per site, with the site name, format, address, start and end dates and cost.
  2. Add a column for the code name, using your naming pattern, and one for the landing page with UTMs.
  3. Create one dynamic code per row. In BetterQR you can bulk upload the spreadsheet so each row becomes its own labelled code, and group the codes into a campaign.
  4. Download each code as SVG or EPS for large-format print (vector files are on Pro and up) and send each one to the printer with the matching site reference in the filename.
  5. Size the code for the viewing distance; see billboard QR code size.
  6. Before the artwork is signed off, scan every code from a printed proof, and check it lands on the right page. The QR code tester checks an image file.
  7. On posting day, scan each code on site once and note the time. That confirms the right code went on the right board.

The most common real-world failure is a printer or poster crew putting artwork on the wrong site. Filenames that include the site reference, and a test scan on posting day, catch it before it ruins the data.

What does a billboard scan report show?

A dynamic code's report counts scans as they happen. In BetterQR every dynamic code on Pro shows:

  • Total scans and unique visitors over the period you pick
  • Scans over time, so you can see the effect of posting day
  • A device breakdown

Business and up adds:

  • Active hours and scans by day of the week
  • Approximate location by country and city
  • Operating system and browser
  • The UTM source, medium and campaign each scan carried

Codes grouped into a campaign can be compared side by side. The OOH advertising page shows the placement view.

What should I compare between billboards?

Raw scan totals mislead because sites differ in cost, size and how long they're up. Compare rates instead.

MetricHow to work it outWhat it tells you
Scans per dayScans ÷ days the site was liveResponse when posting dates differ
Cost per scanSite cost ÷ scansWhich sites are cheap to get a response from
Scan-to-visit rateGA4 sessions ÷ scansWhether the landing page loads and holds people
Cost per customerSite cost ÷ conversionsThe number to take into the next media buy
Peak hoursScans by hour of dayWhen the audience at that site is receptive

A worked example: say board A cost £600 for two weeks and got 120 scans, and board B cost £250 and got 70. Board A has more scans, but its cost per scan is £5.00 against board B's £3.57. If both sent the same share of scanners on to buy, B is the better buy. The campaign ROI calculator runs this for your own numbers, and how to measure billboard ROI goes further.

Small numbers are noisy. A difference between 12 and 9 scans means little; a difference between 120 and 40 usually means something. If sites are close, run them again or compare across more weeks before you cut one.

What mistakes break billboard scan tracking?

  • One code across every site. You get a campaign total and nothing to compare. This is the most common mistake and can't be fixed after printing.
  • Static codes. No scan count, and a typo in the URL means reprinting. If the URL is long, the code is also denser and harder to scan from a distance.
  • Free dynamic trials that expire. Some generators deactivate dynamic codes when a trial ends, and the board keeps showing a dead code. See QR codes that don't expire.
  • Codes too small for the distance. A code people can't scan from the pavement records zero, which looks like a bad site rather than a bad code.
  • No reason to scan. A bare code next to a logo gets few scans. Say what the scan gives: a discount, a booking, a map.
  • Inconsistent names. HighSt, high-street and high_st become three rows in GA4. Pick one form and use it everywhere.
  • Testing on screen only. A code that scans from a laptop screen may not scan at 1:10 scale from across the road. Test the printed proof.

Can I track roadside billboards seen from a car?

Rarely well. Drivers shouldn't scan, and passengers get a few seconds at speed. QR codes work on billboards where people are on foot or waiting: high streets, station approaches, car parks, bus stops. On roadside sites, pair the board with a short, memorable URL or a discount code, and track that instead.

Quick checklist

  • One dynamic code per site
  • Names follow campaign_format_site, lowercase
  • UTMs on each destination, matching the code name
  • Site reference in every artwork filename
  • Printed proof scanned from the real distance
  • One test scan per site on posting day
  • Compare cost per scan and cost per customer, not raw totals

Give every placement its own code

Set up a dynamic QR code per poster, flyer or billboard in a few minutes and see which one brings customers in.

ICO registration ZA921111 (opens in new tab)