What QR code ROI actually measures
A printed QR code is a doorway from paper to a web page. Its return on investment is the value of what people did after walking through that doorway (orders, bookings, sign-ups, donations) compared with what the printed campaign cost.
That means you need three things: the cost of the campaign, a scan tracker to see how many people opened each code, and destination analytics to see what they did next. A scan tracker on its own can't tell you whether someone bought anything.
The formula, with an example
Calculate your campaign return
Example numbers are prefilled. Replace them with your own figures.
Design, print, distribution and allocated software cost.
From your shop or booking system, not the scan count.
After product and fulfilment costs, before this campaign cost.
- Attributed ROI
- 40.0%
- Return after campaign cost
- €72.00
Break-even: 13 attributed orders at this contribution per order.
This estimate uses the outcomes you attribute to the campaign. It does not establish how many sales the campaign caused. Inputs stay in this calculator and are not saved or sent.
The starting figures in the calculator illustrate this example:
- A café prints 500 flyers with a QR code to its online ordering page. Design, printing and distribution cost €180 in total.
- The QR tracker records 120 scans over four weeks.
- The ordering system shows 18 orders from visitors tagged with that flyer's UTM campaign, with an average margin of €14 per order: €252 of attributed value.
- ROI = (€252 − €180) ÷ €180 = 0.4, or 40%.
Use margin rather than revenue if you can, since revenue overstates the return. And be honest about attribution: some of those customers might have ordered anyway.
Tag the destination with UTM parameters
UTM parameters are tags on the end of a URL that tools such as Google Analytics read to tell you where a visit came from. Add them to the destination link you save in the QR code:
https://example.com/order?utm_source=qr&utm_medium=offline&utm_campaign=autumn-2026&utm_content=flyer-station-a
- utm_source:
qr, to group visits from your QR placements. - utm_medium:
offline, the convention used in these guides. - utm_campaign: the campaign name.
- utm_content: the item and placement, such as
flyer-station-aorposter-reception.
These labels are examples, not reserved Google values. If you already use a consistent convention, keep it. Use lowercase labels and do not mix naming systems within one campaign. Google's campaign URL guidance explains how these parameters populate acquisition reports.
With a dynamic QR code, the tags live in the saved destination, so the printed pattern stays short and you can correct a tag after printing. With a static code, the whole tagged URL is encoded into the pattern, which makes it denser and harder to scan at small sizes. Test that the tags survive any redirects on your own site, and never put personal data in URL parameters.
What scan data tells you, and what it doesn't
A scan tracker such as QRtracer records each time a dynamic code is opened. That tells you:
- Interest per placement: which codes get opened, and how often.
- Timing: when scans happen, useful for spotting when a placement went live or stopped working.
- Approximate location and device type: helpful for sanity checks, such as scans from a city where you never distributed anything, which suggests the code was shared online.
It doesn't tell you who the person was, whether they bought, or anything about their income or preferences. Unique scans are an estimate based on technical signals, not an exact count of people. Read how QR code tracking works for the details of each field.
Compare placements fairly
To learn which placement works best, give each one its own code and its own utm_content value, all pointing to the same page. Run them over the same dates.
Then compare per unit, not in total: scans and outcomes per 100 flyers, or per euro spent. A window poster seen by thousands of passers-by will usually out-scan a table card seen by a few dozen diners; that alone doesn't make it the better investment. Keep a simple note of how many copies went where and when, because you'll need it to interpret the numbers.
Checklist before you print
Download the campaign measurement worksheet (CSV). Open it in your spreadsheet tool and keep one row per placement. It is a blank planning template, not a QRtracer analytics export.
- Write down the total campaign cost, including design and distribution.
- Decide which outcome counts (order, booking, sign-up) and check that your destination records it.
- Build one tagged destination URL per placement.
- Create one named dynamic code per placement, for example
autumn-flyer · station-a. - Scan a printed proof of each code and confirm the tags appear in your analytics.
- After the campaign, combine cost, scans and outcomes in one table and calculate ROI per placement.
Running many codes? See the guide to generating QR codes at scale.