Your first client is free.

Meta Ads UTM Builder

Tracking parameters for Facebook and Instagram campaigns, built from the three levels you already have open in Ads Manager. Source and medium are fixed, because for paid social they are not a decision.

Fixed for Meta

utm_source
meta

One spelling, forever. Not fb, not facebook.

utm_medium
paid_social

Groups Meta with your other paid social.

From your Ads Manager structure

The campaign name in Ads Manager.

utm_campaign

NIKE_META_PUR_NL_BRD

Usually the audience, which is what an ad set really varies.

utm_term

NL_BRD_18-45_ADV

The creative. This is the column that tells you which ad worked.

utm_content

UGC_PAIN_HOOK03_SARAH_V2

Tracking URL

https://example.com/product?utm_source=meta&utm_medium=paid_social&utm_campaign=NIKE_META_PUR_NL_BRD&utm_content=UGC_PAIN_HOOK03_SARAH_V2&utm_term=NL_BRD_18-45_ADV

Why the three levels map this way

Campaign to utm_campaign

The obvious one, and the one worth getting exactly right: if the value matches the campaign name in Ads Manager character for character, spend and sessions line up without a lookup table.

Ad set to utm_term

There is no keyword on paid social, so utm_term is free. An ad set is mostly an audience, and audience is what you actually want to segment by, so it earns the slot.

Ad to utm_content

utm_content exists to separate two links that are otherwise identical, which is exactly what two creatives in the same ad set are. This is the column that answers which hook worked.

Source and medium are not variables

Every Meta paid placement is meta / paid_social. Leaving them editable is how an account ends up with fb, facebook and Facebook as three sources.

Instagram is not a separate source

Placement is not acquisition channel. Both run through Meta, both are billed by Meta, and Meta already reports placement. Splitting them here only makes your channel report harder to read.

Dynamic URL parameters

Meta can inject {{campaign.name}} and its siblings at delivery. That works, but you inherit whatever was typed in Ads Manager, which is only useful if the names already follow a convention.