Your first client is free.

How should I structure Meta Ads UTMs?

Fix utm_source=meta and utm_medium=paid_social for every ad, then map Meta’s three levels onto the remaining parameters: campaign to utm_campaign, ad set to utm_term, ad to utm_content. That gives each level of the account its own reporting dimension.

A complete Meta tracking URL

https://example.com/product?utm_source=meta&utm_medium=paid_social&utm_campaign=nike_meta_pur_nl_brd&utm_term=nl_brd_25-45_feed&utm_content=ugc_painpoint_hook03_sarah_v2

The mapping, and why each one

Meta Ads levels mapped to UTM parameters
Meta levelParameterWhy
Platformutm_source=metaConstant. Meta is the place the click came from, whether the impression served on Facebook or Instagram.
Buying typeutm_medium=paid_socialConstant. This is what puts the spend in the right channel group.
Campaignutm_campaignThe budget and objective live here, so this is the level you report spend against.
Ad setutm_termTargeting and placement. There is no keyword on social, so utm_term is the free slot with the right granularity.
Adutm_contentCreative. utm_content exists to separate variants of the same campaign, which is exactly what an ad is.

This is a convention that reports well, not a Meta requirement. Meta does not mandate any UTM structure and will pass through whatever you put in the URL field. Teams whose analytics taxonomy already uses utm_term for something else routinely map ad set to utm_content and put the creative elsewhere. Either is defensible; using both in one account is not.

Meta's dynamic URL parameters

Meta can fill parts of the URL in for you at delivery time. In the URL parameters field you write a placeholder in double braces and Meta substitutes the real value when the ad serves.

Meta dynamic URL parameters
PlaceholderInserts
{{campaign.name}}The campaign name, exactly as typed in Ads Manager
{{adset.name}}The ad set name
{{ad.name}}The ad name
{{campaign.id}}The numeric campaign ID
{{adset.id}}The numeric ad set ID
{{ad.id}}The numeric ad ID
{{site_source_name}}Which surface served the impression, such as fb or ig
{{placement}}The placement the impression served in

Dynamic version

?utm_source=meta&utm_medium=paid_social&utm_campaign={{campaign.name}}&utm_term={{adset.name}}&utm_content={{ad.name}}

Dynamic or manual?

What is the catch with dynamic parameters?

They insert the name exactly as it exists in Ads Manager, including spaces, capitals, emoji and slashes. If your campaigns are called Nike | Purchase (NL) - Broad, that is what lands in your analytics, encoded. Dynamic parameters do not clean anything up; they expose whatever discipline your naming already has.

So when should I use them?

When your campaign, ad set and ad names already follow a strict convention. Then the placeholders are strictly better than typing: they cannot drift from the account, and renaming in Ads Manager keeps tracking in step. Without a convention first, they make the mess machine-readable rather than fixing it.

Should I use IDs instead of names?

IDs are stable and never contain a stray character, which makes them excellent join keys and unreadable in a report. A common compromise is a readable name in utm_campaign and the ID in utm_id, which GA4 recognises as the campaign ID.

Does the URL parameters field apply to every ad?

It is set per ad, so a change has to be applied across every ad you want it on. That repetition is another argument for one convention generated the same way each time rather than a field somebody fills in from memory.

Keeping names and tags in step

The structure above only pays off if the campaign name in Ads Manager and the value in utm_campaign are the same string. When they match, reconciling Meta spend against sessions is a join. When they differ by a capital letter, it is a manual mapping somebody rebuilds every month.

That is the practical reason to settle campaign naming before tagging. The Meta Ads naming convention template covers the three levels, and campaign naming conventions covers the field framework behind it.

One casing note worth being explicit about: the naming template recommends uppercase for campaign names because they are scanned in Ads Manager, while UTM values should be lowercase. If you use dynamic parameters, the uppercase name arrives in your analytics as-is, so pick one casing for both or accept that they will differ.

Names and tracking URLs from the same values

UTMConfig generates the Meta campaign, ad set and ad names and the matching tracking URL together, so the two can never disagree by a capital letter.

Create your workspaceFree for one client. No card required.