UTM Builder
Build tracked links for Google Analytics in seconds. Paste your URL, fill in the campaign, copy the result. Nothing leaves your browser.
The page you're sending people to. Must start with https:// or http://
Where the click came from
The broad channel
The campaign name
Advanced — utm_term & utm_content
Paid-search keyword (mostly used for Google Ads)
A/B-test or creative variant (e.g. hero_cta vs footer_link)
What is a UTM, and do you actually need one?
UTM stands for “Urchin Tracking Module” — the original Urchin Analytics company (acquired by Google in 2005, became Google Analytics). The parameters are query-string tags appended to a URL that tell your analytics platform where the click came from. Without them, every visit from social media, email, or paid ads collapses into a generic “direct” or “referral” bucket in your reports.
Real answer: if you only ever post one link from one channel, you don't need UTMs. If you post the same link across Instagram, your newsletter, and a paid ad, you absolutely do — otherwise you can't tell which channel actually drove the conversion you're paying for.
The build is mechanical: five named parameters (utm_source, utm_medium, utm_campaign, utm_term, utm_content) appended as query params. Three are GA4-required, two are optional. The hard part isn't the syntax — it's establishing a naming convention you stick to so the “Facebook” you tagged in March doesn't become “facebook” in May and split your reports.
The 5 UTM parameters, in order of how often you'll use them
Three required, two optional. Memorize the first three — they're 95% of what you'll ever set.
utm_source
Required— WHERE the click came fromThe specific platform or publisher. Use the platform's common-name slug (lowercase, no spaces): "instagram", not "Instagram" or "ig". This is the only required parameter that can't be inferred — without it, GA4 attributes the visit as (direct).
instagramnewslettergoogletwitterlinkedinbingutm_medium
Required— The broad CHANNEL categoryGA4 uses utm_medium to group sources into channel buckets — "social" rolls up Instagram + Facebook + TikTok + LinkedIn into one "Social" channel report. Stick to the GA4-standard mediums: social, email, cpc (paid search), display (banner ads), video, affiliate, referral.
socialemailcpcvideoaffiliatereferralutm_campaign
Required— The specific campaign NAMEThe internal name for what you're running. Snake_case or kebab-case lowercase. Reuse the same campaign name across every channel of the same effort — same "spring_sale_2026" on Instagram + newsletter + Google Ads — so GA4 can roll up the campaign's total impact across channels.
spring_sale_2026product_launch_aprwebinar_aprilutm_term
Optional— The paid-search KEYWORDMostly used for Google Ads paid search — most platforms auto-populate this with the actual search keyword via the {keyword} dynamic value in the ad destination URL. Outside paid search, utm_term is rarely useful.
social_media_schedulerinstagram_scheduler{keyword}utm_content
Optional— The CREATIVE / variant differentiatorA/B testing live within a single campaign. Same source/medium/campaign across two ads, but utm_content="video_a" vs utm_content="video_b" lets you measure which creative drove more clicks. Also useful for differentiating "header link" vs "footer link" in the same newsletter.
hero_ctafooter_linkvideo_asubject_line_bUTM templates per platform
Copy the source / medium pair we recommend per channel. The builder above auto-fills these when you pick a template — this table is the reference.
| Platform | utm_source | utm_medium | Notes |
|---|---|---|---|
| social | Standard preset for Instagram feed, Reels, and Stories link-in-bio. | ||
| social | Use for Facebook Page posts. For Facebook Ads, use the "Google Ads / paid" preset instead. | ||
| 🎵TikTok | tiktok | social | TikTok bio links and Spark Ads. Track per-video by setting different utm_content values. |
| social | LinkedIn feed, Company Page posts, and bio links. | ||
| 𝕏X / Twitter | social | Track links posted to X / Twitter. Use utm_content to separate tweet variants. | |
| ▶️YouTube | youtube | video | Video descriptions and channel "About" link. utm_medium=video keeps it out of social reports. |
| 🧵Threads | threads | social | Threads posts and profile bio link. |
| 🦋Bluesky | bluesky | social | Bluesky posts and bio. Same convention as other organic-social channels. |
| social | Pin destinations and Idea Pin links. | ||
| social | Reddit comment / post links. Be careful — Reddit hides links with obvious UTMs in some subs. | ||
| ✉️Email Newsletter | newsletter | Standard newsletter / broadcast email. Differentiate variants with utm_content. | |
| 🅖Google Ads | cpc | Paid search. utm_term should auto-populate with the matched keyword via {keyword} in your ad URL. |
5 UTM mistakes that quietly break your analytics
All of these still happen in 2026 because nobody catches them until the quarterly report — by then the data is already split.
Mixing uppercase and lowercase values
GA4 treats values as case-sensitive — "Facebook", "FACEBOOK", and "facebook" become three separate rows in your acquisition report. Stick to lowercase everywhere; the builder above warns you on uppercase. If your reports are already polluted, channel grouping rules in GA4 can collapse the duplicates retroactively.
Fix: Lowercase everything, always.
Spaces in parameter values
A value like "summer sale" gets URL-encoded as "summer%20sale" in the link and shows up that way in some analytics dashboards. Use underscores ("summer_sale") or hyphens ("summer-sale") instead. Pick one separator style and stick to it across all campaigns.
Fix: Replace spaces with _ or -
Tagging internal links on your own site
A UTM-tagged link inside your own site (e.g., a sidebar promo on your blog linking to your pricing page) overrides the original referrer, making it look like the visitor came from "internal navigation" when they actually came from Google. Never put UTMs on internal links — only on links from external sources you control (your social posts, emails, ads).
Fix: Use UTMs only on EXTERNAL links pointing TO your site.
Inconsistent campaign naming across channels
If your spring sale uses utm_campaign=spring_sale_2026 on Instagram but utm_campaign=spring-launch on the newsletter, GA4 can't roll them up into one campaign report. Pick the campaign name first, then use it everywhere for that effort. Document the conventions in a shared doc so the team uses the same names.
Fix: Pick one campaign name and use it across every channel for that effort.
Forgetting that URL shorteners can strip UTM params
Some link shorteners (especially older ones) drop query parameters during the redirect — your tracked URL becomes untracked the moment it goes through the shortener. Always test the final shortened URL: paste it into a browser, hit enter, then check the URL bar after the redirect to confirm the utm_* params survived.
Fix: Always test a shortened tracked URL end-to-end.
UTM builder vs. URL shortener — which do you need?
Different jobs. Most marketers use both.
UTM Builder
Adds tracking parameters TO a URL. The link gets longer; the destination is visible; analytics platforms read the params.
- ✓Use when you need to know which channel drove the visit.
- ✓Use when you run the same offer across multiple channels and want to compare them.
- ✓Output: long, transparent URL with the destination visible.
URL Shortener (Bitly, TinyURL)
Replaces a URL with a short redirect. The link gets shorter; the destination is hidden; analytics has to read the original URL after the redirect.
- ✓Use when the link is going somewhere with a character limit (Twitter, SMS).
- ✓Use when the long UTM URL would look spammy in a Slack / Discord preview.
- ✓Output: short, opaque URL.
Building UTMs for 10 channels by hand?
SocialCal auto-tags every cross-posted link with platform-specific UTMs so you can stop copy-pasting the same destination through this builder ten times per campaign.
UTM builder — FAQ
A UTM builder is a tool that appends Google Analytics tracking parameters (utm_source, utm_medium, utm_campaign, utm_term, utm_content) to a URL. The parameters tell Google Analytics 4 — or whatever analytics platform you use — where the traffic came from, so you can see which Instagram post, newsletter, or paid ad actually drove the visit. This builder runs entirely in your browser; nothing is sent to a server.
GA4 needs three parameters to attribute a visit correctly: utm_source (where the click came from — "instagram", "newsletter"), utm_medium (the broad channel — "social", "email", "cpc"), and utm_campaign (the specific campaign name). utm_term and utm_content are optional. utm_term is mostly used for paid-search keywords; utm_content separates A/B-tested creative variants of the same campaign.
GA4 treats UTM values as case-sensitive. "Facebook", "FACEBOOK", and "facebook" become three rows in your acquisition report. Stick to lowercase everywhere — our builder warns you when you accidentally capitalize a value. If you already have a mess in GA4, you can clean it up with channel grouping rules.
No. Use underscores or hyphens instead — "summer_sale" or "summer-sale", not "summer sale". Spaces get URL-encoded as %20 which is ugly in reports and easy to typo. Lowercase letters, numbers, underscores, and hyphens are the safest character set across every analytics platform.
A UTM builder appends tracking parameters to an existing URL — the link gets longer and clearly shows the parameters. A URL shortener (Bitly, TinyURL, t.co) replaces the URL with a short redirect — cleaner-looking but you lose visibility into the destination. Many marketers use both: build the UTM-tagged URL first, then shorten it with Bitly. Just be careful — some shorteners strip UTM parameters in the redirect, so test your final link before posting.
Yes — UTM parameters are a standard, not a Google-specific format. HubSpot, Mixpanel, Plausible, PostHog, Fathom, and every other analytics tool reads the same utm_source / utm_medium / utm_campaign convention. You don't need a separate builder per platform.
Yes — use utm_content. Keep utm_source / utm_medium / utm_campaign the same across a campaign, then vary utm_content per asset. For example: utm_content=hero_button vs utm_content=footer_link on the same newsletter, or utm_content=video1 vs utm_content=video2 on TikTok. GA4 will show the rollup by campaign AND the per-variant breakdown.
The 5 most recent URLs you built are saved to your browser's local storage so you can re-load them with one click. Nothing is sent to our servers, nothing is shared, and clearing your browser data wipes the history. Open the page in an incognito window and the history starts fresh.
Most browsers and platforms handle URLs up to ~2,000 characters without issue, but in practice keep your tagged URL under 500 characters. Long UTM values are harder to debug, get truncated in analytics dashboards, and look spammy in Slack / Discord previews. If you need long campaign names, build the URL and then run it through a shortener.
Yes — when you schedule a post in SocialCal, you can attach a base destination URL and we'll generate platform-specific UTM-tagged variants per channel (instagram/social, tiktok/social, linkedin/social, newsletter/email, etc.) automatically. Saves the copy-paste loop of running the same link through this builder once per platform.