How-to
UTM parameters for Meta ads: set once per account, applied to every ad
Most broken attribution is not a tracking problem: it is 40 ads with 40 slightly different UTMs. Save one template per ad account, apply it at launch, never type it per ad.
The short answer
Put UTMs in the ad's URL parameters field, not in the website URL. Meta appends that field at click time and fills its dynamic values ({{campaign.name}}, {{ad.name}}, {{placement}}) per click. Save one template per ad account and apply it at launch. Typed per ad, 40 ads means 40 slightly different UTMs.
Where UTMs live on a Meta ad
Every ad has a destination (the website URL) and a separate URL parameters field. Meta stores that field as url_tags and appends it to the destination when someone clicks. That split matters for two reasons:
- Meta's dynamic values (
{{campaign.name}},{{ad.id}}and friends) resolve only in the URL parameters field, per click. - The destination stays clean. The same landing page URL works in any campaign, and your analytics sees one canonical page.
Put UTMs in the website URL instead and you get static values, a longer URL to maintain, and a new landing URL for every campaign.
The dynamic values worth using
| Value | Resolves to |
|---|---|
{{campaign.id}} / {{campaign.name}} | the campaign the click came from |
{{adset.id}} / {{adset.name}} | the ad set |
{{ad.id}} / {{ad.name}} | the ad |
{{placement}} | where it was shown (Facebook Feed, Instagram Stories, ...) |
{{site_source_name}} | the surface: fb, ig, msg, an |
Names are readable but change when someone renames an object. IDs are stable but opaque. A common compromise: a name for utm_campaign and an ID for utm_content, or both, joined with an underscore.
A template you can copy
utm_source=meta&utm_medium=paid_social&utm_campaign={{campaign.name}}&utm_content={{ad.name}}&utm_term={{placement}}
- utm_source fixed:
meta(orfacebookif your analytics history already uses it; do not switch mid-year). - utm_medium fixed:
paid_social. One value across every Meta campaign, forever. - utm_campaign: the campaign name. This is why the naming convention has to be free of spaces and special characters.
- utm_content: the ad name, so one row in your analytics maps to one creative.
- utm_term: placement, if you report on it. Drop it if you do not.
If your ad names already carry the creative's file name, utm_content links every analytics row back to the asset. That is the single most useful thing a UTM template does for a creative team.
The six mistakes that break attribution
- Different templates on different ads.
utm_source=facebookon Monday's batch andutm_source=metaon Friday's splits one channel into two rows forever. - Spaces, ampersands and pipes in inserted values.
Summer Sale & Morebecomes a broken query string unless encoded. Fix the names or encode the values. - A second question mark. A destination that already has
?ref=xplus parameters that start with?produces?ref=x?utm_source=.... Leave the leading?out of the parameters field and Meta handles the join. - Typing UTMs per ad. Any process with 40 manual entries has a typo rate. Apply the template, do not type it.
- Changing the template after launch. Edits create new ad versions and can reset learning. Decide once, before the batch.
- Redirect chains that drop parameters. Test the final landing URL with the parameters attached and confirm they reach your analytics. One ad per batch. Click, do not read.
Apply it once per ad account
The template belongs on the ad account, not on the ad. In Adlio you save a UTM template per ad account in the website settings. Every ad created from that account gets it as its URL parameters. Two details:
- You can mix Meta's dynamic values with Adlio's own tokens:
{filename},{index},{date},{campaign_name},{adset_name},{type}. Adlio resolves its tokens at creation with URL-encoded values. Meta's{{...}}values stay untouched for Meta to resolve per click. - The template is per account, so client A's parameters can never appear on client B's ads. The same holds for the naming pattern, the pixel, the identity and the DSA fields.
With the naming pattern, this makes "which ad drove that conversion" a lookup instead of a forensic exercise.
Verify on launch day
UTMs are check number 4 on the pre-launch QA checklist. Open two ads from the batch. Read the URL parameters field. Click through the preview. Confirm the values arrive in analytics with your dynamic tokens resolved. Adlio creates every ad paused, so this check happens before the first click is paid for.
Your first 15 ads are free, no card. See how bulk upload works and pricing.
Frequently asked questions
Should I put UTMs in the website URL or in the URL parameters field?+
In the URL parameters field (Meta calls the underlying value url_tags). Meta appends it to the destination at click time, and only there can dynamic values such as {{campaign.name}} resolve. Keep the website URL clean. It also makes the same creative reusable across campaigns.
Which dynamic values does Meta fill in?+
The common ones are {{campaign.id}}, {{campaign.name}}, {{adset.id}}, {{adset.name}}, {{ad.id}}, {{ad.name}}, {{placement}} and {{site_source_name}}. Meta substitutes them per click, so one template gives every ad a unique, readable value without typing.
Why do my UTM values show up with %20 or broken ampersands?+
A campaign or ad name contained spaces, ampersands or pipes and was inserted without encoding. Keep names free of those characters (a good naming convention already does), or use a tool that URL-encodes the values it inserts.
Can I change UTMs on 200 existing ads at once?+
Yes, with Ads Manager's bulk edit or an export-and-import. But every change creates a new version of the ad and, depending on what changed, can reset learning. Getting the template right before the batch is created is much cheaper.
Adlio team
Built by media buyers who launch Meta ads in volume. Questions or corrections: support@adlio.ai.
Topic cluster
Launch hygiene and QA
Naming, UTMs, pixel, identity and the paused review that makes a bulk batch safe to set live.
- Meta ads naming convention: a template to copy, applied to every ad
- UTM parameters for Meta ads: set once per account, applied to every ad
- The pixel and conversion event per ad account: set once, verify every launch
- Instagram account not showing in Ads Manager: the causes, and when you do not need it
- Adding ads to an existing ad set: what it does to the learning phase, budget and delivery
- Facebook ad review when you publish in bulk: timing, re-review triggers and paused ads
- Rolling back a bulk launch: pause many ads at once without resetting learning