UTM parameters for Meta ads: set them once per account, apply them to every ad
Most broken attribution is not a tracking problem; it is 40 ads with 40 slightly different UTMs. The fix is a template that lives on the account and is applied at launch, never typed per ad.
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 separation matters for two reasons:
- Meta's dynamic values (
{{campaign.name}},{{ad.id}}and friends) are only resolved in the URL parameters field, per click. - The destination stays clean, so 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 human-readable but change when someone renames an object; IDs are stable but opaque. A common compromise is 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, which is why the naming convention has to be free of spaces and special characters.
- utm_content: the ad name, so a 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 contain the file name of the creative, utm_content links every analytics row back to the actual asset. That is the single most useful thing a UTM template can do 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=.... Meta handles the join if you leave the leading?out of the parameters field. - Typing UTMs per ad. Any process with 40 manual entries has a typo rate. The template has to be applied, not typed.
- 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 survive to your analytics. Do this on one ad per batch, and click, do not read.
Apply it once per ad account
The template belongs on the ad account, not on the ad. In Adlio you store 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's tokens are resolved at creation time with URL-encoded values; Meta's{{...}}values are left untouched for Meta to resolve per click. - Because the template is per account, client A's parameters can never appear on client B's ads. The same is true for the naming pattern, the pixel, the identity and the DSA fields.
Together with the naming pattern this is what makes "which ad drove that conversion" a lookup instead of a forensic exercise.
Verify on launch day
On the pre-launch QA checklist UTMs are check number 4: open two ads from the batch, read the URL parameters field, click through the preview, and confirm the values arrive in analytics with your dynamic tokens resolved. Because Adlio creates every ad paused, that check happens before the first click is paid for.
Free for your first 15 ads, 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 its dynamic values such as {{campaign.name}} be resolved. Keep the website URL clean; it also makes the same creative reusable across campaigns.
Which dynamic values does Meta fill in?+
The commonly used 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 produces a unique, readable value for every ad without typing.
Why do my UTM values show up with %20 or broken ampersands?+
Because a campaign or ad name contained spaces, ampersands or pipes and was inserted without encoding. Either 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. It is much cheaper to get the template right before the batch is created.
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, identity, DSA and the paused review that makes a bulk batch safe to set live.
- Meta ads naming convention: a template you can copy, and how to apply it to every ad
- UTM parameters for Meta ads: set them once per account, apply them to every ad
- The pixel and conversion event per ad account: set once, verify on every launch
- Instagram account not showing in Ads Manager: the causes, and when you do not actually 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 the paused-ads advantage
- Rolling back a bulk launch: pause many ads at once without resetting learning
- Managing multiple Facebook ad accounts: how to keep client A's settings out of client B's ads
- Meta ads in the EU: the DSA beneficiary and payer fields, and how to stop them blocking your launches