How do you A/B test posters with QR codes?

Print two versions that differ in one thing, put them in matched locations, give each version at each location its own QR code, and swap them halfway through. Compare scan and customer rates once each version has enough scans, and re-point the losing codes instead of reprinting.

By Daniel Zaremba, founder of BetterQR · Updated

What can you A/B test on a poster?

Anything a passer-by can see or anything they land on after scanning. On the poster itself: the headline, the offer, the image, the colour, the call to action next to the code, or the size and position of the code. After the scan: the landing page, the form length or the offer shown on the page.

The second group is cheaper to test, because one printed poster can carry two codes pointing to two different pages, or one code can be re-pointed halfway through. Testing the printed design means printing two versions, so pick the change you expect to matter most.

Why should you test only one thing at a time?

If version A has a new headline, a new photo and a different offer, and it wins, you don't know which change did it. Next time you'll copy all three and may keep a change that was actually hurting. Change one thing between versions and keep everything else identical: size, paper, position on the wall, code size and the landing page (unless the landing page is what you're testing).

Good first tests for a small business are the offer ("free coffee with your first order" vs "10% off") and the call to action next to the code ("Scan for the menu" vs "Scan to book a table"). They tend to make a bigger difference than colour or layout.

How do you split placements fairly?

Locations differ far more than poster designs. A noticeboard by a busy station entrance can get ten times the scans of one in a quiet side street, whatever is printed on it. If version A goes in the busy spot and version B in the quiet one, you're testing the locations, not the posters. Two habits fix most of this.

Use matched locations

Pair your sites up by type and footfall: two gyms, two station noticeboards, two café windows on similar streets. Put A in one of each pair and B in the other. With an odd mix of sites, aim for each version to get a similar spread of busy and quiet locations.

Rotate halfway through

After the first half of the test, swap the posters: sites that had A get B, and sites that had B get A. Now each version has been seen in every location, so a single strong site can't decide the result. Run both halves for the same length and over the same days of the week.

Why does each version need its own code at each location?

One code per version per placement gives you a grid: you can read the result by version, by site and by week. If you only use one code per version, a surprise result could come from one site and you'd never know. With per-site codes you can spot a poster that fell down, a site under scaffolding or a window that was covered for a week, and leave it out of both versions.

That means two codes per site when you rotate. Ten sites is 20 dynamic codes, which is more than the 15 in BetterQR's Pro plan and fits in the 75 on Business. Name them so the version and site are obvious, for example spring26-a-gym-north and spring26-b-gym-north, and add a matching utm_content to each destination so GA4 can split conversions the same way.

How many scans do you need before deciding?

Enough that the gap between the two versions is bigger than random week-to-week wobble. Small numbers swing a lot: 12 scans against 8 looks like a 50% lift, but one busy afternoon could reverse it. You don't need statistics software to stay out of trouble. Use these rules of thumb.

  • Compare rates, not totals. Use scans per site per week, or customers per 100 scans, so unequal run times or a missing poster don't skew the result.
  • Wait for about 100 scans per version before reading scan results, and about 20 customers per version before reading conversion results. Below that, treat any difference as a hint.
  • Check the gap against a quick yardstick. Add the two versions' counts together and take the square root. If the difference between the versions is more than twice that number, it's unlikely to be chance. With 120 and 80 scans: the total is 200, its square root is about 14, twice that is 28, and the gap of 40 is bigger. With 55 and 45, the yardstick is 20 and the gap of 10 isn't. This is a rough check for counts collected over the same sites and time, not a formal test.
  • Look for consistency. A real winner usually wins in both halves of the rotation and at most sites. If it wins big at one site and loses elsewhere, look at that site before trusting the result.

If the test ends without a clear winner, that is a result too: the change didn't matter much. Keep the cheaper version and test something bolder next time.

What does a worked example look like?

The numbers below are made up to show the method. Say a café tests two offers on otherwise identical posters at 10 matched sites for four weeks. Version A says "Free coffee with your first order"; version B says "10% off your first order". Sites 1 to 5 get A and sites 6 to 10 get B for two weeks, then they swap.

Hypothetical results of a four-week poster A/B test
VersionWeeks 1–2 scansWeeks 3–4 scansTotal scansCustomersCustomers per 100 scans
A: free coffee140 (sites 1–5)150 (sites 6–10)290227.6
B: 10% off95 (sites 6–10)105 (sites 1–5)200189.0

Scans: A won in both halves, in both sets of sites. The gap is 90 scans; the yardstick is twice the square root of 490, about 44. A clearly gets more people to scan.

Customers: A brought 22 and B brought 18. The gap of 4 is well inside the yardstick of about 13 (twice the square root of 40), so the test can't say which offer produces more customers. B converts a slightly higher share of its scans, which is common: a discount attracts fewer but more decided people.

Decision: A wins on attention. On customers it's a draw, so also consider cost. A free coffee might cost you less than 10% of a first order, which would tip it further towards A. To settle the customer question, run the test longer or across more sites.

What do you do with the losing version?

With dynamic codes you don't have to reprint straight away. Each printed poster points at a destination you can change, so:

  • If you tested landing pages, re-point the losing codes to the winning page. Every poster now sends people to the better page, with no printing.
  • If you tested the printed design, the losing posters still show the losing design. Re-point their codes to the winning offer's page if the offer can be honoured there, and replace the posters at the next print run.
  • Keep the codes and their names. Scans after the change show whether the re-pointed codes improve, and the history stays in one place.

Static codes can't do this: the destination is fixed in the pattern, so changing it means reprinting. See static vs dynamic QR codes for the trade-offs.

What usually spoils a poster test?

  • Ending early because one version is ahead after a few days. Decide the length before you start and stick to it.
  • Uneven exposure, such as one version going up three days late or a poster being covered. Note it, and compare per-site weekly rates rather than totals.
  • Seasonal or event spikes in one half only, such as a bank holiday or a local festival. Rotation spreads the effect across both versions, which is another reason to use it.
  • Different code sizes or placements between versions. The code itself must be identical in size and position unless that's the thing you're testing.

Once you have a winner, feed its cost per customer into the campaign ROI calculator to see whether the campaign is worth scaling.

Test posters with real scan data

Give each version its own dynamic QR code, compare them side by side and re-point the loser.

ICO registration ZA921111 (opens in new tab)