Skip to main content
EZQR

Analytics QR Code

QR Code Tracking: Scan Analytics and CSV Export

Every scan of a dynamic QR passes through a redirect, and the redirect is what records it. Timestamp, city, device, browser, referrer and full UTM set, exported to CSV or pulled through the API.

Free static QR codes. Sign up to unlock dynamic codes & analytics.

Your QR code will appear here

About Analytics QR Codes

QR code analytics answer one question: did the print work? A dynamic QR encodes a short redirect URL, and every scan passes through that redirect before landing on your destination. The redirect is the measurement point. It records the scan, then forwards the visitor.

That mechanism sets a hard boundary most vendor pages skip. A static QR cannot be tracked at all. Its destination is encoded directly in the module pattern, so the scan goes phone-to-website with nothing in between to count it. No vendor can track a static code. That is physics, not a paywall, and any tool claiming otherwise is either quietly converting your code to a dynamic one or counting something else.

Exactly what one scan records

Most generators describe QR analytics in adjectives. Here is the actual record EZQR writes when a code is scanned, field by field. Every row below is a column we store, and the three derived rows are computed from the request and then discarded at source.

FieldExampleWhere it comes from
Timestamp2026-10-24 14:02:11 UTCWhen the redirect was hit
Device typeMobile, Tablet or DesktopDerived from the user-agent: three values, nothing finer
BrowserSafariDerived from the user-agent
Operating systemiOSDerived from the user-agent
CountryUnited KingdomEdge geo lookup on the request
CityManchesterEdge geo lookup, Pro and above
Referrerinstagram.comSent by the scanning app, often empty for a camera scan
Landing URLThe destination at the moment of the scanCaptures the repoint history implicitly
UTM source / medium / campaign / content / termflyer / print / spring_saleWhatever you attached to the destination
Anonymous ID + session IDOpaque identifiersSeparates a repeat scan from a first one

What is not stored: the raw IP address and the full user-agent string. The IP is used for the geo lookup and for rate limiting and is then dropped; the user-agent is reduced to the three rows above and discarded. Neither is written to the scan record.

What the numbers cannot tell you

This is the part a tracking page usually leaves out, and it is the part that decides whether you can trust a report.

A scan is not a person. A QR scan usually opens in a fresh in-app browser with no history, so the anonymous ID separates repeat scans well within a session and poorly across days. Treat unique scans as a close estimate, never as a headcount.

A quiet code is ambiguous. Zero scans can mean nobody saw the placement, or that the printed code is too small to resolve at the distance people stand. The analytics cannot distinguish those, which is why the size guide matters before the campaign, not after.

Referrer is usually empty. A scan from the native camera app carries no referrer, so that column tells you about in-app scans and little else.

Very high bursts are excluded on purpose. The redirect allows 300 scans a minute from one address before it stops recording. Past that the code still redirects, a printed code is never made to fail to protect a chart, but the excess is left out of the numbers rather than inflating them.

A static code records nothing at all. There is no redirect to pass through, so there is nothing to count. That is a property of the format, not a plan restriction.

What each plan actually sees

Analytics depth is the main thing the tiers differ on, so it is worth stating plainly rather than as a feature grid.

PlanHistory keptLocation detailExport
FreeScan count onlyNoneNone
Lite, $5/mo30 daysCountryNone
Pro, $10/moFull historyCountry and cityCSV
Max, $20/moFull historyFullCSV and REST API

The free tier reports a number and nothing behind it. If the question is "which of my ten placements worked", that needs Lite at minimum and one code per placement.

  • Decide the reporting question before printing. Ten placements sharing one code produce one number that cannot be split afterwards, and no plan can recover the breakdown later.
  • If the scans need to sit beside your other campaigns, put UTM tags on the destination and the same scan appears in both EZQR and GA4.

Walkthrough

How to Create an Analytics QR Code

  1. Create the code as dynamic, not static

    Analytics require a redirect, so the code has to be dynamic from the start. Pick a dynamic QR when you create it. Converting later means reprinting, because the encoded pattern changes.

  2. Add UTM parameters if you use GA4

    Set utm_source, utm_medium and utm_campaign on the destination. EZQR appends them to the forwarded URL, so the same scan appears in both EZQR and your Google Analytics property. Without UTMs, GA4 files QR traffic under direct.

  3. Give every placement its own code

    Give each physical placement its own code. One code across ten locations produces a single number that cannot tell you which of those ten locations earned it, which is the question you printed the code to answer in the first place. Ten codes produce ten numbers, and the comparison between them is the actual insight.

  4. Read the dashboard

    Scans appear with timestamp, city and country, device type, browser and operating system, referrer, and any UTM values you attached to the destination before printing. Totals and unique counts are shown separately, because the gap between them is what tells you whether one person scanned repeatedly or many people scanned once.

  5. Export to CSV or pull through the API

    Pro exports full scan history to CSV. Max adds REST API access so scan data lands in your warehouse or BI tool without a manual download.

Analytics QR Code FAQ

Common questions about generating, printing, and deploying these codes.

How does scan attribution work?

Two mechanisms, and they answer different questions. The first is one code per placement: a scan can only ever be attributed to the code that was scanned, so if the same code goes on ten posters you get one number and no way to split it. Generate a separate dynamic code for each poster, table tent or mailer and the attribution is structural rather than inferred. Folders keep that organised: 10 on Lite, 25 on Pro, unlimited on Max. The second is UTM parameters on the destination: EZQR records all five (source, medium, campaign, content, term) against the scan and forwards them to the destination, so the same scan is attributable in your own analytics too. Each scan also carries the referrer and the final landing URL.

Can I see repeat scans, or only totals?

Both. Each scan carries an anonymous visitor ID and a session ID, so repeat scans are distinguishable from first-time ones and multiple scans inside one session are not counted as separate people. That is the honest limit of engagement measurement from a redirect: it tells you how often a code is scanned and how much of that is the same device coming back, not who the person is or what they did after they landed. Anything past the redirect (time on page, items added to a basket, a form submitted) belongs to your own analytics, which is what the UTM pass-through is for.

Does this work for an organisation with many codes and several people?

Up to a point, and the limits are worth knowing before you commit. Max at $20/mo adds 5 team seats, unlimited dynamic codes, unlimited folders, REST API access and scan-threshold email notifications. Pro at $10/mo is single-user but carries full scan history, CSV export, A/B testing and 100 dynamic codes. Neither tier offers SSO, audit logs, or role-based permissions beyond simple team membership, so an organisation that needs those should evaluate an enterprise platform instead. Saying otherwise would waste your procurement cycle.

What analytics does each plan include?

Free records scan counts only, with no location data and no history. Lite at $5/mo adds 30 days of history and country-level location. Pro at $10/mo unlocks full history with no retention limit, city-level location, CSV export and A/B testing. Max at $20/mo adds region-level detail, API access, team seats and scan notifications. The redirect records the same fields on every plan; the plan decides how much of it you can see and keep.

What exactly gets recorded on each scan?

Timestamp, country, city and region, device type, browser, operating system, referrer, the final landing URL, and all five UTM values (source, medium, campaign, content, term). Each scan also carries an anonymous visitor ID and a session ID so repeat scans are distinguishable from first-time ones, plus the variant name when A/B testing is active. No name, email, phone number or precise location is captured, because a redirect has no access to any of it.

Does tracking slow down the scan?

No. The redirect responds first and the scan is written afterwards, outside the request that the visitor is waiting on. The scanner gets its redirect immediately, and the analytics write happens in the background. The redirect also carries an X-Robots-Tag noindex header so tracking URLs never enter search results.

Can I track a static QR code?

No, and neither can anyone else. A static code encodes the destination directly in the black-and-white pattern, so the phone goes straight to your site with no intermediate step to count. There is nothing to instrument. If you need scan data, the code has to be dynamic before it goes to print. The one partial workaround is putting a UTM-tagged URL inside a static code, which gives you GA4 sessions without scan-level detail, and locks those UTM values into the printed pattern forever.

How accurate is the location data?

City-level and directional. Location is derived from the IP address at the edge, not from device GPS, because a web redirect cannot request location permission. Mobile carriers frequently route traffic through gateways in another city, and corporate VPNs will place a scan in whichever country the exit node sits. Country data is reliable enough to act on. City data is useful in aggregate and wrong often enough that you should not build a decision on a single row.

Will scan data appear in Google Analytics?

Yes, if you set UTM parameters. EZQR forwards them to the destination URL, so GA4 attributes the session to your campaign instead of filing it under direct traffic. The two systems count different things and will not match exactly: EZQR counts redirects, GA4 counts sessions that finished loading. Scans where someone closes the browser mid-load appear in EZQR and never reach GA4, so EZQR totals normally run slightly higher.

Written by Tasnim Ahmed, Founder · Last updated

Related Articles

Related Industries

Related Guides

Related Tools

Make an Analytics QR code

Static codes are free and carry no watermark. Dynamic codes, which you can repoint after printing, start at $5 a month.

Generate Free QR Code