Meta Ads Naming Convention: A Copy-Paste Spec for All 3 Levels
A Meta ads naming convention works when every campaign, ad set and ad name uses the same short fields in a fixed order, and the ad name carries a stable creative ID.
By Sachit Sharma, CEO & Founder ยท Updated 10 Oct 2026

Key takeaways
- 01Use one format: lowercase fields joined by underscores, one fixed order, and a locked list of allowed values. The campaign name labels the bet, the ad set name labels the audience and setup, and the ad name labels the creative.
- 02
Put a creative ID (such as
cr0042) in every ad name and keep it identical in the asset file name, the ad name and the UTM parameters (Urchin Tracking Module tags added to a link so analytics can tell where a visit came from). - 03Keep budgets, bids, free text and "- Copy" out of names. Our spec examples run 22 to 41 characters, far below Meta's 400-character ad set name maximum.
- 04Check names with a script on every export, and roll the convention out forward-only instead of renaming the whole account at once.
In this article
- 1What Meta ads naming convention should you copy for campaigns, ad sets and ads?
- 2Why does the ad name matter more than the campaign name?
- 3What do 48 example names show about length and fields?
- 4Why do most Meta ads names fail?
- 5How do you carry the names into Google Analytics with URL parameters?
- 6How do you roll out a naming convention in an account that is already messy?
- 7How can you check names automatically?
- 8How do consistent names feed a weekly creative test plan?
- 9Frequently asked questions
Most Meta ads names describe the wrong things. They record the budget, the bid and the date, all of which Ads Manager already stores and which go stale the day you change a setting. They leave out the one fact you cannot look up later: which creative this was.
That gap is what breaks reporting. When the ad name does not carry the creative's identity, no export, pivot table or analytics report can group results by concept, angle or hook, and every test review starts with someone opening ads one by one.
The fix is a short, fixed format. This page gives you a fill-in spec for campaign, ad set and ad names, the reasons behind each choice, the tracking string that carries your names into Google Analytics 4 (GA4), a rollout plan for an account that is already messy, and a script that flags any name that breaks the format. You can adopt it in an afternoon.
What Meta ads naming convention should you copy for campaigns, ad sets and ads?
Copy a three-level format with lowercase fields joined by underscores, one fixed order, and a controlled list of allowed values. The campaign name labels the bet, the ad set name labels the audience and delivery setup, and the ad name labels the creative. The ad name carries an ID that never changes.
| Level | Format | Example | Characters |
|---|---|---|---|
| Campaign |
|
| 30 |
| Ad set |
|
| 22 |
| Ad |
|
| 41 |
Use a hyphen inside a field (pain-sleep) and an underscore between fields. Lock the allowed values in a shared sheet so nobody writes prosp when the list says pros:
| Field | Allowed values |
|---|---|
| objective |
|
| stage |
|
| offer |
|
| quarter | The quarter you launched, such as |
| audience |
|
| placement |
|
| event |
|
| style |
|
| format and ratio |
|
The six objectives match the six outcome-based campaign objectives in Meta's Marketing API reference (sales, leads, traffic, awareness, engagement, app promotion) as of October 2026.
Each level records only the decision made at that level. An ad set is a group of ads that share the same budget, schedule, delivery optimization and targeting (Meta Business Help Center: ad set name), so its name carries the audience and the conversion event. Placement is also chosen at that level, so we record it there too. Do not repeat a field at a second level: if us is in the campaign name, it does not belong in every ad set and ad below it. Repetition makes names longer and gives you two places to be wrong when something changes.
Adjust the values to what you run, but keep the order and the separators fixed. Our recommendation is 4 to 7 fields per name: fewer and the name stops being searchable, more and nobody reads it. For the angle and hook fields, a ready list of hook types saves argument; our post on 30 scroll-stopping ad hooks, organised by psychological trigger is one place to start.
Why does the ad name matter more than the campaign name?
The ad name matters most because the decision you make every week is about creative, and the ad name is the only place a creative's identity lives. Campaign and ad set settings can be read back from Ads Manager at any time. Which concept, angle and hook an ad used cannot.
Give every distinct creative an ID (cr0042) the moment it is briefed, and use that same ID in the asset file name, the ad name, the creative brief and the URL parameters. When the same creative runs in three ad sets, it keeps one ID, so you can add its results together. Increase the version (v02) only when something visible changes. If you want to check where attention lands before a creative gets its ID, our free Ad Attention Heatmap needs no signup.
Then the questions that decide your next test become a sort, not a rebuild:
- Which hook number wins across all
pain-sleepads? Read the answer alongside hook signals versus conversion data, since an early hook win does not always become a purchase win. - Does
ugcbeatstudiofor the same angle? - Which creative IDs came from which brief?
Our view: if you can only afford one disciplined field, make it the creative ID.

What do 48 example names show about length and fields?
Across 48 example names printed in five public naming guides, lengths run 15 to 51 characters and fields run 3 to 8. We collected them in October 2026 and counted characters and underscore- or pipe-separated fields with a script.
| Level | Names | Characters (min / median / max) | Fields per name |
|---|---|---|---|
| Campaign | 16 | 15 / 32 / 39 | 3 to 6 |
| Ad set | 17 | 19 / 30 / 44 | 3 to 8 |
| Ad | 15 | 15 / 31 / 51 | 4 to 7 |
Three things stand out:
- The examples are short. Several of those guides advise longer ad names than any of their own examples.
- Six of the 48 names contain a character that causes trouble in URLs. Three use
%and three use the pipe|. Avoid both. - Density hurts. The longest ad set names, with 8 fields, are the hardest to scan.
These are hand-picked examples from guides, so they show what published examples look like, not what real accounts use. The length limits below are our recommendation, not a benchmark: campaign names under 40 characters, ad set names under 45, ad names under 55.
All 48 names, so you can recheck the count:
CAMPAIGN (16)
sales_prosp_evergreen_us_acme_2026q2
leads_prosp_springbundle_uk_acme_2026q1
sales_retarget_evergreen_us_acme
asc_sales_evergreen_us_acme_2026q2
BrandX_Conv_SpringSale_BOFU_Mar2026
BrandX_Aware_NewLaunch_TOFU_Jan2026
BrandX_Lead_Webinar_MOFU_Feb2026
ClientA_Conv_SpringSale_BOFU_Mar2026
PROS_CBO_TOF_US_2026Q2
RET_ABO_BOF_DE_MAY26
APLUS_CBO_TOF_INTL_2026Q2
LEAD_ABO_MOF_US_W20
Conversion_US_March2026
ClientA_Conversion_US_March2026
Lead_US_Q1-2026
sales|pros|evergreen|us|en|2026-01-13
AD SET (17)
broad_all_auto_purchase_us
lal_1p_pur30d_auto_purchase_us
interest_fitnessstack_auto_purchase_us
rt_vc_30d_excl_pur180d_auto_purchase_us
rt_engagers_60d_excl_pur90d_auto_purchase_us
LAL1%_US_Feed_CostCap
RT_PUR_UK_IGStories_CBO
BROAD_DE_Reels_HVol
LAL_Purchasers_1%_US_Feed_CostCap
BROAD_ALL_FEED_CONV
LAL3_1PCT_FEED_CONV
RET-WEB_30D_ALL_CONV
INT_FIT-HLTH_STORY_LEAD
Broad_UGC-Testimonial_AllPlacements
Broad-25-45F_SkincareRoutine_Feed-Story
Lookalike-Purchasers-1_SkincareRoutine_Feed
pros|broad|18-55|pur|auto|lowest|us|en
AD (15)
cr0042_priceanchor_hook01_vid_creatorA_v01
cr0043_testimonial_hook03_sta_studio_v02
cr0058_ugc_hookunboxing_vid_jane_v01
cr0101_ugc_bundleA_08assets_mix_v03
UGC_Video_20%Off_V1
Testimonial_Static_FreeTrial_V3
ProblemHook_Carousel_30Off_V2
VID_PAIN_V1_A042
IMG_SOCIAL-PROOF_V2_C019
CAR_OFFER_V1_C031
VID_UGC_V1_V301
UGC-Testimonial_V3_Story_PriceSlash
SkincareRoutine_V2_4x5_BeforeAfter
ProductDemo_V3_1x1_ROI-Numbers
cr00142|pricingproof|hook01|woman30-40|vid|9x16|v03
Why do most Meta ads names fail?
Most Meta ads names fail because they encode things that change, or that Ads Manager already stores, and omit the one thing that does not change: the creative's identity. Five patterns cause nearly all of it.
- Budgets and bids in names. A name that says
daily50is wrong the day you change the budget. Ads Manager stores the budget, so leave it out. - Free text. "Summer video with Jane v2 FINAL" cannot be filtered or grouped. Every field should come from a list.
- Drifting abbreviations.
pros,prospandprospectingproduce three rows in one pivot. A locked vocabulary fixes this. - A date first. If the first field is a date, every truncated view shows a date and no strategy. Put the quarter last, and only on the campaign.
- "- Copy". Duplicating in Ads Manager can leave a copy label on the name, so a duplicate looks like the original. Rename duplicates before publishing.
Spaces, % and | belong on the same list. They get encoded when a name is passed into a URL, which makes analytics labels hard to read and hard to match.
How do you carry the names into Google Analytics with URL parameters?
Paste a URL parameters string into the ad's tracking section so Meta fills in your names automatically. Use this string on every ad:
utm_source=meta&utm_medium=paid_social&utm_campaign={{campaign.name}}&utm_content={{ad.name}}&utm_term={{adset.name}}&utm_id={{campaign.id}}
The {{...}} placeholders are replaced by Meta with the live campaign, ad set or ad name when the ad is clicked (Meta Business Help Center: URL parameters), so the tag can never drift from the name. We map the ad name to utm_content because the ad name holds the creative ID, which is what you group on in analytics. Pick any mapping you like, but use the same one in every account.
Parameter values in GA4 are case sensitive: utm_source=google is different from utm_source=Google (Google Analytics Help: URL builders). A lowercase convention removes that problem. The same page describes utm_id as the campaign ID, which is why the string above includes it.
One consequence, from our reading of how the substitution works: the name is filled in at click time, so renaming a live ad splits its sessions into two labels in analytics, before and after the rename.
How do you roll out a naming convention in an account that is already messy?
Apply the spec to everything new from today, set it up in Ads Manager so it is hard to get wrong, and rename old items only when they still earn their keep. Do not rename the whole account.
Set a start date.
Every campaign, ad set and ad created from that date follows the spec.Use name templates.
Meta lets you create name templates and apply them when you create a new campaign, ad set or ad, and anyone in the ad account can use them (Meta Business Help Center: name templates). A template shapes new names; it does not rewrite existing ones.
Assign creative IDs to the ads still spending.
Rename the top spenders, not the long tail. If you are unsure which ads are worth the effort, score them first with the Facebook ads creative audit scorecard.
Rename in one batch and log it.
Record old name and new name in a sheet with the date, so the analytics split is explainable.Review the vocabulary every quarter.
Add a value when you start something new; do not let anyone invent one in the name field.
How can you check names automatically?
Run the script below on an Ads Manager export and it prints every name that breaks the spec. Export your ads as a CSV with the columns Campaign name, Ad set name and Ad name, save the script as check_names.py, and run python3 check_names.py export.csv.
import csv, re, sys
RULES = {
"Campaign name": r"(sales|leads|traffic|aware|engage|app)_(pros|ret)_[a-z0-9-]+_[a-z]{2}_\d{4}q[1-4]",
"Ad set name": r"(broad|lal\d|int-[a-z0-9-]+|rt-[a-z0-9-]+)_[a-z0-9-]+_(adv|feed|reels|stories)_(purchase|atc|lead)",
"Ad name": r"cr\d{4}_(ugc|studio|demo|testimonial|static)_[a-z0-9-]+_hook\d{2}_(vid|img|car)_(9x16|4x5|1x1)_v\d{2}",
}
bad = 0
with open(sys.argv[1], newline="", encoding="utf-8-sig") as f:
for row in csv.DictReader(f):
for column, pattern in RULES.items():
name = row.get(column, "")
if name and not re.fullmatch(pattern, name):
bad += 1
print(f"FAIL {column}: {name!r}")
print(f"{bad} name(s) failed")
Test it before you trust it. Save these three rows as test.csv:
Campaign name,Ad set name,Ad name
sales_pros_evergreen_us_2026q4,broad_all_adv_purchase,cr0042_ugc_pain-sleep_hook03_vid_9x16_v02
Spring Sale - Copy,broad_all_adv_purchase,UGC_Video_20%Off_V1
leads_ret_webinar_us_2026q4,rt-site_30d_feed_lead,cr0043_studio_proof-reviews_hook01_img_4x5_v01
Pass: rows 1 and 3 print nothing. Fail: row 2 prints two lines, FAIL Campaign name: 'Spring Sale - Copy' and FAIL Ad name: 'UGC_Video_20%Off_V1', followed by 2 name(s) failed. Edit the patterns to match your own vocabulary table.
How do consistent names feed a weekly creative test plan?
Consistent names let you answer "which angle and hook won?" from your own export before you plan the next test. That is the step our platform sits behind. We combine ad-performance data, competitor activity, customer signals and past ad learnings into ranked weekly creative test plans and execution-ready creative briefs for Meta advertising teams, which is what we mean by ad creative intelligence.
A plan can only rank what the history lets it group. If your ads carry a creative ID, angle and hook, you can check any recommendation against your own results by sorting. Reporting alone does not choose the next test; the gap between the two is covered in creative analytics versus test planning.
To see how a ranked weekly plan looks against your own account history, book a demo with our founding team. Pricing is shared in the demo.

See a ranked weekly creative test plan
Frequently asked questions
leads_ret_webinar_us_2026q4 is a good campaign name for a retargeting lead campaign. It is 27 characters, reads left to right as objective, stage, offer, market and launch quarter, and passes the script above.
Use underscores between fields and hyphens inside a field, and avoid spaces. Spaces are encoded as %20 when a name is passed into a URL, which makes analytics labels messy. One separator per job also lets a spreadsheet split names into columns.
Sources
- 1.Meta Business Help Center: Ad set name
- 2.Meta Business Help Center: Adding URL parameters to Meta ads
- 3.Meta Business Help Center: About name templates in Ads Manager
- 4.Meta Marketing API reference: Ad set (name maximum of 400 characters)
- 5.Meta Marketing API reference: Campaign (outcome-based objectives)
- 6.Google Analytics Help: URL builders (GA4)



