How to use it
- Enter the web address the code should open.
- Pick a preset (poster, flyer, packaging…) or fill in source, medium and campaign yourself.
- Give each placement its own utm_content value, like poster_entrance or poster_counter.
- Download the code, scan it once, and check the real-time report in your analytics.
Tracking without a redirect: how it works
Dynamic QR providers pitch their service as the only way to see how many people scanned your code. To make that work, every scan passes through their server, and if you stop paying, the code can stop working.
There's a simpler way. UTM parameters are tags on the end of a link, and every web analytics tool (GA4, Plausible, Matomo, Fathom) recognizes them out of the box:
https://example.com/sale?utm_source=qr&utm_medium=print&utm_campaign=spring_sale
Anyone who scans the code lands on the same page, and their visit shows up in your analytics with “qr / print” as the source. There's no middleman server, the code never expires, and the data belongs to you, not to a QR company.
The one requirement: the landing page needs your analytics tag (GA4 or similar). If the link points to a PDF or someone else's site, your analytics won't run there.
What goes in each field?
| Parameter | What it means | Example |
|---|---|---|
| utm_source | where the visitor comes from | qr |
| utm_medium | which channel | print, packaging, poster |
| utm_campaign | which campaign | spring_sale |
| utm_content | which copy or placement | poster_entrance |
Consistency is everything. If the source is “qr” on one code and “QR-code” on another, analytics treats them as two separate rows. Stick to lowercase and underscores; we turn spaces into underscores for you.
utm_content is your sharpest tool. Within one campaign, give every printed placement its own value (entrance, counter, window). You'll see exactly which poster brings people in, with one download per code and no subscription.
Where to find the scans in GA4
- A test scan appears in the Realtime report almost instantly. Scan the code with your phone and look at the source/medium card.
- Later, open Reports → Acquisition → Traffic acquisition, switch the dimension to Session source / medium, and look for “qr / print”.
- Split campaigns with Session campaign, and placements with Session manual ad content (that's utm_content).
In Plausible, the same data lives under the UTM Source / Medium / Campaign tabs of the Sources panel. In Matomo, look under Acquisition → Campaigns.
One honest caveat: this counts visits to your page, not raw scans. If someone scans without a signal, or declines cookies, they won't show up. In practice that's the more useful number anyway, because it measures what matters for your business: how many people actually reached your page.
Tips for print campaigns
- Short values, lighter code. UTM parameters make the link longer, and a longer link makes a denser code. Keep values short (
qr,print) and don't repeat the same word across fields. - Test before you print. Scan the finished code and confirm in the realtime report that the source looks right.
- No reprint needed when the campaign ends: the link keeps working; only the campaign name stays the old one.
- Keep personal data out of UTMs (names, emails). They're visible in the address bar and in your analytics.
- A frame with a call to action gets more scans: “Scan to see the deal!”
You can add a logo, colors and a frame exactly as in the QR code generator, and before you download, two independent decoders confirm the code returns your exact UTM link.
When do you actually need a dynamic code?
If you want to change the destination later, UTMs won't help, because the code's content is fixed. You still don't need a QR subscription: put a permanent address on your own domain in the code (say, example.com/qr/sale) and redirect it on your own hosting to wherever it needs to go. UTM tracking works the same way on top.
Already have a dynamic code? The QR code expiry checker tells you which provider's server it depends on.
Frequently asked questions
Can I track QR code scans without a dynamic code?
Yes. With UTM parameters, visits appear in your own analytics (GA4, Plausible, Matomo) with no redirect server in between.
Will a QR code with UTM parameters expire?
No. It's a static code: the whole link is inside it, with no provider or subscription behind it.
Does it count scans exactly?
It counts visits to your page. People who scan but never open the page, or who decline tracking, won't appear.
Where do I see it in GA4?
In Traffic acquisition, under the session source/medium dimension (“qr / print”). Test scans also show up in Realtime.
Do I need Google Analytics?
Any web analytics tool that reads UTM parameters works. The landing page needs your tracking tag.
Does it make the code bigger?
Slightly denser. With short values like qr and print, you'll barely notice.