How to measure scans
A QR code is a link you can print. GA4 does not see the scan itself. It sees the visit that starts when someone opens the link. If the link has UTM tags, that visit gets its own source, medium and campaign in your reports.
For printed material use utm_source=qr and utm_medium=print (or offline), plus a campaign name. In GA4 you will find these visits in the Traffic acquisition report when you look at session source / medium.
GA4 has no default channel for print, so with these tags the visits usually land in the Unassigned channel. Source, medium and campaign still show correctly. If you want a separate channel for print, create a custom channel group in GA4 with a rule for medium print.
Make one code for each placement, for example the flyer, the poster and the packaging, and give each one its own utm_content. Then you can see which one brings visits.
Before you print
- Test at the real size. Print one copy at the size you plan to use and scan it with a few different phones from the distance where people will stand. Bigger modules read more reliably, so make the code as large as the space allows.
- Keep the contrast high. Denso Wave recommends a black code on a white background. Many scanners read with red light, so a red code on white can look empty to them. Pale colors and busy photos behind the code also make scanning harder.
- Leave the quiet zone. The empty border tells the phone where the code starts. The QR standard asks for a border four modules wide, so do not crop it and do not put text or graphics right next to the code.
- Shorter is easier. Every extra character adds modules. A short link gives bigger modules at the same print size, and bigger modules are easier to scan.
- SVG for the printer. SVG stays sharp at any size. If you use PNG, download it at the size you need instead of enlarging it later, because scaling an image can distort the modules.
- A link you can change later. A printed code cannot be edited. If the destination might change, put an address on your own domain in the code and redirect it where you need.
Error correction and logos
Every QR code carries extra data, so a phone can read it even when part of it is dirty, damaged or covered. There are four levels:
A higher level means more modules for the same content. Denso Wave notes that M is the level used most often. Q and H make sense where the code can get dirty or worn, for example on packaging, in a warehouse or outdoors.
A logo covers part of the code, so the tool switches to level H and lets the logo take at most 18% of the code area. It also checks how much of each block of data the logo hides, keeps a reserve for print flaws and makes the code bigger when it has to. Test a code with a logo with extra care.
FAQ
Do these QR codes expire?
No. The content is stored in the pattern itself, so the code works as long as the link or data in it is valid. There is no account, redirect or subscription behind it.
Can I change the link after the code is printed?
Not in the code. If the destination might change, use an address on your own domain, for example yourdomain.com/menu, and set that page to redirect wherever you need. The printed code stays the same.
Why does the code get denser with a logo?
With a logo the code needs the highest error correction and enough room around the logo, so the hidden part stays small. That means more modules. A smaller logo or a shorter link keeps the code simpler.
How does the WiFi code work?
It uses the common WIFI: format with the network name, security type and password. When someone scans it, the phone offers to join the network. The password is readable to anyone who scans the code, so use it for guest networks.
Is anything I type sent anywhere?
No. The code is made in your browser. The logo, the WiFi password and everything else you type stay on your device and are not saved.
Sources: Denso Wave, the company that created the QR code, on the quiet zone, error correction, module size and colors. WiFi format from the ZXing project, contact cards from RFC 2426. Google Analytics Help on UTM tags, default channels and custom channel groups. Checked in October 2026.
The tool only uses what you enter. Nothing is sent or stored.