You can track QR Code scans in Google Analytics 4 (GA4) when every destination URL carries UTM parameters. GA4 reads those campaign tags as session source, medium, and campaign name after each scan lands. Tag the destination in a shortened Dynamic QR Code, then review the campaign in Traffic Acquisition.
Picture a marketer who prints 5,000 flyers, watches Direct traffic spike after the drop, and still can’t prove the print spend worked. Untagged QR destinations look identical to typed-in visits, so offline posters, packaging, and event materials disappear into Direct noise. Long raw UTM strings pack more modules into each QR Code and make scanning harder.
When you connect those physical placements to a clean tagged URL, offline posters no longer appear as Direct traffic. They start showing source, medium, campaign, and on-site outcomes. Bitly captures scan-level performance at the code, while GA4 shows what people do after they land.
Bitly is the marketing platform that helps businesses of all sizes see what’s working with simple, clear reporting. Marketers already use it to create QR Codes, add UTM parameters in the creation flow, and unify click and scan reporting. That workflow keeps offline codes and on-site results in one place.
Key setup rules for QR Code tracking
- Tag the destination first. GA4 attributes QR Code traffic only when the landing URL already carries UTM parameters.
- Use Dynamic QR Codes with a short destination. Short, editable destinations stay scannable and support post-print landing-page changes.
- Standardize UTM naming. Keep utm_source, utm_medium, and utm_campaign lowercase so print campaigns stay comparable in GA4.
- Confirm in Realtime, then report in Traffic Acquisition. Validate page_view source, medium, and campaign in Realtime first.
- Pair Bitly scan analytics with GA4 behavior data. Bitly shows scans, device, and location; GA4 shows engagement and conversions.
Why Google Analytics needs UTMs on QR destinations
GA4 attributes a QR Code scan when the destination URL includes UTM parameters that populate session source, medium, and campaign fields. Those values become the dimensions you filter in Traffic Acquisition after launch. Without them, the same scan still opens the page, but GA4 has no campaign signal to keep the visit out of the general Direct tracking.
There is no native “QR scan” channel in GA4. A phone scanning a QR Code simply opens a URL, so attribution depends on campaign parameters on that URL. Without them, QR landings often appear as Direct or unassigned, hiding offline return on investment (ROI).
GA4 can see sessions, engagement, and key events after the page loads. It can’t see failed scans from offline phones with no network. Google’s definitions of session source, medium, and campaign describe how these parameters appear when traffic arrives.
Bitly doesn’t replace GA4. It makes the offline entry point trackable, and pairs scan metrics with GA4’s on-site story. For more on how the two tools complement each other, see Bitly vs Google Analytics.
Build a GA4-ready destination URL
Build the destination URL first by choosing the page and adding UTMs before creating the QR Code. Working in that order locks campaign values into the encoded link before print. If you reverse the steps, you risk reprinting codes just to fix attribution later.
Choose the landing page
Pick one intentional URL per placement goal, such as an offer page, event RSVP, or product how-to. Avoid the homepage as the default. A focused landing page makes the next on-site action obvious after the user scans it.
Most QR scans happen on phones, so prefer mobile-first destinations. Unique landing pages per major placement also make both GA4 and Bitly reporting clearer. You can then compare lobby posters, packaging, and direct mail without mixing goals on one URL.
Add UTM parameters to the destination URL
Add at least utm_source, utm_medium, and utm_campaign before you generate the QR Code. Source names the placement, medium names the channel type, and campaign names the program. Those three fields are the minimum GA4 needs for clean session reporting on print traffic.
A shared UTM naming pattern keeps every team writing the same values the same way. Consistent labels stop one print program from splitting across multiple GA4 rows. Copy this QR-friendly pattern when you build the destination:
- utm_medium=qr or utm_medium=print
- utm_source = placement owner or channel (for example lobby_poster, packaging, direct_mail)
- utm_campaign = program name (for example spring_launch_2026)
- optional utm_content = creative or city variant
Full example destination:
https://www.yourcompany.com/spring-offer?utm_source=lobby_poster&utm_medium=qr&utm_campaign=spring_launch_2026&utm_content=nyc_window
| Parameter | Role | Example value | Maps in GA4 to |
|---|---|---|---|
| utm_source | Where the code lives | lobby_poster | Session source |
| utm_medium | Channel type | qr | Session medium |
| utm_campaign | Program name | spring_launch_2026 | Session campaign |
| utm_content | Variant or city | nyc_window | Manual content |
Keep values lowercase only. Never mix QR, qr, and qrcode as mediums, or the same print program splits across multiple GA4 rows. One spelling rule across agencies and vendors keeps Traffic Acquisition readable.
Google’s Campaign URL Builder is a neutral way to assemble the string. Bitly UTM tracking uses the same fields when you create a short link or QR Code. For deeper naming guidance, read our guides on UTM parameters and what UTM codes are.
Sara Dojic at Rhymetec notes the value of QR Codes tied to links so teams can track UTMs across events. Using QR Codes tied to UTM-tagged links keeps print and in-person placements comparable in GA4.
Create a trackable QR Code with Bitly
Encode the UTM-tagged URL in a Dynamic QR Code. You can edit the destination later and collect scan analytics. Editability protects the print investment when offers change, and scan analytics show whether the physical placement itself works.
Static and Dynamic QR Codes behave differently in reporting and post-print control. Static codes lock the destination at creation, while dynamic codes keep a managed redirect you can edit. Choose dynamic when you need scan logs or destination changes after the press run:
- Static QR Codes hardcode the destination and can’t report scans through a managed redirect.
- Dynamic QR Codes use a managed short URL to store scan logs and allow editable landing page destinations after printing.
In Bitly, select Create new → Create a QR Code. Paste the destination with UTMs (or toggle on UTM parameters on paid plans), design the code, then download a PNG, JPEG, or SVG. That creates a flow that keeps the tagged URL, design, and file export in one place before printing.
Shortening matters because long query strings increase module density and hurt scan reliability at distance or in low light. Paid plans that support this workflow include the UTM Builder (Core and above), redirects, and scan history windows by plan. They also include custom logos, advanced design (Core and above), and bulk creation (Growth and above).
Customized QR Codes see a 3.8x increase in scans versus uncustomized codes (Bitly, 2025). Brand color, logo, and pattern work are more than cosmetic when you need print volume. Dynamic QR Codes keep that design investment useful after the first print run because you can update destinations without reprinting.
For a full view of QR Code tracking beyond GA4 alone, our dedicated guide covers scan-side metrics in more depth. Pair those scan metrics with GA4 when you need both the offline open and the on-site outcome. Scan volume shows whether the placement works; GA4 shows what happens after the landing page loads.
Mike Ziegler at Klingspor’s Woodworking Shop describes the benefits of connecting store QR scans to clicks and sales. Combining Bitly scan data with GA4 on-site outcomes gives marketers a dual view of offline and on-site performance. That side-by-side read helps teams judge both the physical code and the landing experience.
Test the QR Code before you print
Scan on iOS and Android and confirm the full UTM string in the browser address bar. Then verify Realtime in GA4. A clean test shows the expected source, medium, and campaign on the page_view hit before any press run.
In GA4, open Reports → Realtime → Event count by Event name → page_view. Then inspect campaign, medium, and source parameter values on those hits. If those values match your UTMs, the destination is ready for print.
Common issues to check:
- Missing or truncated UTMs on the encoded URL
- Testing against the wrong GA4 property
- Ad blockers stripping measurement on the test device
- Landing on a page that doesn’t carry the GA4 tag
- A Dynamic QR Code still pointing at an older destination you meant to replace
For print quality checks, protect the quiet zone, keep strong contrast, and size the code for the intended scan distance. Place a clear call to action beside it (for example, “Scan for the spring offer”). Strong contrast and a quiet zone help phones lock onto the code on the first try.
Once you print a static code, you can’t add UTM parameters without reprinting, which is another reason to prefer Dynamic QR Codes before the print run. The same testing process pays off across print marketing placements where codes must work on the first scan. Catching a bad destination in Realtime is faster than fixing a live print error later.
Where to find QR Code traffic in GA4
To track QR Code scans in Google Analytics 4 after launch, use Reports → Acquisition → Traffic Acquisition, not User Acquisition. Choose that report when you care about each scan session. Traffic Acquisition is session-scoped, so repeat scans from the same person still show up in campaign performance.
Change the primary dimension to Session medium or Session source / medium, then add Session campaign as a secondary dimension. Session-scoped dimensions match campaign reporting for QR programs. Those settings mirror the UTM values you encoded before print.
User Acquisition focuses on first-touch acquisition, which can hide later scan sessions from the same person. Google’s Traffic acquisition report is the session-level view for ongoing campaign performance. Use it when you need every scan session, not only the first visit that acquired the user.
Treat Realtime as your pre-print check and Traffic Acquisition as your performance view after standard reports finish processing. Highlight sessions, engaged sessions, engagement rate, key events, and revenue when you configure e-commerce. Pair those on-site metrics with the session source, medium, and campaign definitions from your UTMs.
For multi-placement comparisons, build an optional free-form Explore report with Session source, medium, campaign, and key events. Then open Bitly Analytics on the same QR Code for device, location, and date scan patterns. Use both dashboards in weekly reviews so you can see the path from poster to conversion.
UTM governance for multi-placement print campaigns
One shared naming system for UTM parameters, used across marketing, agencies, and print vendors, prevents fragmented GA4 rows. Fragmentation occurs when the same medium is spelled three ways and when one program is split across multiple rows. Shared naming keeps every placement comparable in the same Traffic Acquisition view.
Use a simple governance checklist before every press run:
- Approved value list for source, medium, and campaign
- Lowercase-only rule with no mixed spellings of the same medium
- Owner field for who created the code
- Launch date on the Bitly title or campaign record
- Bitly title naming that mirrors the UTM campaign
- Pre-flight scan test on iOS and Android
Give each city, creative, or fixture a unique code or a unique utm_content value. Teams can then cut budget from weak placements. Growth and above plans support UTM tracking presets and bulk CSV (spreadsheet) upload when large programs need consistent parameters at scale.
The same framework works for packaging, direct mail, and event badges. Anytime you need link tracking for offline campaigns, standardized UTMs plus Dynamic QR Codes keep every physical placement comparable. That consistency is what makes multi-city print reporting trustworthy.
Make every offline scan measurable with Bitly and GA4
UTMs make GA4 recognize the QR Code visit. Dynamic Bitly QR Codes make the offline asset manageable and measurable at the scan layer. Together, they connect the physical open to the on-site outcome without leaving print ROI in Direct traffic.
Create one UTM-tagged Dynamic QR Code for an upcoming print piece. Validate it in Realtime before the print deadline. That’s the practical path for how to track QR Code scans in Google Analytics 4 without losing print ROI to Direct traffic.
Bitly gives marketers short branded destinations, UTM fields in the create flow, and scan analytics beside GA4, not instead of it. You get simple clarity from the first scan to the on-site result. Start with one tagged code, confirm Realtime, then scale the same pattern across placements.
Link your marketing. Connect Bitly QR Code scans to standard UTMs in GA4 today, and start producing printed-material engagement you can quantify.
Frequently Asked Questions
Can Google Analytics track QR Code scans?
Yes. GA4 tracks the website visit that follows a scan when the QR destination includes UTM parameters. You can see source, medium, campaign, engagement, and key events.
Can I track a QR Code that is already printed without UTMs?
No. If the encoded URL has no campaign parameters and no managed redirect you control, GA4 can’t reliably separate those scans from other Direct traffic. You typically need to reprint or replace the code.
What UTM medium should I use for QR Codes?
Use a single consistent value such as qr or print across the program. Keep it lowercase, and put placement detail in utm_source or utm_content so reports stay comparable. One medium spelling keeps the full print program on one GA4 row.
Where do I see QR Code traffic in GA4?
Open Reports → Acquisition → Traffic Acquisition. Switch the primary dimension to Session source / medium or Session medium, then filter for the UTM values you assigned. Session-scoped dimensions keep each scan visit visible in campaign performance.
Do I need a URL shortener for QR tracking?
You don’t need one for GA4 attribution if UTMs are present. Shortening the tagged URL, especially with Bitly, still helps when tracking QR Codes in Google Analytics. It improves scan reliability and unlocks Dynamic QR Code edits plus scan analytics.
What is the difference between Bitly scan analytics and GA4 reports?
Bitly measures the scan. Google Analytics 4 measures visits and conversions after the landing page loads. Use Bitly for scan volume, device, location, and timing on the code itself, and use GA4 for on-site engagement and conversions.


