UTM Generator for Facebook & Meta Ads

Build a Meta-native URL parameters string with dynamic macros that auto-fill the campaign, ad set, and ad name for every Facebook and Instagram ad. A UTM builder made for Meta, not a generic link tagger. Free, no signup, no email gate.

UTM parameters

Meta "URL parameters" string (recommended)

Paste this into the URL parameters field at the ad level in Meta Ads Manager (no leading ?). Set it once on a template and every ad inherits it.

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

Full tagged URL

The complete link, for places that take a full URL (organic posts, email, or the website URL field).

https://example.com/landing?utm_source=facebook&utm_medium=paid_social&utm_campaign={{campaign.name}}&utm_content={{ad.name}}&utm_term={{adset.name}}

This string uses Meta dynamic parameters. Meta replaces {{...}} with the live campaign, ad set, and ad names at delivery, so one template tags every ad correctly - no per-link editing.

How to use it

How to use this Facebook Ads UTM builder

Set the values that stay fixed once, let macros carry the rest.

  1. 1

    Enter the destination URL

    Your landing page - the builder keeps it clean and appends the tags separately.

  2. 2

    Set the static values

    For values that never change, like utm_source=facebook and utm_medium=paid_social, choose Static text.

  3. 3

    Switch the per-ad values to dynamic

    For the parts that change per ad, pick Meta dynamic and a macro like {{campaign.name}} or {{ad.name}}.

  4. 4

    Copy the URL parameters string

    Paste it into the URL parameters field in Ads Manager, or copy the full tagged URL for organic posts and email.

What are UTM parameters for Facebook ads?

Five tags appended to a destination URL so GA4 can attribute the click. Without them, Meta traffic collapses into a generic paid or unassigned bucket.

utm_source

The platform - facebook.

utm_medium

The channel - paid_social.

utm_campaign

The campaign the ad belongs to.

utm_content

The specific ad or creative.

utm_term

Usually the ad set or audience.

Static vs Meta dynamic URL parameters

This is what separates a Meta UTM builder from a generic one. A generic builder freezes the campaign name into one static link, so a new campaign means a new link and 50 ads mean 50 hand-built URLs. Meta dynamic parameters resolve per ad at delivery instead, so a single string is correct for every ad in the account - each one reports its own real campaign, ad set, and ad name in GA4 with zero per-link editing.

Meta dynamic URL parameters (with a copy-paste template)

Meta exposes a small set of macros that resolve to live entity values at delivery, so one string tags an entire account.

Meta dynamic URL parameters and what each resolves to at delivery.
MacroResolves to
{{campaign.name}}The campaign name
{{adset.name}}The ad set name
{{ad.name}}The ad name
{{placement}}Where it served (e.g. an_classic, fb_story)
{{site_source_name}}The network: fb, ig, an or msg

Each name macro has an ID twin - {{campaign.id}}, {{adset.id}}, {{ad.id}} - for when you need the numeric ID instead.

Map the parts that change per ad to macros and hard-code the rest. Paste this once into the ad-level URL parameters field:

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

The macro output is only as clean as your entity names, which is why a consistent naming convention is what makes dynamic UTMs readable instead of a wall of raw IDs. For the full GA4 setup and why paid traffic collapses into “unassigned,” see the deep dive on UTM parameters for Meta ads.

🎵

TikTok uses different tokens

Same idea, different macros: __CAMPAIGN_NAME__, __AID_NAME__ (the ad group name), __CID_NAME__ (the ad / creative name) and __PLACEMENT__.

⚠️

The ID-macro trap

__AID__ is the ad group ID, not the ad ID, and __CID__ is the creative ID, not the campaign ID - reach for the _NAME_ variants for anything a human reads.

The URL parameters field, not the destination URL

📍Paste raw macros into the URL parameters field

Meta gives every ad a dedicated URL parameters field for exactly this. Putting tags there instead of in the destination URL keeps the landing page clean and survives creative edits. Paste a key=value&key=value string with no leading question mark.

Never URL-encode the braces: Meta reads the raw {{...}} tokens itself, so an encoded %7B%7B silently breaks the substitution and your rows land in GA4 as literal placeholder text.

UTM naming rules that protect your GA4 data

The same discipline that keeps names clean keeps tracking clean - generated, never typed.

Lowercase everything

GA4 treats Facebook and facebook as two different sources, so casing fragments your reports.

Underscores, not spaces

A space in a value breaks the query string - replace it with an underscore.

Fix source & medium

Keep utm_source and utm_medium constant and let macros carry the per-ad detail, the same way a token-based naming convention does.

Why UTM tagging falls apart at scale

One link is easy; a creative test that ships 30-50 ads a week is where hand-tagging gets skipped and attribution rots. Meta dynamic parameters fix the data side - the launch is the remaining bottleneck. uplads applies one destination URL and one URL Tags (UTM) string to every creative in a bulk launch, mapped to Meta’s native url_tags field and passed through unchanged so macros keep working. See the guide on Facebook Ads creative testing, and pair this with the ROAS calculator to tie tagged traffic back to return on ad spend.

Keep names and tracking generated, not typed

Frequently asked questions

How do you create UTM parameters for Facebook ads?
Decide on five values: utm_source (the platform, e.g. facebook), utm_medium (the channel, e.g. paid_social), utm_campaign, utm_content, and utm_term. Build them into a single key=value string joined by ampersands, then paste that string into the URL parameters field at the ad level in Meta Ads Manager. The builder above does this for you and, unlike a generic URL builder, lets you set utm_campaign, utm_content, and utm_term to Meta dynamic values so they fill in automatically per ad.
Is there a free UTM builder for Facebook ads?
Yes. This one is free, needs no signup or email, and runs entirely in your browser. The difference from generic free builders (which output one static link at a time) is that this builder is Meta-aware: it produces the URL parameters string Meta recommends, with optional dynamic macros like {{campaign.name}} that one template resolves correctly for every ad in an account.
What is a UTM parameter, and what does UTM stand for?
UTM stands for Urchin Tracking Module. UTM parameters are tags appended to a destination URL (utm_source, utm_medium, utm_campaign, utm_content, utm_term) that tell Google Analytics 4 and other analytics tools where a click came from. Without them, paid social traffic often collapses into a generic referral or direct bucket and you cannot tell which campaign, ad set, or creative drove a conversion.
What are Meta dynamic URL parameters?
Meta dynamic URL parameters are placeholders Meta replaces with live values at delivery: {{campaign.name}}, {{campaign.id}}, {{adset.name}}, {{adset.id}}, {{ad.name}}, {{ad.id}}, {{placement}}, and {{site_source_name}}. Put utm_campaign={{campaign.name}}&utm_content={{ad.name}} in the URL parameters field once and every ad reports its own real campaign and ad name in GA4 without you editing a single link by hand.
Should UTMs go in the destination URL or the URL parameters field?
Use the URL parameters field. Meta provides a dedicated ad-level URL parameters box specifically so you do not have to hard-code tracking into the destination URL. It keeps the landing-page URL clean, applies the same tags consistently, and survives creative edits. Paste the parameter string (no leading question mark) there, not a full URL.
How do I apply one UTM template across 50 ads at once?
Build a parameter string that uses Meta dynamic macros for the parts that vary per ad (utm_campaign={{campaign.name}}, utm_content={{ad.name}}) and static text for the parts that do not (utm_source=facebook). Because the dynamic values resolve per ad automatically, the same string is correct for every ad. uplads applies that string to every creative in a bulk launch through its URL Tags (UTM) field, so you tag 50+ ads from one input instead of editing 50 links.
Why is my Facebook ad traffic showing as direct or unassigned?
Almost always missing or malformed UTMs: no parameters at all, spaces or capital letters in values, or the auto-redirect from a link shortener stripping the query string. Keep values lowercase with underscores instead of spaces, set them in the URL parameters field, and avoid shorteners on paid links. The builder above sanitizes static values automatically.

Tag 100+ ads from one UTM string

A clean template only helps if it reaches every ad. uplads applies one destination URL and one URL Tags (UTM) string to every creative in a bulk launch - 100 ads ship correctly tagged in one pass instead of 100 manual edits.