It's not unusual to see utm_source=meta on URLs for Meta Ads (Facebook Ads and Instagram Ads). After the corporate rename to Meta, it feels natural.
But when you open GA4's officially published "Default Channel Group Source Categories" list, the registered entries are facebook, fb, and facebook.com. meta is not on the list[1]. This isn't a cosmetic issue — it's the exact point where your Paid Social report either holds together or falls apart.
This article derives a recommended UTM format for Meta Ads by working backward from Google Analytics' own classification logic and source list. Not vendor advice, not industry folklore — a conclusion based on the file GA4 actually reads.
Key takeaways#
- Use
utm_source=facebook(lowercase).metais not in GA4's official list, so it never lands in Paid Social - Use
utm_medium=cpc. Puttingsocialinstead pulls paid traffic into Organic Social - 80% of incidents are casing / spelling drift. When
facebook/Facebook/fb/metaco-exist, one campaign splits into four rows
1. How GA4 decides "Paid Social"#
Per Google's official documentation, GA4 classifies a session as Paid Social when both conditions are true[2]:
- Source (
utm_source) matches GA4's managed "social sites regex list" - Medium (
utm_medium) matches the regex^(.*cp.*|ppc|retargeting|paid.*)$
The social-sites regex list itself is published by Google as an .xlsx file. When you download and open it, you see 819 source names paired with category labels[1].
A relevant excerpt:
utm_source value | Category in GA4's official list |
|---|---|
facebook | SOURCE_CATEGORY_SOCIAL |
facebook.com | SOURCE_CATEGORY_SOCIAL |
fb | SOURCE_CATEGORY_SOCIAL |
m.facebook.com | SOURCE_CATEGORY_SOCIAL |
instagram | SOURCE_CATEGORY_SOCIAL |
instagram.com | SOURCE_CATEGORY_SOCIAL |
l.instagram.com | SOURCE_CATEGORY_SOCIAL |
twitter | SOURCE_CATEGORY_SOCIAL |
twitter.com | SOURCE_CATEGORY_SOCIAL |
meta | Not in the list |
Meta | Not in the list |
The string meta appears nowhere in GA4's official classification list. Ads tagged utm_source=meta are therefore judged by GA4 as "not a social site" and land in Referral or (other), not Paid Social. The intuition "the company is now Meta, so utm_source=meta is natural" doesn't match Google's classification rules.
2. Four ways utm_source breaks#
Incident 1: utm_source=meta makes Paid Social disappear#
As above, meta isn't in the official list. Meta Ads revenue surfaces as a standalone row meta / cpc instead of rolling into Paid Social. Next month's report shows "Paid Social revenue collapsed," but really — the classification just peeled off.
Incident 2: facebook vs. Facebook become two channels#
GA4 stores utm_source values case-sensitively. Within a single campaign, mixing utm_source=facebook and utm_source=Facebook produces two separate rows. When four variants (facebook / Facebook / fb / meta) coexist, one campaign splits into four rows, each showing roughly 25–33% of the true number.
Incident 3: utm_medium=social routes paid into Organic Social#
GA4's Organic Social rule fires when utm_medium matches social / social-network / social-media / sm, OR utm_source matches the social list[2]. Because this is an OR condition, utm_source=facebook + utm_medium=social lands in Organic Social purely on the medium match. Paid revenue gets counted as organic, and your ad ROAS looks artificially low.
Incident 4: URL dynamic parameters fail validation after delayed substitution#
Meta's "URL dynamic parameters" let you embed macros like {{campaign.name}}, {{adset.name}}, {{ad.name}} in your URL, expanded at delivery[3]. Convenient — but the preview at submission time still shows the raw macro. If you don't verify after launch, you won't notice that utm_campaign is empty or that unexpected characters (spaces, non-ASCII) crept in, until you open GA4 mid-campaign.
3. Recommended format (derived from the official list)#
Given the classification logic above, lock the Meta Ads URL parameters to this:
utm_source=facebook
utm_medium=cpc
utm_campaign={{campaign.name}}
utm_content={{ad.name}}
utm_term={{adset.name}}
utm_id={{campaign.id}}
Why each value#
utm_source=facebook— AmongSOURCE_CATEGORY_SOCIALentries in GA4's official list, this is the most common representation of Meta Ads.fbis functionally equivalent, but locking tofacebookminimizes casing drift operationallyutm_medium=cpc— Matches GA4's Paid Social regex^(.*cp.*|ppc|retargeting|paid.*)$and does not match anysocial-family Organic rule. Minimum collision riskutm_campaign={{campaign.name}}— Substituted at delivery. Place the raw macro at submission and verify post-launch that real values are flowing into GA4utm_content={{ad.name}}andutm_term={{adset.name}}— Align granularity so the GA4 "Campaign" dimension can be decomposed by ad / ad set
"We want to split out Instagram"#
Instagram ads also ship through Meta Ads Manager. If you want delivery-surface separation, switching utm_source from facebook to instagram does give you an Instagram-only row — but you then need to re-aggregate to see total Meta Ads revenue. Depending on your reporting design, a cleaner long-term setup is: keep utm_source at the delivery platform level and store the delivery surface in a custom dimension from the {{placement}} macro.
4. Two-step verification#
At minimum, run these two checks before and after launch:
- Pre-launch URL expansion simulation — In the Meta Ads Manager ad edit screen, enter test values in the URL parameter fields and open the "URL preview." Confirm macros expand as intended with no unexpected characters (spaces, non-ASCII, uppercase) injected
- Post-launch GA4 realtime check — Within 30 minutes of delivery start, open GA4 → Realtime → "Source/Medium" and verify visits appear as
facebook / cpc. If you seemeta / cpcor(direct) / (none), the parameters aren't reaching GA4
Running these two steps vs. skipping them changes the rate of "classification broken / numbers don't match" incidents at end-of-month by an order of magnitude.
Bottom line — the "correct answer" is in GA4's own file#
Social media debates the utm_source question endlessly: "Team facebook," "Team meta," "Team fb." But what GA4 actually reads is one public file with 819 source-category entries. facebook is in it. meta is not. This isn't a blog opinion or a vendor recommendation — it's the specification of the classification engine itself.
In practice, utm casing drift skews monthly revenue roll-ups by 20–30% more often than anyone admits. When delivery platforms multiply, agencies stack, and URLs get issued independently inside and outside the org, picking a single organizational-level convention and locking it down is a prerequisite to any tooling you install on top.
RevenueScope normalizes utm casing drift automatically, merging facebook / Facebook / fb / meta into a single channel — so channel-level revenue, RPS, and AOV hold together even when the incoming URLs don't. It's built as a complement to the situation where "GA4's classification is broken and back-filling historical data is too expensive to justify."
Related articles on /en/news:
- GA4 e-commerce setup in 30 minutes — Shopify edition
- 71% of Japanese stores have GA4 installed. Only 11% actually use it.
- GA4 isn't a revenue tool — the attribution blind spot
- The last-click trap distorting ad-budget decisions
References#
- Google "GA4 Default Channel Group Source Categories" April 2026
- Google Analytics Help "Default channel group" April 2026
- Meta Business Help Center "URL dynamic parameters specification" April 2026
See which ads actually drive revenue, at a glance
14-day free trial. No credit card required. Up and running in 5 minutes.
Start 14-day free trial