How to Add UTM Tags to Facebook Ads and Check They Work

8 min readTracking, Attribution, Reporting

Put the tags in the URL parameters field of each ad in Ads Manager and let Meta fill in the names instead of typing them: utm_source=facebook&utm_medium=paid&utm_campaign={{campaign.name}}&utm_term={{adset.name}}&utm_content={{ad.name}}. Keep the values lowercase and settle the names before you publish, because Meta stores them when the ad is first published. Then click the live ad, check that real names replaced the curly braces in the page address, and the next day look for the campaign in Google Analytics under Reports, Acquisition, Traffic acquisition.

You know Facebook sends people to your site. What your analytics cannot tell you is which campaign, ad set or ad sent them, so a lead that came in on Tuesday has no ad attached to it, and a campaign that deserves more budget looks exactly like one that should be paused. The fix is one field at the ad level in Ads Manager, filled in the same way on every ad, and checking that it works takes one click and one report. Meta's developer documentation and the Google help pages quoted below were read on September 15, 2026.

What a UTM tag does to an ad link

A UTM tag is a name and a value added to the end of the address your ad sends people to, after a question mark: utm_source=facebook, then an ampersand, then the next pair. When someone clicks and the page loads, your analytics tool reads those pairs from the address and files the visit under them. For campaign reports the address is the whole story: the tool records what it says, not what you meant.

That makes the tag a label you write for yourself. If it is wrong, blank, or the same on twenty ads, the report is wrong in exactly that way. This is why the naming decision matters more than the tool you use to build the string.

The parameters, and which ones to use on Meta

Google's help page on URL builders lists more parameters than the familiar five, including utm_id for a campaign ID, and says that when you add parameters to a URL you should always use utm_source, utm_medium and utm_campaign. It describes utm_content as the parameter for telling creatives apart and utm_term as the paid keyword. It also warns that values are case sensitive: utm_source=google and utm_source=Google are two different sources.

ParameterWhat it holdsOn a Meta ad
utm_sourceWhere the click came fromfacebook, spelled the same way on every ad
utm_mediumThe kind of marketing, such as cpc or emailpaid, so analytics can tell the click was bought
utm_campaignThe campaign or promotionMeta's campaign name parameter
utm_contentWhich creative the click came fromMeta's ad name parameter: this is your ad-level split
utm_termThe paid keywordMeta ads have no keywords, so the ad set name can go here
utm_idA campaign IDOptional: Meta's campaign ID parameter, which a rename does not change

Source and medium are more than labels: together they decide which channel a visit lands in. Google's page on the default channel group defines Paid Social as a source on its list of social sites combined with a medium that contains cp, is ppc or retargeting, or starts with paid, and it names Facebook as a social site. Organic Social needs only the social source, or a medium such as social. So cpc or paid as the medium is what puts a bought click into Paid Social, while a missing medium, or one like facebook_ads, leaves a click from facebook in Organic Social. The same page says channel definitions are not case sensitive, which means Facebook and facebook end up in the same channel but still appear as two rows wherever you look at the source itself.

Decide the naming once, before you tag anything

Write the rules into a note before the next launch and apply them to every campaign from then on. They are dull on purpose: every exception turns into a row you have to explain later.

  1. 1.One source value, frozen: facebook, in lowercase, on every ad. A second spelling is a second row.
  2. 2.One medium value that reads as paid, either paid or cpc. Pick one and never alternate.
  3. 3.Campaign and ad names written for the report. The name parameters copy the names from Ads Manager as they are, so a campaign called Test 2 FINAL (new) arrives in your reports under exactly that name. Lowercase words joined by hyphens, such as spring-cleaning-austin, read cleanly and sort together.
  4. 4.A different name for every campaign. Two campaigns that share a name share a row, and nothing in the report can pull them apart afterwards.
  5. 5.Names settled before publishing. Meta stores the names when an ad is first published, as the note further down explains, so a later rename never reaches your reports.
  6. 6.One saved string. Keep the finished parameter string in the note and paste it, instead of retyping it for every launch.

Where the tags go in Ads Manager

The tags belong to the ad, not to the campaign or the ad set. Set up the campaign and the ad set as usual, then move to the ad: below the website URL you will find either a URL parameters field or a Build a URL parameter link that opens one. Parameters can also be typed into the website URL itself, after a question mark, and both places work. The separate field is the tidier choice, because the page address stays readable and there is one place to look when a tag is wrong.

Do not type the names. Meta's developer documentation on URL tags lists macros for exactly this job: {{campaign.id}}, {{adset.id}}, {{ad.id}}, {{campaign.name}}, {{adset.name}} and {{ad.name}}. Each has two curly braces on each side, and Meta replaces it with the real value when the ad is shown, so one string pasted on every ad still reports each ad under its own name. Google Ads writes its own tracking parameters with a single brace, such as {campaignid} for the campaign ID, so a template copied from a Google campaign is not something Meta fills in.

Step by step in Ads Manager

  1. 1.Build the campaign and the ad set as usual, then open the ad.
  2. 2.Enter the page address in the website URL field, with nothing after it.
  3. 3.In URL parameters, paste one string: utm_source=facebook&utm_medium=paid&utm_campaign={{campaign.name}}&utm_term={{adset.name}}&utm_content={{ad.name}}
  4. 4.If campaign names in your account tend to change, add &utm_id={{campaign.id}} to the end of the string: an ID stays the same through a rename.
  5. 5.Repeat for every ad in the launch. If you make the next ad by duplicating this one, open the copy and check that the field came with it.
  6. 6.Publish, and run the checks further down once the ad is live.

Names are fixed at first publish. Meta's developer documentation says that when an object is first published, Meta stores its name values in a snapshot, and name-based parameters then read from that snapshot rather than from the live name. Rename a campaign or an ad after launch and your reports keep the old name. The ID parameters do not depend on names, which is why utm_id with the campaign ID is worth adding if names in your account change.

Why one typed string on every ad defeats the point

Type utm_campaign=spring-promo&utm_content=ad1 into one ad, copy that text into all five ads in the ad set, and every click reports as ad1. The report shows one row: you can see that Meta sent traffic, and nothing more. The name parameters exist so that one pasted string gives each ad its own value, without editing five fields by hand.

Where UTM tags cannot help

A UTM tag rides on a click that loads a page of yours. When an ad never sends anyone to a page, there is no address to tag, and two formats small advertisers use all the time work exactly that way.

  • Instant forms. The person fills in the form inside Facebook or Instagram and never reaches your site, so your analytics has nothing to read. The campaign behind such a lead comes from the lead record Meta keeps, not from a page address. What to store from that record, and where these leads go missing on the way to a CRM, is covered at aevin.dev/blog/facebook-lead-ads-not-showing-up.
  • Click-to-message ads that open WhatsApp, Messenger or Instagram Direct. The click starts a conversation, not a visit to a page.

Settle this before you build the campaign, not after. If seeing results in your own analytics matters to you, that pushes toward a landing page, and it is one of the inputs weighed at aevin.dev/blog/facebook-lead-ads-vs-landing-pages.

Check that the tags arrive

Two checks: the page address as soon as the ad is live, and the report once the data has been processed.

  1. 1.Click the live ad, from a computer if you can, and read the full address of the page it opens. You should see facebook, paid, and your real campaign, ad set and ad names. Curly braces still visible in the address mean the parameter was not filled in: check its spelling and that each side has two braces.
  2. 2.If your site redirects visitors, from an old page to a new one or from a short link, read the address after the redirect. A redirect that does not carry the part after the question mark along drops the tags, and the visit reaches your analytics without them.
  3. 3.The next day, open Google Analytics and go to Reports, then Acquisition, then Traffic acquisition. The report opens grouped by channel, and the visits from your ad should sit under Paid Social.
  4. 4.Switch the dimension to Session source / medium and look for facebook / paid as a row of its own. Then use the plus next to the dimension to add Session campaign as a second column, and swap it for Session manual ad content, which is filled from utm_content. You should see a separate row for each campaign and each ad, not one merged line.

Why the next day. Google's data freshness page gives processing times in hours for standard reports and a few minutes only for Realtime, and Realtime is the wrong place for this test in any case. Its traffic card shows first user source, medium and campaign, which Google defines by what first acquired the user, so a test click from a browser that has visited your site before appears under whatever brought that browser the first time.

Mistakes that break Facebook UTM tracking

What you seeLikely causeFix
Two rows, Facebook and facebookThe source typed with different casing on different adsLowercase, pasted from one saved string
Paid clicks under Organic SocialNo medium, or a medium that does not read as paidpaid or cpc as the medium on every ad
One row for all the ads in a setThe same typed values on every adName parameters instead of typed names
Curly braces in the page addressA misspelled parameter, or single braces copied from a Google templateTwo braces on each side, spelled as Meta lists them
Unrelated campaigns merged into one rowTwo campaigns with the same nameA different name for each campaign
Old names after a renameNames are stored when the ad is first publishedName before publishing, and add utm_id with the campaign ID
Tags on the ad, none on the landing pageA redirect that drops everything after the question markPoint the ad at the final address, or fix the redirect

Once the tags land cleanly, the question changes from where the traffic came from to which campaign deserves more of the budget, and where Meta's free reports stop for that question is covered at aevin.dev/blog/facebook-ads-reporting-tools. Tagging can also break without a sound when someone duplicates an old ad or edits a link, so the address check above belongs in the monthly review at aevin.dev/blog/facebook-ads-audit-checklist.

Where Aevin fits, and where it does not

Aevin, our own product at $97, $197 and $497 a month, connects Meta, Google Ads and TikTok in one panel, and it adds UTM tags when it launches a Meta campaign. The campaign is created whole and paused. The tags are not pasted into the website address you entered: they go into the ad creative's URL tags field, which Meta's developer reference describes as query string parameters added to the links people click. Unless you have given it a tracking rule of your own, the source is facebook, the medium is paid, and the campaign and content values are Meta's campaign name and ad name parameters. The same tags go on a new ad it builds inside an existing ad set and on a replacement creative in an existing ad, and a change to a running campaign is applied only after you confirm it, shown as before and after. Two limits belong in the same paragraph. The launch card says that tags will be added without printing the string, so run the click check above to see them. And because the default tags use name parameters, Meta's snapshot applies to them as it does to any other tags: settle campaign and ad names before you launch.

Should UTM tags go in the website URL or in the URL parameters field?

Both work: parameters can be typed into the website URL after a question mark, or entered in the URL parameters field at the ad level. The field is the tidier choice, because the page address stays readable and there is one place to look when a tag is wrong.

What should utm_medium be for Facebook ads?

A value Google Analytics reads as paid. Its default Paid Social channel needs a source on its list of social sites and a medium that contains cp, is ppc or retargeting, or starts with paid, so both paid and cpc qualify. Pick one of them and use it on every ad, because values are case sensitive and each spelling becomes its own row.

Do I need utm_term and utm_content on Facebook ads?

Google's guidance is to always use utm_source, utm_medium and utm_campaign, which leaves the other two optional. On Meta both are worth filling. The ad name parameter in utm_content is what splits results by ad, and utm_term, which Google defines as the paid keyword, has no keyword to hold on Meta and can carry the ad set name instead.

Why do my reports still show a campaign's old name after I renamed it?

Meta's developer documentation says name values are stored in a snapshot when an object is first published, and name-based parameters read from that snapshot rather than from the live name. A rename after launch never reaches the tags. Settle names before publishing, and add utm_id with the campaign ID parameter if you want a value that a rename cannot change.

Can UTM tags track leads from instant forms?

No. A UTM tag travels on a click that loads a page, and an instant form is filled in without leaving Facebook or Instagram, so your analytics never sees an address to read. Attribute those leads from the lead record Meta keeps, or from wherever the leads are delivered.

Why does my test click show the wrong source in Realtime?

The Realtime report's traffic card uses first user source, medium and campaign, which describe what first brought that visitor to your site. A test from a browser that has visited before shows the old source there. Check the Traffic acquisition report the next day instead, with Session source / medium as the dimension.