Putting utm_medium=social on Meta Ads URLs causes GA4 (Google Analytics 4) to log paid clicks as "organic" traffic. This isn't a misconfiguration or a GA4 bug — it's the result of GA4's official classification regex ^(.*cp.*|ppc|retargeting|paid.*)$[1] OR-ing against the Organic Social rule.
This article works through what to put into utm_medium for Meta Ads, using the official regex GA4 actually evaluates.
Key takeaways#
- Use
utm_medium=cpc. Shortest match for GA4's Paid Social regex - Never use
social. It collides with Organic Social and logs paid ads as organic paid_socialandpaid-socialsplit your reports. Pick one and lock it across the org
1. The regex GA4 actually evaluates#
GA4's Default Channel Group auto-classifies each hit using utm_source and utm_medium[1]. A session lands in Paid Social when both conditions hold:
utm_sourcematches GA4's "social sites list"utm_mediummatches the regex^(.*cp.*|ppc|retargeting|paid.*)$
The regex chains 4 alternatives with | (OR). Each pattern's meaning and matching values:

In short: values containing "cp" or starting with "paid" match. Values like social, display, meta, paid social (with a space), and blank do not match.
2. How utm_medium breaks#
Incident 1: utm_medium=social logs paid ads as organic#
GA4's Organic Social rule matches utm_medium against social / social-network / social-media / sm[1]. With utm_source=facebook + utm_medium=social, the Medium-only match is enough — the session is classified as Organic Social. Money spent on Meta paid ads gets logged as organic traffic, and reported ROAS is understated.
Incident 2: paid_social / paid-social split, and meta falls into (other)#
The regex paid.* matches both paid_social and paid-social. Paid Social classification works, but GA4 stores dimension values with the original punctuation intact. Mixing both in delivery causes Paid Social to show two separate rows that need manual merge in monthly reporting.
Separately, naming it utm_medium=meta ("because it's Meta Ads") matches none of the regex alternatives. The session fails the Paid Social condition and lands in Default Channel Group's (other), disappearing from the Paid Social report.
3. Recommended format and verification#
utm_source=facebook
utm_medium=cpc
utm_campaign={{campaign.name}}
utm_content={{ad.name}}
utm_term={{adset.name}}
utm_id={{campaign.id}}
Three reasons utm_medium=cpc is the safest choice:
- Guaranteed regex match: shortest fit for
.*cp.*— near-zero typo risk - Universally readable: short for "Cost Per Click" — anyone looking at the report instantly knows it's a paid-click channel
- Aligned across channels: Google Ads / TikTok Ads / LinkedIn Ads also use
cpcby convention — cross-channel reports stay consistent
Here's what happens with values other than cpc:

Two checks before and after launch:
- Pre-launch URL preview: open the URL parameter field in Meta Ads Manager's ad-editing screen, click "URL preview", confirm
utm_medium=cpcshows up as expected - Post-launch GA4 realtime: within 30 minutes, open GA4 → Realtime → Source/Medium and confirm
facebook / cpcis showing. If you seefacebook / socialor(direct) / (none), the parameter isn't reaching GA4
Summary — the "right answer" is in the regex#
There's an ongoing debate online: social vs paid_social vs cpc. But what GA4 actually evaluates is one regex: ^(.*cp.*|ppc|retargeting|paid.*)$[1]. social doesn't match. cpc does. That's the entire story.
RevenueScope auto-merges utm value drift — cpc / paid_social / paid-social collapse into a single channel — so you can read paid-channel revenue, RPS, and AOV with the spelling noise removed.
Related on /news:
- The utm_source you should NOT use for Meta Ads (pillar — utm_source edition)
- UTM parameters: how to use them right
- The "last-click trap" that distorts your ad budget decisions
References#
- Google Analytics Help, "[GA4] Default channel group" (Apr 2026)
- Meta Business Help Center, "URL dynamic parameter spec" (Apr 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
