Static QR codes with UTMs for flyers, shop windows, packaging and kiosks.
The link is written into the QR pattern itself and never expires: there’s no redirect of ours that can stop working after the print shop delivers. Each location gets its own source, the batch comes out as CSV and GA4 shows where the visit came from.
https://www.yourstore.com/promo?utm_source=loja-shopping-center-norte&utm_medium=offline&utm_campaign=LOJA_VENDAS_WINTER&utm_content=display-window-2610
Print has no default channel in GA4: the visit stays in Unassigned on purpose, with a clean source and medium, until you create the Offline channel group. Source, campaign and asset still show in the report, and the production date (2610) tells you how old the asset is.
What breaks
The “free” QR code expired after it was printed
Generators that create dynamic QR codes by default point to a redirect they own. When the trial ends, the redirect stops and the pile of printed material becomes trash. Here the QR code is static: the camera opens your address directly, with no server of ours in the way.
Complaints filed against a foreign generator on Reclame Aqui, Brazil’s best-known consumer complaint site: “Free QR code that expired, then a monthly fee” and “I created the QR code, printed more than 10,000 copies of it and they deactivated my QR code”.Complaint titles on Reclame Aqui against the “QRCode-Generator” generator, collected in market research on October 5, 2026 (translated from Portuguese)
GA4 doesn’t count the scan, only the visit
The scan happens in the phone’s camera, outside any website. What GA4 sees is the visit that arrives with the QR code’s UTM. Without a UTM, the scan arrives as Direct and gets lost in the rest of your traffic.
WhatsApp links, flyers and kiosks without UTMs arrive as Direct. With UTMs off the standard, they arrive as Unassigned.Guide: why GA4 doesn’t count QR code scans
Print has no default channel in GA4
There’s no “offline” channel in the default group. The visit stays in Unassigned even with the right UTM. The fix is a custom channel group that brings together flyers, stores, OOH and events, built in the simulator.
“A medium outside GA4’s rules (offline, qr, influencer) doesn’t go into any channel. The data exists, it’s just in the wrong bucket.”Guide: which utm_medium to use for WhatsApp, QR codes and print
What to use
- UTM builder, print channelsFlyers, physical stores, OOH and events, with the location in the source, the asset in utm_content and the QR code for the final URL on the same screen.
- QR code generatorPNG for screens and SVG for the print shop, with the minimum print size and error correction level.
- GA4 channels (in Portuguese)Build the Offline channel group so print gets out of Unassigned.
- CSV batchCollect the campaign’s assets and export everything for the print shop or for your records.
- WhatsApp QR codeA wa.me link with a ready-made message and a source code, for the counter and the packaging.
- Pix QR code (in Portuguese)A static code for Pix, Brazil’s instant payment system, with key, amount and identifier, for the sign at the register.
In three steps
- Build the link with the print channel and the location nameOne QR code per point of sale or asset, so you know which one brought the visit.
- Download the QR code as SVG for the print shopPrint it at actual size and scan it with two different phones before you approve the print run.
- Create the Offline channel group in GA4Use the simulator, so print shows up by name in the channel report.
The QR code the print shop printed keeps working
Static, with no redirect and no monthly fee to keep it working. Works with or without a plan.