To measure a QR code on a stall sign, a flyer or a business card, tag the web address the code points to. The code only carries the address to the phone. The tags on the end of that address, utm_source, utm_medium and utm_campaign, are what Google Analytics 4 reads to tell you which printed piece the visit came from. If you run a farmers market stall, a small shop or a service from a van, the working routine is short: give each printed piece its own tagged address, write every value in lowercase with one naming rule, read the result in the Traffic acquisition report, and ask walk-up customers one question at the counter for everyone who never scans anything.
The Google help pages say nothing about QR codes themselves. Everything here rests on one thing, the tagged link: a link that carries a label, a visitor who opens it, and an analytics tool that records the label.
What a tagged link can and cannot tell you
It counts visits that open the tagged address
Suppose your stall banner shows a QR code that leads to your weekly box page. If the banner prints a plain address, the person who scans it and the person who finds you through a search engine land in the same place. Analytics cannot say which was which. A tagged address turns the banner into its own row in the report.
It does not count the customer who never scans
Someone who reads your flyer and walks to the stall, or keeps the card in a bag and phones three weeks later, leaves no tagged visit. The counter question described later covers that gap. The two methods answer different questions, so keep both.
It needs a landing page worth visiting
A tag records where a visit came from, not what the visitor wanted. If every printed piece points to the home page, you learn the number of people who came but not what they were looking for. Practical suggestion: send each piece to the page it promises, such as the box page, the pre-order form or the market schedule.
Example scenario: a farmers market stall with five printed pieces
Example scenario: a farmers market stall sells vegetable boxes, jars and baked goods. It has a chalkboard sign with a QR code, a price card on the table, a flyer handed out at the stall, a label on each jar, and a card in the paper bag that invites people to order next week. Each piece meets the customer at a different moment, so each gets its own row.
| Printed piece | utm_source | utm_medium | utm_campaign | Landing page |
|---|---|---|---|---|
| Chalkboard sign | stall-sign | qr | weekly-box | Weekly box page |
| Price card | price-card | qr | pre-order | Pre-order form |
| Hand-out flyer | flyer | qr | autumn-market | Market schedule page |
| Jar label | jar-label | qr | repeat-customer | Reorder page |
| Bag card | bag-card | qr | next-week-order | Order page |
Table: label set for the example stall. The values are fictional. Use the names of your own printed pieces.
Why five rows and not one
A single shared address would hide the difference between a sign people see from the aisle and a label people read at home. The label on a jar reaches a person who has already bought. The sign reaches a stranger. Reading the two as one number would mix a loyalty signal with a discovery signal.
Two print runs of one flyer
If you reprint the flyer for spring, put the season in the campaign name: autumn-market and spring-market. The old and new run then sit on separate rows and compare cleanly.
A naming rule for source, medium and campaign
The Analytics help page on manual tagging says that when you add parameters to a URL, you should always use utm_source, utm_medium and utm_campaign. It also strongly recommends setting utm_id and utm_source_platform alongside them. Those two extra parameters mainly matter for links that come from advertising platforms. For a printed flyer, the three core fields carry the work. Missing UTM parameters result in (not set) values in reporting.
| Parameter | Definition on the help page | What you put there for print |
|---|---|---|
| utm_source | The referrer | The name of the printed piece |
| utm_medium | The marketing channel | qr or print |
| utm_campaign | The product, slogan or promo | The offer or the season |
| utm_content | Differentiates creatives | Optional: front, back |
Write the rule down once
The best-practices section of the help page recommends a strict naming convention for all fields. Put yours in one shared note: which source names exist, which two or three medium words you use, how a campaign name is built. Without a written rule, one helper types flyer, another types Flyer and a third types flyers, and the report splits. For extra parameters such as utm_id and utm_source_platform, see the UTM glossary for ad links.
Choose readable words
The help page examples use hyphens and underscores, such as summer-sale and spring_sale. Practical suggestion: keep spaces and accented characters out of the values and use plain lowercase words joined by hyphens.
For links that come from marketplaces and social profiles, see how to separate marketplace and social traffic with UTM tags. Keep print source names distinct from those, so the stall sign and your Instagram profile never share a source value.
Lowercase and consistency: the mistake that splits reports
The Analytics help page states that parameter values are case sensitive: utm_source=google is different from utm_source=Google. The older campaign URL page repeats the warning. The manual tagging page also recommends lowercase as standard practice.
Take a stall helper who prints one label with the value jar-label and another with Jar-Label. Analytics records two sources. The same jar label now looks half as strong in each row, and a small row is easy to dismiss at review time.
Lowercase checklist before printing
- Is every value written in lowercase?
- Are spaces and accented letters replaced with plain letters and hyphens?
- Does the same printed piece use the same source name in every run?
- Does the campaign name carry the offer or season?
- Did someone open the address on a phone and reach the right landing page?
When a typo is already printed
A misspelled value on a printed run stays in the world. Read the two rows together in the report, correct the next run, and compare using the sum of the rows.
Where it shows up: the Traffic acquisition report
The help page says the parameter values are visible in the Traffic acquisition report. Under Acquisition, Traffic acquisition, you can view Session source/medium, Session medium, Session source and Session campaign. If your interface is not in English, the labels may look different.
Which dimension answers which question
- Session source/medium shows a row such as flyer / qr. It suits a comparison between printed pieces.
- Session campaign lists names like autumn-market. It suits a comparison between seasons or offers.
- Session medium groups everything under qr. It shows how much of your traffic came from print as a whole.
Page dimensions do not carry the tags
According to the help page, UTM parameters are omitted from the Landing page + query string and Page path + query string dimensions. To see which page the tagged visits reached, filter by source or campaign first and add the page as a second dimension.
What happens after the visit
A session count is not a sale. To see whether visitors tapped a phone number or a chat button, you need a key event. For the setup, see click-to-call and chat clicks as GA4 key events. The tag says which printed piece brought the visit, the event says what the visit did.
The older campaign URL page and the URL builder
The older help page on custom campaign URLs recommends the Google Analytics Campaign URL Builder for websites. It also lets you add parameters by hand: a question mark separates the address from the parameters and an ampersand joins the pairs. That page was written for Universal Analytics and points to Google Analytics 4 as its replacement, so its report path is not the GA4 path. Utm_source, utm_medium and utm_campaign are required there as well, while utm_term and utm_content are optional.
Keep a log of every address
Record each address in a simple sheet. Without it, you will not remember six months later which print run the price-card row belongs to.
| Column | Example | Why it helps |
|---|---|---|
| Piece and run | Flyer, autumn run | Match a row to a run |
| Quantity printed | Number on the printer invoice | Compare cost and sessions |
| Full address | Landing page plus three parameters | One source for the next reprint |
| Where it was placed | Table, bag, stall wall | Explain differences in placement |
Test before the printer
Open each new address on a phone, then check in GA4 that the visit appears on the row you expected. Run this test several days before the print deadline, so there is time for the report to update.
Short links and redirects
A long address makes a printed code crowded. If you use a short link, confirm that it forwards to the full tagged address. Practical suggestion: test every short link and confirm the right row opens in the report.
(not set) and the missing tag
When a parameter is missing, the help page says (not set) values appear in reporting. If you forgot utm_campaign on the jar label, the visit still counts but the campaign column reads (not set). Writing all three parameters every time prevents it.
Walk-up customers: the one question at the counter
Some customers will never scan a code. The counter question catches them. Practical suggestion: ask one short question at payment and record the answer from a closed list.
| Customer answer | Matching tagged row | Note |
|---|---|---|
| Saw your sign | stall-sign / qr | Count scanners and non-scanners separately |
| Got your flyer | flyer / qr | Note where the flyer was handed out |
| A friend told me | No match | Not in the tagged report |
| Saw you on social media | Your social tags | Keep source names separate from print |
| Other | No match | Write it in a free note |
Keep the question short
Ask while the customer is paying and keep it to one sentence. A tally on paper is enough. Put the weekly totals beside the tagged rows. The two will not match, and they should not, because they count different behaviour.
Offline sales and Analytics
Tying a stall sale to Analytics takes extra setup. A simple alternative is a monthly sheet with three columns: tagged sessions, counter answers and the sales book. Read the three side by side as separate clues.
A decision rule for the next print run
Three questions help you decide whether a printed piece earns a reprint.
- Is the tag correct and the row unsplit? If not, merge the rows before judging.
- Relative to the quantity printed and the placement, is the piece clearly behind the others?
- Do the expected actions follow the visit, such as a tap on the phone number, a chat click or a form?
If all three answers are negative, redesign the piece and fix the wording or the code placement before reprinting. If one answer is unclear, reprint with the same tags and keep the rule as it is.
Small numbers
A stall flyer may bring few sessions. Do not treat a gap of a few visits as proof. Practical suggestion: follow a piece through at least two print runs before ranking it.
Seasonal swings
A market stall in July and the same stall in December see different crowds. Compare a run with the same period last year or with another piece in the same period.
A three-month trial plan
| Month | Task | What to read |
|---|---|---|
| First | Write the naming rule, tag three pieces, test every address on a phone | Rows appear with the right names and no (not set) |
| Second | Start the counter question and keep a tally | Tagged sessions beside counter answers |
| Third | Change one thing and give the new run a new campaign name | Old campaign beside new campaign |
In the first month, only clean data matters
Do not look for results yet. Confirm that rows are spelled right, no (not set) rows appear and each piece shows on its own line.
Change one thing per run
If you change the headline, the colour and the address together, you cannot tell which change moved the number. Change one element and give the run a new campaign name, for example autumn-market-headline-b.
Keep an address after the campaign ends
Do not delete a finished row from the sheet. Write an end date instead. An old flyer may still be on a fridge, and its code keeps sending visitors. If you take the landing page down, those visitors reach an empty page.
Monthly reading routine
- Open Traffic acquisition with Session source/medium in the first week of the month.
- Compare against a period of the same length.
- Look for (not set) rows and find which address was incomplete.
- Compare any split source names against the naming rule.
- Add the month of counter answers.
- Choose one change for the next run.
Placing the code on each piece
A correct tag does nothing if the code cannot be scanned. These are practical suggestions from print use, not statements from Google.
Stall sign and chalkboard
Put the code at a height an adult can reach without crouching, away from glare. Next to the code, write what the scan leads to, such as this week's box list. A code with no promise beside it gives a passer-by no reason to lift a phone.
Price card and jar label
Both are read at arm's length, so the code needs clear space around it and a short line of text that names the destination. A jar label can point to a reorder page, because the person holding it has already bought once.
Flyer and bag card
A flyer is read later, perhaps on the bus or at home. Put the code after the main message, not before it, and make sure the landing page opens quickly on a phone. A bag card should lead to one action only, for example next week's order form.
Code and short address together
If you also print a short address for people who cannot scan, give it a separate medium value, such as print, so the two routes appear on separate rows. Test that the short address keeps the tags.
Questions about the numbers you will see
Does a tagged link prove a sale?
No. A tag carries source information, not sales information. To see sales you need an event, an order form notification or the sales book.
Do I need a different domain for each piece?
No. Tagged links can point to one page or to several pages on one site. The tag difference gives the report enough to separate them.
Can I change a tag after printing?
The code stores the address, so a printed code cannot be edited. If you manage the destination through a redirect, test that the redirect keeps the tags before you rely on it.
Will my own test scans appear?
Test visits can be recorded as sessions. Write down your test scans in a notebook and compare them with any small numbers you see in the first days.
Reading very small numbers
A stall flyer may produce few sessions, so a gap of a few visits proves little. Compare the same piece across two runs before you rank it, and weigh each row against the quantity printed.
Giving helpers a one page sheet
Everyone who works the stall should know which piece goes to which address, how the counter question is asked and where the answer is written. One page is enough. When a new run is added, add a row and keep the old one with an end date.
Limits of this measurement
- A tagged address counts only visitors who open it.
- UTM parameters are omitted from the Landing page + query string and Page path + query string dimensions.
- Values are case sensitive, so a one-letter difference opens a new row.
- Missing parameters produce (not set) values.
- The older campaign URL page was written for Universal Analytics, and its reports are not the GA4 reports.
Google documentation can change, so check the current Manual tagging with UTM parameters (Opens in a new tab) page and, for the older campaign URL guidance, Collect campaign data with custom URLs (Opens in a new tab) before you print.
For campaign naming in reporting that crosses channels, sponsored post reporting with UTM, GA4 and Search Console uses the same source, medium, campaign logic as print.
Print-run checklist
- List every printed piece you want to separate.
- Write source, medium and campaign for each, in lowercase with hyphens.
- Store the naming rule in one note.
- Record each address and the quantity in the sheet.
- Open each address on a phone and find its row in GA4.
- Send the files to print.
- Start the counter question.
- At month end, read the tagged report, the counter tally and the sales book together.
- Pick one change for the next run.
Frequently Asked Questions
Does a QR code measure anything on its own?
No. The tags on the address do the measuring, and the code only carries that address to the phone.
Which UTM parameters are required?
The Analytics help page says that when you add parameters to a URL, you should always use utm_source, utm_medium and utm_campaign. Missing parameters result in (not set) values in reporting.
What happens if I mix upper and lower case?
Parameter values are case sensitive, so flyer and Flyer count as two sources and one printed piece splits across two rows. The help page recommends lowercase as standard practice.
Where do tagged visits show up in GA4?
The parameter values are visible in the Traffic acquisition report. You can view Session source/medium, Session medium, Session source and Session campaign. Labels may look different if your interface is not in English.
How do I tell two print runs of one flyer apart?
Put the season or batch in the campaign name, for example autumn-market and spring-market. The two runs then appear as separate rows.
How do I count customers who never scan the code?
Ask one short question at the counter and record the answer from a closed list. It complements the tagged link and does not replace it.
Conclusion
Measuring offline customers with QR codes comes down to three habits: give each printed piece its own tagged address, write every value in lowercase from a written rule, and read the result in the Traffic acquisition report. The counter question covers the customers who never scan. With that routine in place, a market stall or small shop can compare its sign, flyer and label on evidence and put the next print budget where the visits actually come from.
The first step costs little: a written naming rule, three tagged addresses, one phone test and a tally sheet beside the till. After that, each new print run starts from what the previous one showed, and the measurement replaces guesswork in the print order.
Good measurement also needs landing pages that explain what a scan promises. If your pages and product descriptions need clearer copy, take a look at our content writing service.
Post a comment
Please log in to leave a comment. Login