Tracking basics
Tracking QR codes on posters, flyers and print
A QR code on a poster is a link with no address bar, no referrer and no second chance once it is printed. If you want to know whether the poster worked, the tracking has to be built into the code before it goes to the printer. This guide shows how to do that properly for posters, flyers, leaflets and anything else on paper.
Why print needs its own tracking
When someone scans a QR code, their phone opens the link directly. There is no website in between to pass on a referrer, so without tags the visit lands in GA4 as (direct) / (none), mixed in with people who typed your address or used a bookmark. You would never know the poster was responsible.
The fix is to put a tagged link inside the code. A QR code simply stores text; if that text is a full campaign link, GA4 reads the tags just as it would for a click in an email.
Step 1: decide what you want to compare
Before you build anything, decide what question the results should answer. The usual ones:
- Did print work at all? One tagged link for all printed material is enough.
- Which piece worked best? Give the poster, the flyer and the leaflet different links.
- Which location worked best? Give each place its own link: the library, the café, the community centre.
Each extra version means another code and another print file, so only split as far as you will actually use. Three locations you will compare are better than twelve you will never look at.
Step 2: build the tagged links
Keep campaign, source and medium the same for every printed piece in the campaign, and use utm_content to tell the pieces apart. A pattern that works well:
| Parameter | Value | Why |
|---|---|---|
utm_source | poster, flyer or leaflet | What the person was holding or looking at |
utm_medium | qr | How the visit arrived |
utm_campaign | 2026-03-open-day | The same as your email and social links for this campaign |
utm_content | library-a3, cafe-a5 | Which copy or location |
The finished link for the library poster:
https://example.org/open-day?utm_source=poster&utm_medium=qr&utm_campaign=2026-03-open-day&utm_content=library-a3
About the qr medium
GA4 has no default channel rule for qr, so these visits sit in the Unassigned channel. That is fine: you will find them by campaign, source and medium. If you would like QR scans to appear as a named channel, create a custom channel group in GA4 that matches medium qr.
Step 3: think about the destination
The codes FastUTM makes are static: the link is stored in the pattern and cannot be changed after printing. Two things follow from that.
Use a page you control and will keep. If the event page might move, point the code at a stable address on your own site, such as example.org/open-day, and keep that page live for as long as the posters might be up. Printed material has a long tail; people find old leaflets months later.
If you redirect, keep the tags. If that stable address redirects somewhere else, make sure the redirect carries the query string across. Scan the code and look at the final address on your phone: if the utm_ part has gone, the redirect is dropping it.
And make the page work on a phone. Everyone who scans a code is on a phone, often standing up, sometimes on poor signal. A slow page or a desktop-only form wastes the scan.
Step 4: make the code and test it
- Paste the tagged link into the QR Generator as a Website code.
- Keep the colours dark on light. The generator warns you if the contrast is too low.
- Download a 2000 px PNG or the SVG for print, so the code stays sharp at any size.
- Keep the white border (the quiet zone) around the code. Designers sometimes crop it to save space, and that is one of the most common reasons a printed code will not scan.
- Print a test copy at the real size. Scan it with two or three different phones, from the distance people will actually stand.
There is no single correct size. A flyer held in the hand can use a small code; a poster across a corridor needs a much larger one. The test print is what tells you. Aim for at least 2 cm across, and go bigger whenever people will be further away.
Step 5: read the results
- In GA4 open Reports, Acquisition, Traffic acquisition.
- Set the dimension to Session campaign and find your campaign.
- Add a secondary dimension of Session source / medium to see
poster / qrandflyer / qrnext to your email and social rows. - To compare locations, use an Exploration with Session manual ad content, which holds your
utm_contentvalues.
Remember what the numbers can and cannot tell you. They count visits from scans, not how many people saw the poster. A low number might mean a weak poster, a bad spot, or simply a small audience. Compare like with like: two posters in similar places, or this year's open day against last year's.
Worked example
A community group prints two A3 posters for a fundraising quiz, one in the library and one in a café, with different utm_content values. After three weeks GA4 shows library-a3 brought in several times more visits than cafe-a5. Next time they put the budget into more library-style locations and a smaller run for cafés.
Common print mistakes
- Printing a code that points at the homepage instead of the event page.
- Using the same link on every piece, then wanting to compare them.
- Cropping the white border, or placing the code over a busy photo.
- Linking to a page that will be removed while the posters are still up.
- Skipping the test print.
For more on the different QR types and what each one does, see the QR Code Guide. To fit your print links into the rest of the campaign, read UTM naming conventions.