Help Center / Library / UTM Parameters

How UTM tracking works across channels

The short version

Metadata gives you one place to configure UTMs — your account UTM defaults (Settings → UTMs), optionally overridden per campaign — and applies that same config to every channel. The resolved UTM values are appended to your ad's landing-page (destination) URL. Separately, most ad channels have their own native tracking field (Meta: "URL parameters" / url_tags; Google & Microsoft: "tracking template"; LinkedIn: "URL parameters"). Metadata pre-fills that native field with the channel's own ID macros so the channel can stamp real campaign/ad IDs on each click. That field intentionally shows different content than your UTM settings — it carries channel macros, not your UTM values.

How it works

1. One channel-agnostic UTM config. Five standard parameters (utm_source, utm_medium, utm_term, utm_campaign, utm_content) plus any custom parameters. Each value is a literal you type or a single dynamic macro from the dropdown. Available macros:

  • ad channel (the one value that differs per channel)
  • campaign name, experiment name, experiment id
  • ad or ad group name, audience name or keyword
  • offer type ("Landingpage"/"Leadgenform"), offer form name
  • native channel campaign id, native channel ad id (the channel's own IDs)

There is no ad-set ID macro on any channel.

2. UTMs go into the destination URL — identically across LinkedIn, Meta (FB+IG), Google Ads, Microsoft Ads, and Reddit. For example: ...lp?utm_source=metadata&utm_medium=facebook&utm_campaign=download_case_study&utm_content=imageA. Metadata also adds its own attribution params (metadata_cid, metadata_aid, and md_nid on native-structure campaigns). Max URL length is 2048 characters.

3. Native ID tokens go into each channel's own field — not your UTM settings:

  • Meta (FB/IG) — field: URL parameters (url_tags); default aid={{ad.id}}&cid={{campaign.id}}; tokens {{campaign.id}} / {{ad.id}}.
  • Google Ads — field: Tracking template; tokens {campaignid} / {creative} (plus {keyword}, {matchtype}).
  • Microsoft Ads — field: Tracking template; same default/tokens as Google.
  • LinkedIn — field: URL parameters; default cid=CAMPAIGN_ID, aid=CREATIVE_ID (bare tokens, no braces).
  • Reddit — no native tracking field at all, so whatever Metadata writes into the URL is exactly what shows. No mismatch is possible.

Mapping a UTM parameter to native channel campaign id or native channel ad id is how a native-ID UTM ends up populated — Metadata routes it into the channel's native field using that channel's syntax.

4. Google Ads "Final URL Suffix" (Google-only). When you set a Final URL Suffix on a Google campaign, Metadata stops adding the UTM block to the URL and lets Google's suffix be the single UTM source (otherwise UTMs would appear twice). Metadata's attribution params still apply. Put your UTMs in the suffix using Google placeholders. No other channel has a Final URL Suffix.

5. Clean UTM values (encoding). With the account UTM-encoding setting on, Metadata writes readable values — spaces become _ and parentheses are removed — so downstream UTM parsers stay consistent. This applies to launched-ad UTM values on every channel (not preview URLs, not attribution params). Off by default.

Worked example: why your Metadata UTMs don't match Meta's "URL parameters" field

Metadata writes tracking into two different places on a Meta ad, and they are not meant to match:

  • Your configured UTMs are resolved to real text values at launch and appended to the ad's destination/landing URL. To verify them on a live ad, look at the ad's final URL — not the "URL parameters" field.
  • Meta's "URL parameters" field (the Graph url_tags field) is reserved for Meta's native dynamic ID tokens. By default Metadata sets it to aid={{ad.id}}&cid={{campaign.id}}. The only Metadata macros that flow into this field are native channel campaign id and native channel ad id, which Metadata translates into Meta's {{campaign.id}} and {{ad.id}} tokens (only Meta can fill those in at delivery).

So seeing different values in the two fields is expected behavior, not a bug.

Key behaviors to remember:

  • UTMs apply only to ads Metadata traffics. Ads built directly in Meta aren't touched. Metadata is the source of truth and re-stamps the destination link + Meta url_tags whenever it creates/recreates the ad creative (Meta creatives are immutable), so manual edits in Meta Ads Manager won't survive a Metadata-driven recreate.
  • One value per parameter. Each parameter takes either a single dynamic macro or a fixed text value. Metadata does not support {{ }} templating or combining multiple macros in one parameter value — {{ }} is Meta's syntax, not Metadata's.
  • Scope. Account-level UTM defaults let you add/rename/delete custom params; at the campaign level you can only toggle inherited params on/off (not add new ones). Up to 15 custom params.

FAQ

My channel's "URL parameters" / "tracking template" doesn't match my Metadata UTM settings — is something broken?

No — by design. Your UTM settings are written into the ad's landing-page URL. The channel's URL-parameters / tracking-template field is a separate field Metadata fills with the channel's own ID macros so the platform can stamp real IDs on each click. They're meant to look different. (Applies to Meta, Google Ads, Microsoft Ads, and LinkedIn.)

Can I combine macros into one custom parameter, like zcampaignid={{campaign.id}}_{{adset.id}}_{{ad.id}}?

No. Metadata allows one macro (or one literal) per parameter — no concatenation and no {{ }} templating, and there is no ad-set ID macro. The closest approach is two separate custom UTMs mapped to native channel campaign id and native channel ad id; Metadata passes those to Meta's URL-parameters field as {{campaign.id}} and {{ad.id}}.

Do I configure UTMs separately per channel?

No. One configuration applies to every connected channel. (You can set a different value per channel for a custom parameter, but the standard UTMs and macros are shared.)

Where do I edit UTMs?

Settings → UTMs for account defaults; the UTM Parameters section on a campaign to override for that campaign — one editor for all channels.

Will Metadata's UTMs apply to ads I built directly in Meta?

No — only to ads Metadata traffics. Metadata re-stamps the link and url_tags each time it creates/recreates the creative, so manual Ads-Manager edits to those fields won't persist.

Does Reddit support UTMs?

Yes, in the destination URL — same as other channels. Reddit just has no separate native tracking field, so there's nothing to mismatch.

I added a Google Final URL Suffix and my landing-page UTMs disappeared.

Expected — the suffix becomes the sole UTM source so UTMs aren't duplicated. Put your UTMs in the suffix, or clear it to go back to URL-baked UTMs.

Can I track the native campaign/ad ID as a UTM?

Yes — map a UTM parameter to native channel campaign id or native channel ad id; Metadata routes it into the channel's native field with the correct macro.

Can I update UTMs after the campaign launches?

Currently only for Lead Gen Form campaigns, not Landing Page campaigns.

Tips

  • Validate where your UTMs live: standard UTMs → landing-page URL; channel ID macros → the channel's own tracking field.
  • On Google Ads, pick one UTM home — the landing-page URL or the Final URL Suffix, not both.
  • To pass native IDs, add two separate custom UTMs (native campaign id + native ad id), not one combined value.
  • Avoid spaces/parentheses in names feeding UTMs — Google/Microsoft reject some characters in the tracking template / Final URL Suffix at launch.
  • Set account-wide UTMs in the global defaults; per campaign you can only toggle inherited params.