---
title: "UTM Link Tracking: Minimal End-to-End Analytics Setup"
description: "Build a UTM link tracking system without an agency: five parameters, free tools, one spreadsheet, and a data copy that outlives Google Analytics."
canonical: https://adsbeast.pro/blog/en/utm-link-tracking-minimal-end-to-end-analytics-setup
language: en
published: 2026-10-03T00:39:31.387Z
updated: 2026-10-03T00:39:31.388Z
author: "ADS Beast editorial team"
translations:
  - ar: https://adsbeast.pro/blog/ar/utm-link-tracking-minimal-end-to-end-analytics-setup
  - es: https://adsbeast.pro/blog/es/analitica-de-extremo-a-extremo-sin-proveedor-kit-minimo
  - he: https://adsbeast.pro/blog/he/utm-link-tracking-minimal-end-to-end-analytics-setup
  - ru: https://adsbeast.pro/blog/ru/skvoznaya-analitika-svoimi-silami-minimalnyy-nabor
  - sk: https://adsbeast.pro/blog/sk/utm-link-a-skrzynkova-analytika-bez-dodavatela
  - uk: https://adsbeast.pro/blog/uk/naskrizna-analitika-bez-pidryadnika-minimalniy-nabir
---
# UTM Link Tracking: End-to-End Analytics Without an Agency

A minimal end-to-end analytics setup needs three things: a naming convention for your utm link parameters, tagged URLs built in Google's Campaign URL Builder, and one place where the data lands. Google Analytics 4 plus Search Console covers reporting. A spreadsheet or CRM covers storage. Setup takes about two hours and costs nothing.

In short:

- Three parameters are mandatory: utm_source, utm_medium, utm_campaign. Two more are optional and situational.
- Build every tracking URL in the google url builder, never by hand. Hand-typed parameters are the main cause of broken reports.
- GA4 keeps event data for 14 months by default. Push UTM values into your CRM or a sheet at form submission if you need a longer record.
- Test each link in an incognito window before it goes live. Redirects and link shorteners strip query strings.
- Free tools cover the whole stack. Paid analytics platforms are optional, not a prerequisite.

## What is a UTM link and what does it actually do?

A UTM link is a normal URL with extra query parameters appended to it that tell your analytics platform where the click came from. When a visitor lands on your page, Google Analytics reads those parameters and files the session under the correct source, medium, and campaign instead of dumping it into "(direct)" or "(not set)".

The mechanism is simple and old, which is why it still works. The parameters ride along in the URL string, survive the browser's navigation, and get picked up by the analytics script on page load. Nothing else is required: no cookies, no server configuration, no vendor contract.

That simplicity is also the weakness. Anything that rewrites the URL on the way, a redirect, a link shortener, an email client that mangles long strings, can drop the parameters. The visitor still arrives, but the session arrives anonymous.

If you want the full parameter-by-parameter breakdown before you build anything, the guide on [how to create the right campaign link](/blog/en/utm-builder-how-to-create-the-right-campaign-link) covers the mechanics in detail. This article stays focused on the minimum you need to run end-to-end reporting yourself.

## Which UTM parameters do you actually need?

Three parameters are mandatory, and two more are worth using in specific cases. Everything else fragments your reports.

| Parameter | Required? | What it records | When to add it |
|---|---|---|---|
| utm_source | Yes | The platform or property sending traffic (google, newsletter, partner-site) | Always |
| utm_medium | Yes | The channel type (cpc, email, social, referral) | Always |
| utm_campaign | Yes | The specific initiative (spring-sale, launch-webinar) | Always |
| utm_content | Situational | Which creative or link variant was clicked | When two creatives run in one campaign |
| utm_term | Situational | The paid keyword | Paid search only |

The reason to keep the set small is reporting. Every additional parameter becomes a column in GA4, and every column multiplies the number of distinct rows. A campaign with four creatives and no utm_content is one line in your report. Add utm_content and it becomes four, which is useful if you plan to compare them and noise if you don't.

The utm code itself is case-sensitive. "Google" and "google" are two different sources in GA4. "Paid_Social" and "paid-social" are two different mediums. Pick lowercase, pick hyphens instead of spaces, and write the convention down before the first person besides you starts building links.

utm_term is the one parameter most people should skip. In GA4, paid keyword data already flows in through the Google Ads integration, and duplicating it in the URL creates a second, usually messier, version of the same fact. Add utm_term only when you're tracking paid search through a platform that doesn't hand keywords to GA4 directly.

## How do you build a tracking URL step by step?

Build every link in the google url builder rather than typing parameters manually. The tool prevents the two most common errors: misspelled parameter names and unencoded special characters.

1. Open Google's Campaign URL Builder (search "campaign url builder" or reach it through the GA4 help docs).
2. Paste the full destination URL, including https://. Do not paste a shortened link.
3. Fill in utm_source, utm_medium, and utm_campaign using your naming convention.
4. Add utm_content or utm_term only if this specific link needs them.
5. Copy the generated URL and paste it into the ad, email, or post.
6. Open the link in an incognito window and confirm the parameters survive to the landing page. Check the address bar, not just the page content.

Step six is the one people skip and the one that catches the most problems. A link that looks correct in the builder can still lose its parameters if the destination redirects. If you use a custom url builder built into your CRM or email platform, the same rule applies: verify the final URL in the address bar, not the one you pasted.

For paid campaigns, remember that tracking google ads clicks depends on the platform's own auto-tagging (gclid) working alongside your manual UTM tags. If both are active and the UTM medium conflicts with what Google Ads reports, you get two rows for one campaign. Keep utm_medium consistent with the channel and let auto-tagging handle the rest.

## How do you connect GA4 and Search Console so the data lands in one place?

Connect both tools to the same GA4 property. Traffic from tagged links and organic search then appears in one reporting surface, and you stop reconciling two dashboards that count different things.

In GA4, the Search Console link lives under Admin, then Product links. Once linked, the Search Console reports appear inside GA4 under Reports, then Search Console. You don't need to export anything or build a bridge; the integration is native.

Two settings are worth checking on day one. First, confirm that your GA4 data stream is receiving events at all by opening Realtime and clicking one of your own tagged links. Second, check the data retention setting under Admin, then Data settings, then Data retention. The default is 14 months, and that ceiling is the reason the next section exists.

The reason to connect Search Console at all, rather than just watching GA4, is that organic search traffic arrives untagged by definition. Nobody appends UTM parameters to a Google search result. Search Console is the only place that tells you which queries produced those sessions, and linking it puts that context next to your campaign data.

## Why do UTM reports show "(not set)" or "(direct)"?

"(not set)" and "(direct)" almost always mean the parameters never reached the analytics script. The link worked, the visitor arrived, but the tagging was lost somewhere between the click and the page load.

The usual causes, in rough order of frequency:

- A redirect between the tagged URL and the final page stripped the query string. Fix: tag the final destination URL, not the intermediate one.
- A link shortener replaced your long tagged URL with its own. Fix: tag the destination the shortener points to, or stop using shorteners for tracked links.
- Capitalization or spacing broke the parameter name. "utm source" with a space, or "UTM_Source", is not read as utm_source.
- The URL contains two question marks, so everything after the second one is treated as part of the first parameter's value.
- The landing page is on a different domain than the one your GA4 property tracks, so the parameters arrive but nothing reads them.

Test in incognito, because your own browser may have a cached session that hides the problem. Paste the tagged URL, let the page load, and read the address bar. If the parameters are gone there, the problem is upstream of analytics and no GA4 setting will fix it.

There's a related failure mode on the paid side. When your ad account and your CRM report different conversion numbers for the same campaign, the cause is usually attribution rather than tagging. The article on [why your ad account and your CRM never agree](/blog/en/why-your-ad-account-and-your-crm-never-agree) walks through where the two systems diverge, and the piece on the [attribution window](/blog/en/attribution-window-why-the-same-period-shows-different-numbers) explains why the same period can produce two different totals.

## Where should UTM data live so it survives beyond GA4?

Push UTM values into your CRM or a spreadsheet at the moment of form submission. That copy is the only long-term record you control, because GA4's default retention is 14 months and no export schedule changes that ceiling retroactively.

The practical method is hidden form fields. Your form captures utm_source, utm_medium, and utm_campaign from the URL and submits them alongside the name and email, invisibly to the visitor. From there the values go wherever your stack sends form submissions: HubSpot, Airtable, Google Sheets, or your own database.

This matters most for anything with a long sales cycle. If someone clicks a campaign link in month one and converts in month nine, GA4 may still have the session but your ability to join it to the deal record depends on what you captured at submission time. Building the hidden fields takes minutes. Reconstructing the data later is impossible.

If you're running paid social, check that your pixel is passing the same values. A [Meta Pixel that isn't firing](/blog/en/meta-pixel-not-firing-troubleshooting-checklist) breaks the chain on the ad platform side even when your UTM tagging is perfect. And if you later move conversion tracking server-side, the piece on [server-side conversion tracking without double-counting](/blog/en/server-side-conversion-tracking-how-to-enable-without-double-counting) covers how to keep the UTM values attached through the switch.

## What does the minimal stack cost?

Zero to about $50 per month, and most of that is optional. Google Analytics 4, Google Tag Manager, Looker Studio, and Search Console are free. A domain runs roughly $10 to $15 per year. A landing page builder costs something only if you don't already have a site.

Paid analytics platforms such as Plausible or Fathom run about $9 to $14 per month and offer a simpler interface and longer default retention. They are a reasonable upgrade once you know what you're looking at, not a starting requirement. Adding a paid tool before you have a naming convention and a storage destination just gives you a second place to find "(not set)".

The real cost of this setup is time, and it splits unevenly. Building the first batch of links takes minutes. Writing down the naming convention and getting everyone who touches campaigns to follow it is the part that determines whether your reports stay readable six months from now. Results depend on how consistently the convention is applied, not on which tools you pay for.

## Next step

Build your five-column spreadsheet now, before the next campaign goes out: source, medium, campaign, content, term. Fill the first three columns with the values you'll actually use, then create your first tagged URL with the [utm link](/features/en/tracking) builder and test it in incognito. That single loop, convention, build, verify, is the whole system. Everything else is scale.

## FAQ

**How do I set up UTM tracking without hiring an agency?**
Create a spreadsheet with five columns: source, medium, campaign, content, and term. Build your URLs in Google's Campaign URL Builder, then paste the tagged links into your ads, emails, and social posts. Connect GA4 and Search Console to the same property so all traffic lands in one place. The setup takes about two hours and costs nothing.

**What UTM parameters do I actually need for end-to-end analytics?**
Three are mandatory: utm_source, utm_medium, and utm_campaign. Add utm_content when you test two creatives in the same campaign, and utm_term only for paid search keywords. Skip the rest. Extra parameters split your reports into fragments nobody reads, and each one becomes another column to maintain.

**Why do my UTM reports show "(not set)" or "(direct)" for tagged links?**
This happens when the link redirects, gets shortened, or the parameter is misspelled. Check for uppercase letters, spaces, and double question marks in the URL. Test every link in an incognito window before publishing. If a redirect strips the query string, tag the final destination URL instead of the short one.

**How much does a minimal end-to-end analytics stack cost per month?**
Zero to about $50. Google Analytics 4, Google Tag Manager, Looker Studio, and Search Console are free. You may pay for a domain ($10 to $15 per year) and a landing page builder if you don't have a site. Paid tools like Plausible or Fathom run $9 to $14 per month, but you don't need them to start.

**Where should I store UTM data so it survives beyond Google Analytics?**
Push UTM values into your CRM or a spreadsheet at the moment of form submission. Use hidden fields in your form to capture source, medium, and campaign, then send them to HubSpot, Airtable, or Google Sheets. GA4 keeps data for 14 months by default, so your own copy is the only long-term record.

**Can I use UTM tags on links inside my own website?**
No. Internal links with UTM parameters overwrite the original source of the session, so a visitor who arrived from a newsletter and then clicked an internal tagged link gets recorded as a new session from whatever you tagged. Use UTM parameters only on links that point to your site from somewhere else.

## Questions and answers

### How do I set up UTM tracking without hiring an agency?

Create a spreadsheet with five columns: source, medium, campaign, content, and term. Build your URLs in Google's Campaign URL Builder, then paste the tagged links into your ads, emails, and social posts. Connect Google Analytics 4 and Google Search Console to the same property so all traffic lands in one place. The whole setup takes about two hours and costs nothing.

### What UTM parameters do I actually need for end-to-end analytics?

Three are mandatory: utm_source, utm_medium, and utm_campaign. Add utm_content when you test two creatives in the same campaign, and utm_term only for paid search keywords. Skip the rest; extra parameters split your reports into fragments nobody reads.

### Why do my UTM reports show '(not set)' or '(direct)' for tagged links?

This happens when the link redirects, gets shortened, or the parameter is misspelled. Check for uppercase letters, spaces, and double question marks in the URL. Test every link in an incognito window before publishing. If a redirect strips the query string, tag the final destination URL instead of the short one.

### How much does a minimal end-to-end analytics stack cost per month?

Zero to about $50. Google Analytics 4, Google Tag Manager, Looker Studio, and Search Console are free. You may pay for a domain ($10–15 per year) and a landing page builder if you don't have a site. Paid tools like Plausible or Fathom run $9–14 per month, but you don't need them to start.

### Where should I store UTM data so it survives beyond Google Analytics?

Push UTM values into your CRM or a spreadsheet at the moment of form submission. Use hidden fields in your form to capture source, medium, and campaign, then send them to HubSpot, Airtable, or Google Sheets. GA4 keeps data for 14 months by default, so your own copy is the only long-term record.

