UTM Tags: How to Track Your Campaigns Properly (Singapore Guide)
Open the traffic report of almost any Singapore SME and you will find the same mess: facebook, Facebook, FB, fb and facebook.com sitting on five separate rows, none of which is the real total. Somewhere below them is a campaign called newsletter that has been reused for three years, and a row called (not set) that is bigger than either.
UTM tags are the cheapest measurement tool in marketing — they are free, they take seconds, and they need no code. They are also the easiest to get subtly wrong, because nothing ever fails. A malformed tag does not throw an error; it just quietly files your traffic in the wrong drawer, forever, and there is no way to fix it retroactively.
This guide covers what GA4 actually does with each parameter, the single rule that decides which channel your traffic lands in, the mistakes that cost the most, and a naming convention you can hand to a junior marketer. It sits under our performance marketing guide for Singapore.
What a UTM tag is, in one paragraph
A UTM tag is a parameter added to the end of a URL that tells your analytics where the click came from. Your website ignores it. GA4 reads it, records it against the session, and files that session into a channel. That is the whole mechanism: you are labelling your own links, because a browser does not otherwise tell the destination site which of your posts, emails or ads the visitor tapped.
The corollary matters: UTMs only describe links you control. They cannot tell you anything about traffic you did not tag, and they are a claim rather than a measurement — GA4 believes whatever you write. Tag a link utm_medium=email and paste it into an Instagram bio, and GA4 will report Instagram traffic as email until the end of time.
The nine parameters, and the two that do nothing
| Parameter | What it means | Example | Use it? |
|---|---|---|---|
utm_source |
Where the traffic came from — the specific platform or publication | linkedin |
Always |
utm_medium |
The type of marketing — this is what decides your channel | cpc |
Always |
utm_campaign |
The specific campaign or promotion | gss-2026-launch |
Always |
utm_content |
Distinguishes versions — which creative, which button | hero-cta |
When A/B testing |
utm_term |
Paid keyword | aircon-servicing |
Rarely — auto-tagging handles this |
utm_id |
Campaign ID, used to join with imported cost data | ig-2026-07 |
If you import cost |
utm_source_platform |
The platform that directed the traffic, e.g. a bid manager | sa360 |
Enterprise only |
utm_creative_format |
Creative type — display, video, search | video |
No — not reported in GA4 |
utm_marketing_tactic |
Targeting approach — remarketing, prospecting | remarketing |
No — not reported in GA4 |
Those last two are a genuine trap. GA4 collects them, so a tagging tool will happily offer the fields and a URL builder will happily populate them — but Google’s documentation states plainly that they “aren’t currently reported in Google Analytics properties”. You can spend an afternoon carefully tagging prospecting versus remarketing and then find nowhere to read it. Put that distinction in utm_campaign or utm_content instead, where you can actually see it.
For 95% of Singapore SMEs, three parameters is the correct answer: source, medium, campaign. Add utm_content only when you are genuinely comparing two versions of something.
The one rule that decides everything: how medium becomes a channel
This is the part almost nobody knows, and it explains most broken reporting. GA4 does not read your utm_medium as a label. It runs it through a set of matching rules to assign a channel.
The important ones, in Google’s own terms:
- Paid Search — the source matches a known search engine and the medium matches the regular expression
^(.*cp.*|ppc|retargeting|paid.*)$ - Paid Social — the source matches a known social site and the medium matches that same expression
- Organic Search — the source is a known search engine, or the medium is exactly
organic - Organic Social — the source is a known social site, or the medium is one of
social,social-network,social-media,sm,social network,social media - Email — the source or the medium is
email,e-mail,e_mailore mail - Referral — the medium is
referral,apporlink - AI Assistant — the medium is exactly
ai-assistant(added 13 May 2026)
Read the paid expression again: .*cp.* matches anything containing the letters “cp” in order. That is why cpc, cpm and ppc all land in paid buckets, and why the widely-copied paid-social works (it starts with “paid”) while a sensible-looking paidsocial also works, but facebook-ads does not — it contains neither “cp” nor “ppc” nor a leading “paid”, so it falls through to Referral or Unassigned.
The practical rule: your medium is not a free-text field. Pick from the values GA4 recognises, and put your descriptive detail in campaign or content. If your reports show a large “Unassigned” row, this is almost always why.
The five mistakes that cost the most
1. Inconsistent case
Google is explicit: “parameter values are case sensitive, e.g. utm_source=google is different from utm_source=Google.” This is the single largest cause of the split-row problem. Lowercase everything, always, with no exceptions. Not “mostly lowercase” — the one capital letter someone types on a Friday creates a permanent second row.
2. Tagging your own internal links
Putting UTMs on a link from one page of your site to another is genuinely destructive. A new campaign source ends the current session and starts a new one, so a single visitor becomes two sessions with two sources, and the original source that actually won you the visit is overwritten. Your homepage starts appearing as a traffic source to itself.
UTMs are for links pointing into your site from somewhere else. Never for navigation, never for internal banners.
3. Manually tagging your Google Ads
Google Ads has auto-tagging, which appends a click identifier (gclid) carrying far more detail than UTMs can — campaign, ad group, keyword, match type, device — and which is what connects cost data to your sessions. Adding your own UTMs on top can override that richer data and break the link between Ads and Analytics.
Leave auto-tagging on and do not hand-tag Google Ads URLs. The same logic applies to any platform with a native integration.
4. Spaces and punctuation
A space in a UTM becomes %20 or a plus sign depending on how the link was built, and you end up with two versions of the same campaign. Use hyphens. Avoid ampersands entirely inside values — an unencoded & terminates the parameter and truncates everything after it.
5. Reusing a campaign name forever
A campaign called newsletter running since 2023 tells you nothing. Date-stamp it: newsletter-2026-07. You will want to compare July against June eventually, and you cannot retrofit that distinction.
A naming convention you can hand over
The convention matters less than the fact that there is one and it is written down. Here is a workable default for a Singapore SME.
| Channel | source | medium | campaign |
|---|---|---|---|
| Facebook / Instagram ads | facebook / instagram |
paid-social |
gss-sale-2026-07 |
| Organic social post | facebook / instagram / linkedin |
social |
brand-always-on |
| Email newsletter | mailchimp |
email |
newsletter-2026-07 |
| LinkedIn ads | linkedin |
cpc |
b2b-leadgen-2026-q3 |
| Influencer / KOL link | their handle, lowercase | referral |
kol-2026-07 |
| QR code on print or in-store | qr-instore |
offline |
orchard-popup-2026-07 |
| Google Ads | Do not tag. Use auto-tagging. | ||
Three governance rules make this survive contact with a real team. Keep one spreadsheet of every tagged link ever created — it is the only defence against the same campaign being spelled three ways. Give one person the authority to approve new source or medium values. And build links with a URL builder rather than by hand, so the encoding is right every time.
Singapore-specific cases worth getting right
WhatsApp links do not carry UTMs
Query strings on a wa.me link do not arrive in your WhatsApp inbox as campaign data. This surprises people constantly, because WhatsApp is the primary enquiry channel for so many local businesses. Track the click on your own site before the jump, and encode the distinction in the prefilled message text instead — a message that opens with “Enquiring about commercial servicing” tells you the source without any tooling. Tracking phone calls and WhatsApp leads covers this in full.
Offline: QR codes on print, MRT, taxis and packaging
Offline advertising is one of the few places UTMs give you something you could not otherwise get at all. A QR code pointing at a tagged URL turns an untrackable placement into a measurable one. Give each placement its own utm_source — not one shared print value — because the whole point is finding out which placement worked.
Use a short redirect URL behind the code so you can repoint it later without reprinting anything.
Directory listings and partner sites
Where you control the link — industry directories, association listings, partner sites, a supplier’s “where to buy” page — tag it. These usually arrive as undifferentiated Referral traffic, and tagging is the only way to tell a listing that sends buyers from one that sends nobody.
Do not tag the AI assistants
Since 13 May 2026, GA4 identifies traffic from assistants like ChatGPT, Gemini and Claude automatically, assigning the medium ai-assistant. Do not hand-apply that medium to your own links — you will contaminate a channel that is genuinely useful precisely because it is detected rather than declared. See the GA4 reports worth checking for how to read it.
Two 2026 changes that affect tagging
Source Group (11 June 2026). GA4 added a dimension that consolidates the many source values Facebook, Instagram and TikTok generate into single rows. This does not excuse sloppy tagging — it only groups platform-generated variants, not your own inconsistent spellings — but it does make social reporting far more readable. Switch your dimension to Source Group when totalling a platform.
Aggregate Parameter Diagnostic (30 July 2026). GA4 now surfaces alerts when URL parameters it expects are missing — specifically the Google click identifiers gbraid and gad_ — because their loss degrades campaign data. This matters because parameters get stripped: by redirects that drop query strings, by aggressive link shorteners, by consent tools, and by web platforms that “clean” URLs. If you see these alerts, the fix is upstream of analytics — find what is eating the query string. It is worth checking that your own redirects preserve parameters, since a redirect that drops them will silently break both auto-tagging and your UTMs.
Separately, since 28 July 2026 campaign cost data import requires a currency field. If you import cost to sit alongside utm_id, expect to specify SGD explicitly rather than relying on a default.
A worked example: one promotion, six links
Abstract rules are easy to agree with and hard to apply. Here is a single Great Singapore Sale promotion for a fictional retailer, tagged end to end, showing how the same landing page gets six different labels.
| Where the link lives | The tag you add | Channel it reports as |
|---|---|---|
| Instagram paid ad | ?utm_source=instagram&utm_medium=paid-social&utm_campaign=gss-2026-07 |
Paid Social |
| Instagram bio link | ?utm_source=instagram&utm_medium=social&utm_campaign=gss-2026-07 |
Organic Social |
| Customer email blast | ?utm_source=mailchimp&utm_medium=email&utm_campaign=gss-2026-07 |
|
| QR code, shopfront window | ?utm_source=qr-shopfront&utm_medium=offline&utm_campaign=gss-2026-07 |
Unassigned — but cleanly separated |
| Influencer’s story link | ?utm_source=janetanfood&utm_medium=referral&utm_campaign=gss-2026-07 |
Referral |
| Google Ads | Nothing — auto-tagging handles it | Paid Search |
Three things this makes possible that were impossible before. You can total the whole promotion in one row by filtering on utm_campaign=gss-2026-07, across paid, organic, email, offline and influencer at once. You can compare the paid Instagram ad against the organic Instagram post directly, which is the comparison most businesses want and almost never have. And the shopfront QR code — previously a complete blind spot — now has a number attached to it.
Note the QR row lands in Unassigned, because offline matches none of GA4’s channel rules. That is acceptable and deliberate: the value is in the clean source, not in the channel label. If Unassigned traffic bothers you, build a custom channel group that maps offline to a channel of your own — custom channel groups re-bucket historical data for reporting, which is the one thing about UTM data you can change after the fact.
How to audit what you already have
Twenty minutes, once, and it will pay for itself.
- Open Acquisition → Traffic acquisition, set the dimension to Session source / medium, date range last 12 months.
- Scan for case duplicates — the same value with different capitalisation. Note them; you cannot fix history, but you can stop creating more.
- Look for Unassigned and
(not set). Any meaningful volume means mediums that match none of GA4’s rules. - Look for your own domain as a source. That is internal tagging, and it is corrupting your acquisition data right now.
- Check Google / cpc exists and looks sane. If Google Ads traffic is landing anywhere else, auto-tagging is off or being overridden.
- Write the convention down, share it, and start applying it from today.
You cannot retroactively fix UTM data — the values are baked into the sessions as they were recorded. Everything above is about stopping the bleeding, which is exactly why it is worth doing sooner rather than after another year of it. What the tags feed into matters too: see attribution models for how that channel then gets credit, and how to read your marketing report for turning it into a decision. Our case studies show what clean channel data makes visible.
Frequently asked questions
Do UTM tags hurt my SEO?
Not in practice. Tagged URLs can create duplicate versions of a page, but Google handles this routinely and a canonical tag resolves it. The real risk is not SEO — it is people sharing a tagged link organically, so your campaign accumulates traffic that had nothing to do with the campaign.
Should I tag links in my email newsletter?
Yes, and it is one of the highest-value places to do it, because email traffic otherwise arrives as Direct when opened in a desktop client. Use utm_medium=email with a date-stamped campaign name.
What is the difference between utm_source and utm_medium?
Source is who sent the traffic (linkedin, mailchimp, a partner’s name). Medium is what kind of marketing it was (cpc, email, social). Source can be anything; medium should come from a short controlled list, because GA4 matches it against fixed rules.
Can I fix UTM data after the fact?
No. The values are recorded with the session as they arrived. You can create custom channel groups to re-bucket messy historical data into more sensible groupings for reporting, which helps — but the underlying source and medium values cannot be rewritten.
Why is so much of my traffic “Direct”?
Direct is GA4’s bucket for sessions with no detectable source: typed URLs, bookmarks, most app and PDF links, some email clients, and untagged links generally. A large Direct share almost always means untagged links rather than genuine brand recall. Note that since May 2026 some of what used to land here is separated out as AI Assistant traffic.
Is there any point tagging if I only run Google Ads?
Not for the ads themselves — auto-tagging covers those better than UTMs could. But you almost certainly have other links: email signatures, a Google Business Profile website link, directory listings, social bios. Those are worth tagging, and they are exactly the ones sitting in Direct right now.
The short version
Lowercase everything. Use source, medium and campaign, and pick your medium from the values GA4 actually recognises. Never tag internal links, never hand-tag Google Ads. Date-stamp campaign names. Keep one spreadsheet and one owner.
That is genuinely most of it. UTM discipline is not a sophisticated technique — it is a small amount of consistency applied without exception, which is why it tends to be the first thing that slips and the cheapest thing to fix.
If your channel data is already a mess and you would rather someone untangled it, sorting out measurement is where we start with every client under performance marketing. Get in touch and we will audit what your reports are actually telling you.
Written by Adrian Tan, SDM. Last updated 31 July 2026. Sources: Google Analytics 4 Help — custom campaign URL parameters (answer 10917952), default channel group definitions (answer 9756891), GA4 release notes (answer 9164320).


