Skip to content

Digital Marketing Foundations · Measurement, attribution and privacy · lesson 12 of 15 · 15 min

UTMs and a tracking plan you can trust

Why a plan beats ad-hoc tags

If three people tag links three different ways – Instagram, insta, IG – your analytics splits one source into three rows and nobody trusts the report. A tracking plan is a short shared document that fixes this: which events you track, what they are called, and exactly how every link is tagged.

UTM parameters, properly

| Parameter | Purpose | Examples | |---|---|---| | utm_source | The site or sender | instagram, tiktok, google, newsletter, whatsapp | | utm_medium | The type of channel | paid_social, cpc, social, email, affiliate, referral, sms | | utm_campaign | The campaign | 2026-10_eid-sale, evergreen_prospecting | | utm_content | Which ad, creator or link | creator-ayesha_reel1, hook-problem_v2 | | utm_term | Keyword or audience (optional) | abaya-black, lookalike-buyers | | utm_id | Campaign ID (optional; used by GA4 data import) | cmp_1042 |

GA4 also recognises optional utm_source_platform, utm_creative_format and utm_marketing_tactic; use them only if you will actually report on them.

The rule most beginners miss: match GA4's channel groups

GA4 sorts traffic into default channel groups (Paid Social, Organic Social, Email, Affiliates, Paid Search, and so on) using rules based on source and medium. If your medium is something GA4 does not recognise, such as utm_medium=creator or utm_medium=story, that traffic lands in Unassigned.

Safe choices:

  • Paid Social: a social source (for example instagram, facebook, tiktok, snapchat, linkedin) plus a medium such as paid_social or cpc (GA4 treats mediums containing "cp" or starting with "paid" as paid).
  • Organic Social: social source plus social.
  • Email: email as source or medium.
  • Affiliates: medium affiliate (useful for creator codes paid on commission).
  • SMS: GA4 has an SMS channel for sms as source or medium.

Put the creator's name in utm_content or utm_campaign, not in the medium. If you need a special channel (for example "Creators" or "AI assistants"), build a custom channel group in GA4 rather than inventing mediums.

The naming convention

Agree these rules in one sentence each and pin them in a shared sheet:

  1. Lowercase everything – GA4 treats Instagram and instagram as different values.
  2. Hyphens inside words, underscores between parts – 2026-10_eid-sale.
  3. Date first in campaign names – sorts chronologically.
  4. No spaces or special characters – they break or get encoded as %20.
  5. Never tag internal links on your own site – it restarts the session with the wrong source.

Hands-on: a UTM builder in Google Sheets

Columns A–F hold base URL, source, medium, campaign, content and term. In G2:

=LOWER(A2 & IF(REGEXMATCH(A2,"\?"),"&","?") &
 "utm_source=" & ENCODEURL(LOWER(TRIM(B2))) &
 "&utm_medium=" & ENCODEURL(LOWER(TRIM(C2))) &
 "&utm_campaign=" & ENCODEURL(LOWER(SUBSTITUTE(TRIM(D2)," ","-"))) &
 IF(E2="","","&utm_content=" & ENCODEURL(LOWER(SUBSTITUTE(TRIM(E2)," ","-")))) &
 IF(F2="","","&utm_term=" & ENCODEURL(LOWER(SUBSTITUTE(TRIM(F2)," ","-")))))

Add data validation (Data → Data validation → dropdown) on the source and medium columns so people can only choose approved values. Google's free Campaign URL Builder does the same for one-off links. (If your landing-page paths contain capitals, drop the outer LOWER so the path is not changed.)

Dynamic parameters inside ad platforms

Ad platforms can fill UTMs automatically in the ad's URL parameters field:

  • Meta: utm_source=facebook&utm_medium=paid_social&utm_campaign={{campaign.name}}&utm_content={{ad.name}}&utm_term={{adset.name}} (use {{site_source_name}} as source if you want Facebook vs Instagram split; values are short codes you may need to map).
  • TikTok: utm_source=tiktok&utm_medium=paid_social&utm_campaign=__CAMPAIGN_NAME__&utm_content=__CID_NAME__&utm_term=__AID_NAME__ – note that on TikTok __AID__ is the ad group and __CID__ is the creative.
  • Google Ads: keep auto-tagging (the gclid parameter) switched on; you usually do not need manual UTMs for Google Ads traffic in GA4.

Because dynamic values use your campaign names, naming conventions in the ad account become your analytics labels. Name campaigns in lowercase with the same rules.

The tracking plan: events, not just links

A one-page tracking plan lists each conversion event:

| Event | When it fires | Key parameters | Sent to | Owner | |---|---|---|---|---| | generate_lead | Form submitted successfully | form_id, lead_type | GA4, Meta, LinkedIn | Web dev | | add_to_cart | Item added | value, currency, items | GA4, Meta, TikTok | Web dev | | purchase | Order confirmed page / server | transaction_id, value, currency | GA4, Meta CAPI, TikTok Events API | Web dev | | whatsapp_click | Click on WhatsApp button | page_location | GA4 | Marketer |

Use GA4's recommended event names where they exist (purchase, generate_lead, sign_up, add_to_cart) so standard reports work.

Worked example: a Dubai café's launch week

The café runs Instagram ads, two creators, a WhatsApp broadcast and an email to 2,000 subscribers. Its sheet produces:

  • Ads: utm_source=instagram&utm_medium=paid_social&utm_campaign=2026-11_launch&utm_content={{ad.name}}
  • Creator A: utm_source=instagram&utm_medium=social&utm_campaign=2026-11_launch&utm_content=creator-maryam
  • WhatsApp: utm_source=whatsapp&utm_medium=social&utm_campaign=2026-11_launch&utm_content=broadcast-1
  • Email: utm_source=newsletter&utm_medium=email&utm_campaign=2026-11_launch&utm_content=hero-button

A week later GA4 shows sessions and online orders by campaign and content, and nothing lands in Unassigned.

QA checklist before launch

  • Click every link and confirm the page loads with parameters intact (some redirects strip them).
  • Check GA4 Realtime or DebugView for the session source and your key events.
  • Make a test purchase or lead and confirm it appears once – not twice – in each platform.
  • Shorten links for print or SMS only after tagging (the short link must redirect to the full tagged URL).

How to measure success

  • Unassigned and "(not set)" traffic in GA4 stays close to zero for campaign traffic.
  • Every active campaign appears under a clean, lowercase name.
  • Anyone on the team can build a correct link without asking.

Video lecture: UTMs and a tracking plan: making your data trustworthy

Lecture coming soon · 11 chapters · about 8 minutes. Read the full transcript below.

  1. UTMs and tracking plans
  2. Core UTM parameters
  3. Match GA4 channel groups
  4. Naming convention
  5. Hands-on: Sheets UTM builder
  6. Dynamic parameters
  7. Example 1: Dubai café launch
  8. The event tracking plan
  9. Example 2: UK retailer audit (illustrative)
  10. Pre-launch QA
  11. Recap and try this now

Lecture transcript

UTMs and tracking plans

Picture a report where Instagram appears three times. Once as Instagram with a capital I, once as insta, and once as IG. Plus a mysterious channel called Unassigned that brought in a third of your sales. Nobody trusts the numbers, so every meeting turns into an argument. The fix isn't a fancy tool. It's a one-page tracking plan and a naming convention. In this lecture you'll learn how UTM parameters really work, the GA4 rule most beginners miss, how to build a UTM generator in Google Sheets, how to use dynamic parameters inside Meta and TikTok, and how to test everything before launch.

Core UTM parameters

Let's start with the parameters. A UTM is just a tag added to the end of a link, telling your analytics where a visit came from. utm source is the site or sender: instagram, tiktok, newsletter, whatsapp. utm medium is the type of channel: paid social, cpc, social, email, affiliate. utm campaign is the campaign name, like twenty twenty-six dash ten underscore eid sale. utm content says which specific ad, creator or link. And utm term is optional, for a keyword or audience. There are a few more optional ones GA4 understands, like utm id, but only use extras if you'll actually report on them.

Match GA4 channel groups

Now here's the rule most beginners miss. GA4 sorts traffic into default channel groups, like Paid Social, Organic Social, Email and Affiliates, using rules about your source and medium. If you invent a medium GA4 doesn't recognise, say, utm medium equals creator, or story, that traffic lands in Unassigned. So pick mediums GA4 understands. For paid social ads, use a social source like instagram or tiktok, with a medium like paid underscore social or cpc. For organic posts, use social. For newsletters, email. For commission-based creator codes, affiliate. And put the creator's name in utm content, not in the medium.

Naming convention

Next, your naming convention. Five rules, pinned in a shared sheet. One: lowercase everything, because GA4 treats Instagram and instagram as different values. Two: hyphens inside words, underscores between parts. Three: date first in campaign names, so they sort chronologically. Four: no spaces or special characters, which break links or turn into ugly percent codes. And five, the one that silently ruins data: never tag internal links on your own website. If you put a UTM on your homepage banner, anyone who clicks it starts a new session with the wrong source, and you lose track of where they really came from.

Hands-on: Sheets UTM builder

Let's build a generator so nobody types UTMs by hand. In Google Sheets, put the base URL, source, medium, campaign, content and term in columns A to F. In column G, one formula joins them together, adds a question mark or ampersand as needed, lowercases the values, swaps spaces for hyphens and encodes anything unusual. The full formula is in the lesson text, ready to paste. Then add dropdowns on the source and medium columns, using data validation, so people can only pick approved values. That single step prevents most messy data. For one-off links, Google's free Campaign URL Builder does the same job.

Dynamic parameters

Now the time-saver: dynamic parameters. Ad platforms can fill in UTMs automatically from your campaign names. On Meta, in the ad's URL parameters box, you can use values like campaign dot name and ad dot name in double curly braces. On TikTok, you use macros wrapped in double underscores, like campaign name, and here's a trap: on TikTok, A I D means the ad group and C I D means the creative. And on Google Ads, keep auto-tagging on, which adds a click ID called gclid, so you usually don't need manual UTMs for Google Ads at all. Here's the key idea: your ad account names become your analytics labels.

Example 1: Dubai café launch

Let's do a simple worked example. A café in Dubai is launching. It has Instagram ads, two creators, a WhatsApp broadcast and an email to two thousand subscribers. From the sheet: the ads use instagram, paid social, the launch campaign, and the ad name filled in dynamically. Creator Maryam's link uses instagram, social, the launch campaign, and content creator dash maryam. The WhatsApp broadcast uses source whatsapp, medium social. And the email uses newsletter, email, with content hero button. A week later, GA4 shows sessions and online orders by each campaign and content value, and almost nothing lands in Unassigned.

The event tracking plan

Now links are only half the plan. The other half is events. A tracking plan is a simple table listing every conversion event: what it's called, when it fires, its key parameters, where it's sent and who owns it. For example, purchase fires on the order confirmation, with a transaction ID, value and currency, and it's sent to GA4, Meta and TikTok. Generate lead fires when a form is submitted successfully. And a WhatsApp click event tracks taps on your chat button. Use GA4's recommended event names, like purchase, generate lead and sign up, wherever they exist, so the standard reports work without extra setup.

Example 2: UK retailer audit (illustrative)

Here's a realistic scenario of what happens without that plan. A UK online retailer, illustrative numbers, notices that thirty percent of its revenue sits in Unassigned. An audit finds three causes. The agency used utm medium equals influencer. The email platform added its own default tags with capital letters. And a homepage banner had UTMs on it, resetting sessions. Fixes: an approved list of mediums, lowercase dynamic parameters, a GA4 custom channel group for creators, and banner tags removed. Within a month, Unassigned falls to a sliver, and the team finally sees that email drives far more revenue than they thought.

Pre-launch QA

Before any launch, run a quick QA. Click every link and confirm the page loads with the parameters intact, because some redirects strip them. Open GA4 Realtime or DebugView and check the session source and your key events. Make a test purchase or lead and confirm it appears once, not twice, in each platform. And if you shorten links for print or SMS, shorten the full tagged URL. How do you measure success? Unassigned and not set traffic stays close to zero for campaigns, every campaign has a clean lowercase name, and anyone on the team can build a correct link without asking.

Recap and try this now

Let's recap. A tracking plan fixes your event names, UTM rules and owners. Use lowercase, consistent values, and mediums GA4 recognises, and put creators in utm content. Never tag internal links. Generate links from a sheet with dropdowns, or with dynamic parameters inside your ad platforms, and keep Google Ads auto-tagging on. Then test before launch. Here's your try this now. Build the UTM builder from the lesson text, add dropdowns for source and medium, and create tagged links for one ad, two creators, one email and one WhatsApp broadcast for the same campaign. Next lesson, we'll make sure all of that tracking is collected lawfully.

Key takeaways

  • A tracking plan fixes event names, UTM rules and owners so reports are trustworthy.
  • Use lowercase, consistent values and mediums that GA4's default channel groups recognise, or traffic lands in Unassigned.
  • Build links with a Sheets UTM builder or dynamic parameters in ad platforms; keep Google Ads auto-tagging on.
  • Test every link and event before launch and never tag internal links.

Try it

Build the UTM builder sheet with dropdowns for source and medium, then create tagged links for one ad, two creators, one email and one WhatsApp broadcast for the same campaign.