A field guide to tagging links so your analytics actually show what worked.
UTMs are five small query-string parameters you append to any link. When a visitor clicks the link, the parameters travel with them. Analytics tools (Google Analytics, Plausible, Matomo, GA4, HubSpot, etc.) read those parameters and group the visit under the campaign you named.
They look like this:
https://example.com/landing?utm_source=facebook&utm_medium=paid-social&utm_campaign=spring-promo-2026
Without UTMs, analytics typically reports "direct traffic" or "social referral" — broad buckets that don't tell you which ad / email / channel actually drove the visit. UTMs make that question answerable.
| Parameter | Required? | Purpose | Examples |
|---|---|---|---|
utm_source | Required | Where the traffic came from. | facebook, newsletter, podcast |
utm_medium | Required | How the traffic arrived. | cpc, paid-social, email |
utm_campaign | Required | The named campaign. | spring-promo-2026 |
utm_term | Optional | Paid search keyword. | spring-shoes |
utm_content | Optional | Differentiate variants of the same destination. | blue-button, header-cta |
utm_id | Optional | GA4 campaign identifier (linked to Campaign Manager). | cmp_4821 |
| Code | What it means | Auto-fix? |
|---|---|---|
uppercase | A value contains uppercase letters. Reports will treat the uppercase and lowercase forms as different campaigns. | Yes — Convert to lowercase. |
spaces | A value contains spaces. These become %20 in the URL. | Yes — Replace spaces with dashes. |
special_chars | A value contains characters outside [a-z 0-9 _ - .]. These can break some tracking pipelines. | Yes — Remove special characters. |
source_medium_equal | utm_source and utm_medium are identical. They're meant to capture different signals. | No — manual review. |
internal_domain | The landing URL is on your own site. UTMs overwrite the visitor's original referrer on same-site clicks. | No — usually a mistake. |
url_too_long | URL exceeds ~2000 characters. Some browsers and servers truncate at this point. | No — shorten manually. |
invalid_url | The Website URL is not a valid http:// or https:// URL. | No. |
missing_required | One of utm_source / utm_medium / utm_campaign is missing. | No. |
The CSV format is straightforward — one row per link, with these columns. The file is never uploaded; it's read by your browser, validated locally, and used to generate the tagged URLs on this page.
| Column | Required? | Maps to |
|---|---|---|
landing_url | Required | The full destination URL. |
source | Required | utm_source |
medium | Required | utm_medium |
campaign | Required | utm_campaign |
term | Optional | utm_term |
content | Optional | utm_content |
id | Optional | utm_id |
Output CSV: every input row + a built full_url column + a warnings column listing any issue codes the validator detected. The output file is UTF-8 BOM-prefixed so Excel opens it cleanly.
Every mode — single link, multi-channel, and CSV bulk — runs entirely in your browser. URLs, campaign names, and CSV files are never sent to our servers. The only thing the server sees is a small analytics beacon that records the mode (single / multi / bulk) and the URL count, used for admin analytics. No URL strings, no campaign names, and no CSV bytes are transmitted or stored.
Most analytics tools treat UTM values as case-sensitive strings. utm_source=Facebook and utm_source=facebook end up as two different rows, splitting your numbers in half. Stick to lowercase everywhere.
Yes — that's one of the most useful places. Tag every CTA in a newsletter with the same utm_campaign + a per-CTA utm_content to find out which one drives clicks.
GA4 introduced utm_id to bind a click to a Campaign Manager / Google Ads campaign ID. If you don't use those tools, leave it empty.
No — UTMs only appear on links pointing TO your site from external places (ads, emails, social posts). Search engines crawl your canonical URLs (without the parameters). The risk is internal links: don't tag those.