Skip to content

QR code UTM builder

You don't need a dynamic QR code to count scans. Add UTM parameters to your link, and visits from the code show up in your own Google Analytics (GA4), Plausible or Matomo. The code stays static: no redirect server, no subscription, no expiry date.

  • Free, no limits
  • No sign-up
  • No watermark
Everything happens in your browser; your data is never uploaded.
  • ✓ Free
  • ✓ No sign-up
  • ✓ Nothing uploaded

Next step

What to do next

How to use it

  1. Enter the web address the code should open.
  2. Pick a preset (poster, flyer, packaging…) or fill in source, medium and campaign yourself.
  3. Give each placement its own utm_content value, like poster_entrance or poster_counter.
  4. Download the code, scan it once, and check the real-time report in your analytics.
Try it now

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?

ParameterWhat it meansExample
utm_sourcewhere the visitor comes fromqr
utm_mediumwhich channelprint, packaging, poster
utm_campaignwhich campaignspring_sale
utm_contentwhich copy or placementposter_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

  1. A test scan appears in the Realtime report almost instantly. Scan the code with your phone and look at the source/medium card.
  2. Later, open Reports → Acquisition → Traffic acquisition, switch the dimension to Session source / medium, and look for “qr / print”.
  3. 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.

Sources

Recommended

Similar tools

If QR code UTM builder helped, you may need these too.

See all in category →

People also use