Jaconir

Technical Guide

How to Build UTM Links for GA4 (Newsletter, Ads & Social) — Complete Guide

Learn utm_source, utm_medium, and utm_campaign naming, where GA4 shows the data, why hash links cannot be tagged, and how to pair UTMs with HTML newsletters — free, private.

Marketing
August 16, 2026
18 min read
Table of contents

UTM parameters are query-string tags (utm_source, utm_medium, utm_campaign, plus optional utm_term and utm_content) that tell Google Analytics 4 which email, ad, or post sent a click. Without them, newsletter traffic often lands in Direct and you cannot tell last week’s digest from a random LinkedIn post.

Spreadsheets work until someone types Email once and email the next time — GA4 treats those as two channels. A UTM link builder with lowercase/hyphen slugify and channel presets exists so the naming scheme survives a tired Friday send.

This guide covers the five fields, naming conventions, newsletter vs ads vs social, why # cannot be tagged, where to read the data in GA4, and pairing tagged URLs with HTML email. Companion: Complete Guide to HTML Newsletters.

What Are UTM Parameters?

Query string, not a magic pixel

A tagged URL looks like this:

https://jaconir.online/tools?utm_source=newsletter&utm_medium=email&utm_campaign=august-digest

When someone clicks, the browser requests that URL including the query. GA4 (via gtag, GTM, or a comparable tag) reads the utm_* keys and stores them on the session. The destination page must actually load — a href="#" never leaves the inbox.

The five fields

ParameterRequired?MeaningExample
utm_sourceYes (practically)Which property sent the clicknewsletter, google, instagram
utm_mediumYesMarketing mechanismemail, cpc, social
utm_campaignYesThe named pushaugust-digest, spring-sale
utm_termOptionalPaid keywordrunning-shoes
utm_contentOptionalCreative / placementheader-cta, footer-link

Source + medium + campaign are enough for almost every report. Add term for search ads. Add content when two buttons or two creatives share the same campaign.

Naming Conventions That Do Not Split Reports

GA4 is case-sensitive on these strings. Newsletter and newsletter become two rows. Spaces become %20 and look ugly in tables.

Rules that scale

  • Lowercase everything
  • Hyphens for words: spring-sale, not Spring Sale or spring_sale (pick hyphens or underscores and never mix)
  • No punctuation beyond hyphen, dot, underscore
  • One source/medium pair per channel — write it down once
  • Campaign = the send, not the brand: 2026-08-16-digest not jaconir

Jaconir’s builder can slugify as you type (lowercase + hyphens, stripping other characters) so “Spring Sale!” becomes spring-sale.

A simple scheme you can copy

Channelsourcemediumcampaign pattern
Email newsletternewsletteremail{month}-digest or {offer}
Google Adsgooglecpc{ad-group-or-promo}
Instagraminstagramsocial{launch-or-content-series}
LinkedInlinkedinsocial{launch-or-content-series}

Those four pairs match the presets in the UTM Link Builder (presets fill source and medium only — you still name the campaign).

Newsletter vs Ads vs Social

Different channels need different mediums. Mixing them is how “social” reports fill with email clicks.

Newsletter / email

  • Source newsletter (or your list name, if you have several lists — then be consistent)
  • Medium email
  • Campaign = this issue
  • Content = header-cta vs footer-cta if you A/B two buttons in the same letter

Build the HTML in the Newsletter Generator. That editor can append source/medium/campaign to https CTA links on export. Use this UTM tool when you also need term or content, or when you want to copy a single URL into ads and email.

  • Source google, medium cpc
  • Term = the keyword (the Keyword Research Tool helps you pick terms worth tracking)
  • Auto-tagging (gclid) can coexist; UTMs still help when you share the same landing URL outside Google

Social

  • Source = network (instagram, linkedin)
  • Medium = social (organic) or paid-social if you buy placements — pick one vocabulary and stick to it
  • Bio links, Stories stickers, and in-post URLs should share the campaign name if they promote the same drop

UTMs work on URLs inside QR codes too. Generate the tagged link here, then encode it with the QR Code Generator. The scan opens a normal https URL with query params — same as a click.

Why # Cannot Be Tagged

This is the bug that makes “we added UTMs” reports stay empty.

1. Hash-only hrefs are not pages

Newsletter templates often ship buttons as href="#". A click scrolls nowhere useful and does not load your site. There is no document for GA4 to attribute. The Newsletter Generator explicitly skips #, mailto:, and merge-tag URLs when it appends UTMs — because wrapping # in query params is meaningless.

Fix: put a real https:// landing page on every CTA, then tag it.

2. Fragments are not sent to the server

In a URL, the query comes before the hash:

https://example.com/sale?utm_source=newsletter&utm_medium=email&utm_campaign=spring#pricing

Everything after # (#pricing) stays in the browser. It is not part of the HTTP request. If you put UTMs after the hash (example.com/#/app?utm_source=...), many analytics setups never see them.

Fix: UTMs belong in the search string. If you need a jump target, keep it after the tagged query.

3. The builder needs a valid URL

The UTM tool prepends https:// when you omit the scheme, then uses the URL parser to set utm_* search params. A lone # is not a valid destination — paste https://yoursite.com/path instead.

Where to See UTM Data in GA4

Give the tags a few hours (or use DebugView while testing). Then:

  1. Open GA4ReportsAcquisitionTraffic acquisition
  2. Change the dimension to Session source / medium (you should see newsletter / email)
  3. Add or switch to Session campaign for august-digest-style names
  4. Optional: Session manual ad content / term dimensions when you filled utm_content and utm_term

What “Direct” usually means

  • Untagged links (including email buttons left as #)
  • Clients that strip query strings (rare, but some in-app webviews)
  • People who typed the domain or used a bookmark

If a whole newsletter send shows as Direct, the CTAs were almost certainly not https + query UTMs.

Consistency check

Sort source/medium and look for twins: email vs Email, social vs Social. Slugify going forward; you cannot painlessly merge historical rows.

Pair With the Newsletter Generator

A tagged URL is useless until it lives on a button people click.

Workflow:

  1. Decide campaign name (august-digest)
  2. Build https://…?utm_source=newsletter&utm_medium=email&utm_campaign=august-digest here (add utm_content=header-cta if you compare buttons)
  3. Paste into each CTA field in the Newsletter Generator
    or turn on UTM on CTA links there for source/medium/campaign on every https href
  4. Copy HTML into Mailchimp / Beehiiv / ConvertKit
  5. Send a test, click the button, confirm the address bar shows utm_
  6. Next day, check Traffic acquisition

Deep dive on subject, preheader, Outlook, and unsubscribe: Complete Guide to HTML Newsletters.

Interactive Browser Tool

Hand-concatenating query strings is how casing bugs happen. Generate the link once, copy once.

Jaconir UTM Link Builder is a free, browser-based campaign URL tagger:

  • Live tagged URL as you type — no generate button
  • Fields: destination, source, medium, campaign, optional term and content
  • Presets: Newsletter (newsletter / email), Google Ads (google / cpc), Instagram, LinkedIn
  • Optional lowercase + hyphens so GA4 does not split Email vs email
  • Parse existing utm_* values when you paste a tagged URL
  • Copy link; What GA will see preview of each field
  • Privacy-friendly: runs in your browser — no signup, no upload

Build a Campaign URL Online → UTM Link Builder

How to Use the Tool

Step 1 — Paste the destination

Open the UTM Link Builder. Use the page you actually want people to land on. Include https:// or let the tool add it. If the URL already has UTM tags, blur the field — values split into the form.

Step 2 — Set source, medium, campaign

Example: newsletter / email / august-digest. Click a preset if you send that channel often. Presets do not overwrite your campaign name.

Step 3 — Add term or content if you need them

Term for paid keywords. Content to tell two creatives or two email buttons apart.

Step 4 — Slugify and copy

Leave Lowercase + hyphens on unless you have a legacy scheme you must match. Copy the tagged URL. Paste it into Mailchimp, ads, social, or Newsletter Generator CTAs.

Build a Campaign URL Online → UTM Link Builder

Continue Your Campaign Tracking Workflow

UTMs sit between “we published a URL” and “GA4 can explain the click.”

Landing page (working https URL)
        ↓
UTM Link Builder   ← you are here
        ↓
Newsletter Generator CTAs  /  ads  /  social  /  QR
        ↓
ESP or ad platform send
        ↓
GA4 Traffic acquisition
StepToolWhat it does next
1UTM Link BuilderBuilds tagged campaign URLs with presets + slugify (current step).
2Newsletter GeneratorHTML email; paste tagged CTAs or use the editor’s UTM toggle.
3Keyword Research ToolSearch terms worth putting in utm_term.
4QR Code GeneratorEncodes the same tagged URL for print.
5SEO Audit ToolChecks the landing page before you spend the click.
6Image CompressorShrinks OG/email images on that landing page.

Browse more free utilities on Jaconir Tools.

Common Mistakes

  • Tagging # or empty buttons — zero sessions to attribute
  • UTMs after the hash — server and many tags never see them
  • Spaces and Title Case — duplicate rows in GA4
  • New source for every send (august-newsletter as source) — source should be the channel, campaign the send
  • Medium email in ads and cpc in newsletters — reports lie
  • Forgetting https — some parsers fail; always check the live tagged URL
  • Assuming the newsletter UTM toggle tags # — it does not; only http(s)
  • No test click — send yourself the email and read the address bar

Best Practices

For newsletters

  • One campaign name per issue
  • utm_content on header vs footer if you care which button won
  • Same source/medium every week (newsletter / email)

For ads

  • Source = network, medium = cpc or paid-social
  • Fill term for search
  • Do not recycle last quarter’s campaign name for a new offer

For social and QR

  • Same campaign as the email if it is the same launch
  • Print the full tagged URL in the QR — not a link-in-bio that strips query params

Frequently Asked Questions

What are UTM parameters?

Query tags — utm_source, utm_medium, utm_campaign, optional utm_term and utm_content — so analytics can credit the click.

Which fields are required?

Source, medium, campaign for useful reports. Term for keywords. Content for creatives.

Where do I see this in GA4?

Reports → Acquisition → Traffic acquisition, then Session source / medium or Session campaign.

Why can’t I tag #?

# is not a page, and fragments are not sent to the server. Use https:// and put UTMs in the query.

Spaces or underscores?

Neither spaces nor Title Case. Lowercase hyphens: spring-sale.

No. Jaconir’s UTM Link Builder runs in the browser. No account, no upload.

Newsletter vs ads vs social?

Presets: newsletter/email, google/cpc, instagram/social, linkedin/social. Keep one pair per channel.

Can I parse an existing tagged URL?

Yes — paste it in the website field; UTMs split into the form.

How do I tag newsletter CTAs?

Paste the copied URL into the Newsletter Generator, or use that editor’s UTM toggle on https links.

Is there a free UTM builder without signup?

Yes: UTM Link Builder — live URL, presets, slugify, copy.

Conclusion

Campaign reporting is a naming scheme plus real https URLs. Use lowercase hyphens, keep source/medium stable per channel, put UTMs in the query string (never on #, never after the hash), and verify in GA4 Traffic acquisition. A small browser tagger beats a messy spreadsheet when you send every week.

When you are ready to tag the next send:

Build a Campaign URL Online → UTM Link Builder

Then drop the link into the Newsletter Generator and the rest of Jaconir’s free tools.