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.
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
| Parameter | Required? | Meaning | Example |
|---|---|---|---|
| utm_source | Yes (practically) | Which property sent the click | newsletter, google, instagram |
| utm_medium | Yes | Marketing mechanism | email, cpc, social |
| utm_campaign | Yes | The named push | august-digest, spring-sale |
| utm_term | Optional | Paid keyword | running-shoes |
| utm_content | Optional | Creative / placement | header-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, notSpring Saleorspring_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-digestnotjaconir
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
| Channel | source | medium | campaign pattern |
|---|---|---|---|
| Email newsletter | newsletter | email | {month}-digest or {offer} |
| Google Ads | google | cpc | {ad-group-or-promo} |
instagram | social | {launch-or-content-series} | |
linkedin | social | {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-ctavsfooter-ctaif 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.
Paid search / Google Ads
- Source
google, mediumcpc - 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) orpaid-socialif 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
Print / packaging
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:
- Open GA4 → Reports → Acquisition → Traffic acquisition
- Change the dimension to Session source / medium (you should see
newsletter / email) - Add or switch to Session campaign for
august-digest-style names - Optional: Session manual ad content / term dimensions when you filled
utm_contentandutm_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:
- Decide campaign name (
august-digest) - Build
https://…?utm_source=newsletter&utm_medium=email&utm_campaign=august-digesthere (addutm_content=header-ctaif you compare buttons) - 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 - Copy HTML into Mailchimp / Beehiiv / ConvertKit
- Send a test, click the button, confirm the address bar shows
utm_ - 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
Emailvsemail - 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
| Step | Tool | What it does next |
|---|---|---|
| 1 | UTM Link Builder | Builds tagged campaign URLs with presets + slugify (current step). |
| 2 | Newsletter Generator | HTML email; paste tagged CTAs or use the editor’s UTM toggle. |
| 3 | Keyword Research Tool | Search terms worth putting in utm_term. |
| 4 | QR Code Generator | Encodes the same tagged URL for print. |
| 5 | SEO Audit Tool | Checks the landing page before you spend the click. |
| 6 | Image Compressor | Shrinks 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-newsletteras source) — source should be the channel, campaign the send - Medium
emailin ads andcpcin 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_contenton header vs footer if you care which button won- Same source/medium every week (
newsletter/email)
For ads
- Source = network, medium =
cpcorpaid-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.
Does the builder store my links?
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.
Related Guides
- Complete Guide to HTML Newsletters — subject, preheader, Outlook vs Gmail, unsubscribe, ESP paste
- Free SEO Audit Tool Guide — the landing page behind the tagged URL
- Complete Guide to Favicons — brand the site those campaigns hit
- Complete Guide to Video Collages — social creatives that should use the same campaign name
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.