One campaign, one vocabulary
UTM tracking rarely fails for technical reasons. It fails because three people tag the same campaign three ways — IGLaunch, instagram_launch, spring launch ig — and the report splinters into rows nobody can defend in a meeting. The cure is a fixed vocabulary, decided once. This is the one the builder's presets encode:
| Channel | utm_source | Organic medium | Paid medium | GA4 files it as |
|---|---|---|---|---|
| social | paid-social | Organic Social / Paid Social | ||
| social | paid-social | Organic Social / Paid Social | ||
| social | paid-social | Organic Social / Paid Social | ||
| X (Twitter) | social | paid-social | Organic Social / Paid Social | |
| TikTok | tiktok | social | paid-social | Organic Social / Paid Social |
| Threads | threads | social | — | Organic Social |
| social | paid-social | Organic Social / Paid Social | ||
| YouTube | youtube | video | paid-video | Organic Video / Paid Video |
| Newsletter | newsletter | — |
How GA4 decides which channel your link counts as
GA4 doesn't take your word for it — it classifies every session into its default channel groups by pattern-matching your source and medium. Roughly: a session lands in Organic Social when the medium is one of a small social set (social and close variants) or the source is a site Google recognizes as social. Paid Social is stricter: the source must be a recognized social site and the medium must look paid (cpc, ppc, paid-*).
That strictness is where reports go wrong: invent a medium like ig-stories and the session matches neither rule — it lands in Unassigned or a generic bucket instead of the Paid Social row you budgeted against. It's why this builder shows the expected GA4 channel next to every link before you ship it, and why the presets stick to conventional pairs. The full matching rules are in Google's default-channel documentation; the practical takeaway is simpler — be conventional in source and medium, expressive everywhere else.
Three naming rules that survive a team
- Lowercase and dashes, always. Analytics tools are case-sensitive, so every spelling variant becomes its own row. The builder enforces this by default; turn it off only if your team's existing convention differs — and then follow that convention exactly.
- Date-stamp campaign names.
spring-drop-2026-04sorts chronologically, never collides with next year's spring drop, and answers "which one was this?" without archaeology. - Spend your expressiveness in utm_content. Source and medium are vocabulary; content is where detail belongs:
bio-link,story-sticker,hero-button. Placement-level answers come from here, with zero risk to channel classification.
A campaign set, worked through
A shop launches its spring collection at https://yourshop.com/collections/spring-drop across four channels. One campaign name, four links, and every row below is a channel GA4 will report exactly as intended:
Instagram (organic)
GA4: Organic Socialhttps://yourshop.com/collections/spring-drop?utm_source=instagram&utm_medium=social&utm_campaign=spring-drop-2026-04
Instagram (ads)
GA4: Paid Socialhttps://yourshop.com/collections/spring-drop?utm_source=instagram&utm_medium=paid-social&utm_campaign=spring-drop-2026-04
https://yourshop.com/collections/spring-drop?utm_source=linkedin&utm_medium=social&utm_campaign=spring-drop-2026-04
Newsletter
GA4: Emailhttps://yourshop.com/collections/spring-drop?utm_source=newsletter&utm_medium=email&utm_campaign=spring-drop-2026-04
In the report, the campaign rolls up to one spring-drop-2026-04 row, splits cleanly by channel underneath, and the Instagram ads never contaminate the organic Instagram numbers.
Frequently asked questions
Why does GA4 report my campaign traffic as "Unassigned"?
Because your source/medium pair doesn't match any of GA4's default channel definitions. The usual culprits: a creative medium value ("ig-stories", "sponsored") that doesn't match the patterns GA4 looks for, or a paid medium combined with a source GA4 doesn't recognize as a social site. The fix is boring on purpose — use the conventional pairs (instagram/social, instagram/paid-social, newsletter/email) and save your creativity for utm_campaign and utm_content, which GA4 doesn't gatekeep.
Should I put UTM parameters on links within my own site?
No — this is the most damaging UTM mistake there is. When someone already on your site clicks an internal link carrying UTMs, GA4 starts a new attribution context: the visitor who originally arrived from search now shows up as "email" because they clicked your tagged banner. Tag the links that bring people to your site (posts, ads, newsletters); never tag navigation, banners, or buttons inside it.
Do UTM parameters affect SEO or create duplicate-content problems?
In practice, no. Search engines understand UTM parameters are tracking, and a correct canonical tag on the destination page (which any healthy site already has) tells them the untagged URL is the real one. Two genuine cautions: don't put tagged URLs in places search engines treat as your canonical reference (sitemaps, internal links), and don't let tagged versions get backlinked at scale — share clean URLs anywhere permanence matters.
How do I keep organic and paid traffic from the same platform separate?
Split them at utm_medium, not utm_source. Both use the same source (instagram), but organic posts get medium=social while ads get medium=paid-social. GA4 then files them as Organic Social and Paid Social respectively, and your platform-level rollup still works because the source matches. Teams that instead invent two sources (instagram vs instagram-ads) lose that rollup and usually end up with one of the two unclassified.
What is utm_id and when is it worth adding?
utm_id is a campaign identifier GA4 can use as a join key — most notably for cost-data imports, where the id in your uploaded spend file has to match the id on the link. If you're not importing cost data or wiring campaigns to external systems, you can skip it; a well-named utm_campaign carries all the meaning humans need. If you run many concurrent campaigns through spreadsheets or a data warehouse, assign each a short stable id and keep the human-readable name in utm_campaign.
Can I fix a wrong UTM after the campaign is live?
You can fix the link going forward, but not the data already collected — sessions are recorded with whatever parameters they arrived with, and GA4 has no retroactive edit. Update the link wherever it's editable (bio links, ad URLs, newsletter templates), note the changeover date, and treat the campaign's data as two segments. For published posts where the URL can't be edited, let it ride and annotate the report rather than deleting the post.
How many tagged links does one campaign need?
One per channel at minimum — that's what campaign-set mode produces — and one per placement if you want placement-level answers. Same source/medium/campaign, with utm_content doing the differentiation: bio-link vs story-sticker vs caption link on Instagram, hero-button vs footer-link in a newsletter. The discipline that matters isn't the count; it's that every link in the campaign shares the identical utm_campaign so the rollup is one row, not five spellings.