GA4 Link Tracking: Track Clicks and Campaigns in Google Analytics 4
The 2026 guide to GA4 link tracking. Enhanced measurement, UTM setup, custom events in GTM, plus how to combine short-link analytics with GA4 for full attribution.
GA4 link tracking is the practice of measuring link interactions inside Google Analytics 4, using three layers that work together: enhanced measurement (which auto-tracks outbound clicks and file downloads), UTM parameters (which attribute incoming visits to a source, medium, and campaign), and custom events fired from Google Tag Manager (which capture internal clicks, CTA presses, and any interaction the defaults miss). Combining all three gives you a full picture of which links people click, where they came from, and what they did next.
You launched a campaign. Traffic went up. GA4 says "direct" grew by 40% and the referral report is oddly quiet. Somewhere in there, real people clicked real links from real places, and yet the report reads like a shrug. This is the default state of Google Analytics 4 for anyone who hasn't set up link tracking properly, and it's the reason so many marketing teams still make budget decisions on gut feel dressed up as data.
The good news is that GA4 does track links, and it does it in three overlapping ways that most guides confuse for one another. Enhanced measurement handles outbound clicks and file downloads out of the box. UTM parameters attribute incoming visits from external sources. Custom events, fired through Google Tag Manager, cover everything the first two miss (internal links, CTA buttons, sub-navigation clicks, form-adjacent links). Getting all three wired correctly turns GA4 from a vanity dashboard into an actual attribution tool.
This guide walks through exactly how to set each layer up, where the data shows up in GA4, and the specific pitfalls that quietly break tracking (self-referral loops, cross-domain exclusions, UTM parameters on internal links) even when the setup looks fine. By the end you'll have a working stack that answers "which link drove that conversion" instead of "we got some traffic."
Table of Contents
- What Is GA4 Link Tracking?
- Layer 1: Enhanced Measurement (The Free Auto-Tracking)
- Layer 2: UTM Parameters for Incoming Traffic
- Layer 3: Custom Click Events in Google Tag Manager
- Combining Short-Link Analytics with GA4
- Where to Find Link Click Data in GA4
- Common GA4 Link Tracking Mistakes
- Frequently Asked Questions
What Is GA4 Link Tracking?
GA4 link tracking is the collection of methods used to capture and attribute link interactions inside Google Analytics 4, spanning three layers: automatic outbound and download tracking from enhanced measurement, UTM parameter attribution for inbound traffic, and custom click events fired through Google Tag Manager for any interaction the defaults miss.
The confusing part about GA4, especially if you're coming from Universal Analytics, is that "link tracking" isn't one setting or one report. It's a stack. The default web data stream will start logging some link data the moment you install the tag, more of it if you flip the enhanced measurement toggle, and all of it only if you layer in Google Tag Manager plus a UTM strategy for anything driving traffic in from outside.
Miss any layer and there's a gap. Enhanced measurement alone tells you who's clicking away from your site but nothing about internal CTA clicks. UTMs alone tell you where inbound traffic came from but nothing about what people click after they arrive. Custom events alone are a maintenance nightmare if you try to reimplement things GA4 already does for free. The stack matters more than any single piece.
One thing worth being upfront about: GA4 does not natively track clicks on links that live inside third-party surfaces (an Instagram bio, a TikTok description, a QR code on a poster). Those clicks happen before your GA4 tag ever loads. To measure them, you need the click captured at the redirect layer, which is what URL shortener analytics do. We'll cover how to pair a shortener with GA4 in a later section, because for most real-world campaigns, that's where the interesting attribution actually lives.
Layer 1: Enhanced Measurement (The Free Auto-Tracking)
Enhanced measurement is a toggle inside your GA4 web data stream that, when enabled, automatically fires events for a handful of common interactions without requiring any code changes. For link tracking specifically, the two events that matter are click (for outbound links) and file_download (for links pointing at common file extensions).
Outbound clicks are logged when a visitor clicks a link that goes to a different domain than the one your GA4 stream is configured for. The event includes link_url, link_domain, link_classes, link_id, and an outbound: true parameter. If you're the sort of person who publishes a lot of external references and wants to know which ones people actually pursue, this is where that data lands.
File downloads fire when the clicked link's URL ends in a recognized extension. Google's default list covers PDF, Office documents (doc, xls, ppt and their newer x-suffix versions), archives (zip, rar, 7z, gz), executables (exe, key, pkg), and common audio/video formats (mp3, mp4, mov, wav, mid). If you publish PDFs, a resume, a whitepaper, or a media file, you're already getting download counts even if you never wrote a line of tracking code.
How to Enable Enhanced Measurement
- Open your GA4 property, click the gear icon, and go to Data streams.
- Click your web data stream.
- In the Enhanced measurement card, toggle it on.
- Click the gear icon inside that card to open the sub-toggles. Confirm Outbound clicks and File downloads are both on.
- Save. Events start flowing within minutes.
That's it. No GTM tag, no code, no property release cycle. For a huge percentage of small-site tracking needs, this is the entire setup.
The Limitations (Read These Before You Rely on It)
Enhanced measurement is the low-effort layer, which means it's also the low-control layer. A few caveats worth knowing before you build reports on top of it:
- You can't filter which outbound links get tracked. Every external click fires an event, including clicks on your own social profile links, analytics badges, and any hardcoded partner links. Reports get noisy fast if you have a lot of secondary outbound links.
- Link text isn't captured. GA4 records the URL, the domain, and the HTML
id/class, but not the visible anchor text. If your CTAs share URLs but have different button labels, enhanced measurement can't tell them apart. - Cross-domain configured links are excluded. Any domain listed in your GA4 tag's cross-domain measurement config is treated as internal traffic and won't fire outbound events, which is usually what you want but occasionally trips people up.
- You can't add custom parameters. If you want to attach a
button_variantorpage_sectionvalue to a link click, enhanced measurement won't do it. You need a custom event.
For those cases (and there are more of them than you'd expect), you'll want Layer 3. Google's own outbound click tutorial covers a lot of the same ground if you want to double-check the mechanics.
Layer 2: UTM Parameters for Incoming Traffic
The single most valuable thing you can do to make GA4 useful is start tagging every marketing link with UTM parameters. UTMs are the reason your traffic acquisition report has categories instead of a giant "direct" bucket, and they're the only reliable way to attribute clicks from platforms that don't pass a referrer (which is basically every mobile app in 2026).
UTMs are appended to the URL as query parameters. The GA4 tag reads them when the page loads and files the session under the matching source, medium, and campaign values. There are five of them:
- utm_source - the specific platform (
facebook,newsletter,linkedin) - utm_medium - the channel type (
email,social,cpc,affiliate) - utm_campaign - the campaign name (
spring-launch-2026,black-friday) - utm_term - paid search keyword (mostly auto-handled by Google Ads now)
- utm_content - a differentiator within one campaign (
header-cta,video-a)
Our deeper walkthrough on how to build UTM-tagged URLs covers every parameter in detail, along with a naming convention we've used across dozens of campaigns. If you're new to UTMs, read that first, then come back for the GA4-specific bit below.
Where UTM Data Lives in GA4
Once tagged links start hitting your site, GA4 automatically parses the parameters into session-scoped dimensions. You'll find them under Reports → Acquisition → Traffic acquisition as the columns "Session source", "Session medium", and "Session campaign". For a specific campaign report, use the Explore section, build a free-form exploration, and add the campaign dimension as a row with sessions, engaged sessions, and conversions as columns.
Two things to know that catch people off guard. First, GA4 uses session source/medium (based on the first hit of a session) rather than the older Universal Analytics "campaign" attribution model - which means if a user arrives from a UTM'd link, browses to another page, then reloads the page without UTMs, the second session still gets attributed to the campaign if it's within the same session window (30 minutes of inactivity by default).
Second, GA4 has a default_channel_group dimension that automatically buckets your UTMs into standard channels (Paid Search, Organic Social, Email, etc.). This uses Google's channel definitions, which are opinionated - utm_medium=email maps to Email, utm_medium=cpc maps to Paid Search, and anything you invent gets dumped into (Other). Sticking to standard medium values is the difference between a clean report and a report full of unclassified traffic.
Layer 3: Custom Click Events in Google Tag Manager
For everything enhanced measurement doesn't cover (internal CTA clicks, sub-navigation, promo tile clicks, links inside a paywall), you need to fire custom events yourself. The cleanest way to do this in 2026 is through Google Tag Manager (GTM), which lets you configure triggers on any click without touching your site's HTML.
Step 1: Enable Click Variables in GTM
In your GTM container, go to Variables → Configure, then enable all the "Clicks" built-in variables: Click Element, Click Classes, Click ID, Click Target, Click URL, and Click Text. These are the ingredients your trigger and tag will use.
Step 2: Create the Click Trigger
Go to Triggers → New. Pick the "Just Links" trigger type (this waits for the browser to resolve the click into a real link before firing, which prevents lost events). Set "This trigger fires on" to Some Link Clicks, and configure the filter that matches the links you care about - for example, Click Classes contains cta-primary or Click URL contains /pricing.
Step 3: Build the GA4 Event Tag
Go to Tags → New, pick "Google Analytics: GA4 Event", and select your GA4 configuration tag. Set the event name to something descriptive like cta_click or internal_link_click. Under Event Parameters, add rows for link_url = {{Click URL}}, link_text = {{Click Text}}, and any other context you want (e.g., page_location, button_variant).
Step 4: Attach the Trigger and Publish
Under Triggering, add the trigger you built in step 2. Preview the container, click a matching link, confirm the event fires and the parameters populate. Publish the workspace.
Step 5: Register Parameters as Custom Dimensions in GA4
By default, GA4 won't expose your custom parameters in reports. Go to Admin → Custom definitions → Create custom dimension, name it "Link Text", scope Event, and match the parameter name exactly (link_text). Repeat for any other parameters. It takes 24-48 hours for the dimension to backfill in most reports.
Once you've done this once, cloning the tag for other link groups is quick. Most teams end up with three or four custom link click tags: primary CTAs, navigation items, promo tiles, and pricing table links. That's usually enough to answer the "which link on the page actually converts" question that generic session data can't.
Combining Short-Link Analytics with GA4
Here's the gap GA4 can't close on its own: it only sees clicks that end up on a page with your GA4 tag installed. Any click that dies before that - a UTM stripped by an in-app browser, a mobile OS killing the referrer, a user closing the tab mid-redirect - is invisible. And crucially, GA4 can't see the click at all if the link is on someone else's platform.
That's where URL shortener analytics come in. When you share u2l.ai/spring-launch instead of a raw URL, every click hits the shortener's edge servers first. The click is logged with full metadata (geo, device, OS, browser, referrer, timestamp) before any redirect happens. Then the user lands on your site, GA4 sees the UTM'd session, and you have data on both sides of the redirect.
We built U2L AI's URL shortener partly around this - the shortener captures the click at the redirect layer, the built-in analytics dashboard shows the aggregate view, and every generated link supports UTM parameters so the same click also gets attributed inside GA4. Full disclosure: U2L AI is our product; we mention it because the "shortener + GA4" pairing is what actually makes attribution work across platforms that GA4 can't reach directly.
A common pattern we see teams adopt looks like this:
- Every campaign link is created inside U2L AI (or your shortener of choice) with UTM parameters baked in.
- The shortener dashboard becomes the "who clicked, from where, on what device" source of truth for the click itself.
- GA4 becomes the "what did they do after the click" source of truth for on-site behavior.
- GA4's default_channel_group + your UTM naming convention gives you the campaign roll-up.
The two data sources rarely match to the click. GA4 will always show fewer clicks than the shortener because some users bounce during the redirect, some kill the tab, and some devices strip parameters. That's not a bug - it's the difference between "clicks fired" and "sessions started." Both numbers matter, and neither one alone tells the full story.
Where to Find Link Click Data in GA4
Once events start flowing, the reports don't automatically appear. GA4 hides most of the useful link data behind reports you have to build yourself. Here's the map:
- Outbound clicks - Reports → Engagement → Events. Filter for
event_name = clickand addoutboundas a secondary dimension (register it as a custom dimension first if you haven't). - File downloads - Same report. Filter for
event_name = file_download. Addfile_nameandfile_extensionas parameters in the exploration. - Custom link click events - Reports → Engagement → Events. Look for whatever you named your event (
cta_click,internal_link_click). Drill in to see parameters. - Campaign attribution (UTMs) - Reports → Acquisition → Traffic acquisition. Group by "Session campaign" or "Session source / medium".
- Landing page attribution - Reports → Engagement → Landing page. Cross-reference with campaign to see which UTM'd landing pages actually kept visitors.
For anything more custom, use Explore → Free-form exploration. Add event_name as a row, then any parameter you've registered as a custom dimension as an additional row, then sessions/users/conversions as values. It's more work than Universal Analytics ever asked for, but the flexibility is genuinely better once you know where things are.
Common GA4 Link Tracking Mistakes
A few mistakes come up over and over. Fix these before you build any reports.
Putting UTMs on internal links. If you tag /pricing?utm_source=homepage-cta, GA4 treats that click as a new session with source=homepage-cta, which nukes the original source/medium attribution. Use custom events for internal tracking, never UTMs. This is the single most common self-inflicted attribution wound we see.
Forgetting to register custom parameters as dimensions. GA4 collects the parameters, but until you go to Admin → Custom definitions and register them, they don't show up in any report. Data is there, dashboards look empty, everyone panics.
Ignoring the cross-domain exclusion list. If your site spans multiple domains (checkout on a subdomain, help center on another), configure cross-domain measurement in your GA4 tag settings. Otherwise every jump between them creates a self-referral loop that eats attribution.
Trusting UTMs alone for mobile campaigns. In-app browsers on Instagram, TikTok, and Facebook are notorious for stripping URL parameters. If you're driving a lot of mobile social traffic and only tracking with UTMs, you're missing a chunk of the clicks entirely. This is where shortener-side click data pairs perfectly with GA4 - the shortener catches the click before the in-app browser has a chance to strip anything. Our conversion tracking guide covers how to bridge these gaps for paid campaigns.
Sampling on high-traffic reports. GA4 samples explorations that exceed 10 million events in the reporting window. If your click volumes are large and your numbers seem oddly rounded, sampling is why. Move to BigQuery export or a shortened date range.
Never checking the DebugView. GA4 has a real-time debug tool at Admin → DebugView that shows every event fired from a tagged session (enabled via the GA4 Debug Chrome extension or Preview mode in GTM). Ten minutes here saves ten hours of "why isn't my event showing up" later.
Frequently Asked Questions
Does GA4 track link clicks by default?
Yes, partially. GA4's enhanced measurement automatically tracks outbound clicks (links leaving your domain) and file downloads (links ending in common file extensions like PDF, DOCX, MP4). It does not track internal link clicks or CTA button clicks by default - those require a custom event, typically fired through Google Tag Manager.
What's the difference between UTM parameters and GA4 link tracking?
UTM parameters attribute incoming traffic to a source, medium, and campaign - they answer "where did this visitor come from?" GA4 link tracking (via enhanced measurement or custom events) captures link interactions on your site - it answers "what did they click while they were here?" You need both to see the full journey.
Why aren't my UTM parameters showing up in GA4?
The most common reasons are: parameters spelled with capital letters (utm_Source vs utm_source - GA4 is case-sensitive), parameters after a fragment (# before ? breaks parsing), self-referrals from missing cross-domain setup, or in-app browsers stripping parameters on mobile social traffic. Check GA4 DebugView with a live tagged link to isolate which layer is failing.
Can I track button clicks in GA4 without Google Tag Manager?
You can, but you shouldn't. The alternative is manually writing gtag('event', 'cta_click', {...}) calls into your site's JavaScript for every button - which is fragile, hard to maintain, and requires a code deploy for every change. GTM lets non-developers configure new click events in minutes without shipping code. If you're setting this up in 2026, use GTM.
How does GA4 handle short links (like bit.ly or u2l.ai)?
GA4 doesn't see the short link at all. The user clicks the short link, the shortener redirects them, and by the time GA4 loads on your destination page, the URL is your long URL. What GA4 sees is whatever UTM parameters the short link forwards. That's why a shortener's own analytics dashboard complements GA4 - it captures the click before the redirect, GA4 captures the session after.
How long does it take for GA4 link events to appear in reports?
Real-time and DebugView show events within seconds. The standard reports (Events, Engagement) usually populate within a few hours, but can take up to 24 hours for full backfill. Custom dimensions registered through Admin → Custom definitions can take 24-48 hours before they appear in explorations, even if the underlying parameter has been collecting for months.
Should I use UTM parameters on links inside emails?
Yes, always. Email is one of the few channels where UTM parameters reliably survive the click (unlike in-app browsers). Tag every email link with at least utm_source, utm_medium=email, and utm_campaign. Use utm_content to distinguish between multiple links in the same email (header CTA vs footer link, for example). Our email click tracking guide covers the specifics.
Can I export GA4 link click data to BigQuery?
Yes. GA4's free tier includes a daily BigQuery export you can enable at Admin → BigQuery Links. All events, including click and file_download, are exported with their full parameter set - no sampling, no dimension registration required. If you're working with high-volume link click data or want to join it against CRM or shortener data, BigQuery is where serious analysis happens.
Turn GA4 Into an Attribution Tool
GA4 link tracking is one of those quiet skills that separates marketing teams that actually know what's working from teams that guess with confidence. The setup takes an afternoon if you tackle it deliberately - toggle on enhanced measurement, standardize a UTM convention, wire up GTM for the two or three custom clicks that matter, and pair it with a shortener that captures the click at the redirect layer. It slots into the broader picture our complete guide to link tracking lays out, and what you get back is a stack that keeps paying attribution rent for years.
Ready to start collecting cleaner click data across every channel? Create a free U2L AI account and generate short links with UTM parameters baked in - the click data flows straight into your shortener dashboard, and the session data flows straight into GA4. Two views of the same truth, no gaps in between.