A naming convention that survives 300 ads
A naming convention is not admin. It is the only thing that makes an account readable later, and the thing that decides whether a quarterly review takes an hour or a week. The rules below are deliberately boring: a fixed vocabulary, one delimiter, the same field order every time, and UTMs that mirror the names so analytics and Ads Manager tell the same story.
The rules
One delimiter, everywhere
Pick the pipe or the underscore and never mix. Spaces around delimiters are invisible and break exact-match filtering, so do not use them.
Fixed field order, always the same
A name is only scannable if the third segment is always the same kind of thing. Empty fields get a placeholder rather than being skipped.
A closed vocabulary per field
UGC, not ugc or User Generated. Write the list down once. Free text in a name is how a convention dies.
Dates as YYYY-MM-DD
Sorts correctly, reads unambiguously in every country, and does not need explaining to a new hire.
Nothing that will change
Do not put budget or status in a name. Anything that changes turns the name into a lie the first time it is edited.
Campaign level
Pattern: OBJECTIVE | MARKET | OFFER | STRUCTURE | YYYY-MM-DD
OBJECTIVE
SALES, LEADS, TRAFFIC, AWARENESS, APP. Matches the Meta objective so filtering by name matches filtering by objective.
MARKET
Country or region code: US, CA, UK, EU, AU, ROW.
OFFER
The commercial thing being promoted: EVERGREEN, BF-SALE, BUNDLE, NEWSLETTER. Closed list.
STRUCTURE
CBO or ABO, plus ASC for Advantage plus shopping. Tells you how the budget behaves before you open it.
DATE
The launch date, not today's date. Example: SALES | US | EVERGREEN | CBO | 2026-08-26
Ad set level
Pattern: AUDIENCE | TARGETING | PLACEMENT | OPTIMISATION
AUDIENCE
BROAD, LAL1-PUR180, INT-FITNESS, RET-ATC30. Encode the source and the window so a retargeting set is never ambiguous.
TARGETING
Age and gender band if you split them: 25-54-ALL, 18-34-F. Use ALL rather than leaving it blank.
PLACEMENT
ADV for Advantage placements, or the manual set: FEED, REELS, STORIES. If you never split placements, keep the field with ADV anyway so field positions stay stable.
OPTIMISATION
The optimisation event: PUR, LEAD, ATC, LPV. The single most useful thing to see at a glance. Example: BROAD | 25-54-ALL | ADV | PUR
Ad level
Pattern: CONCEPT | HOOK | FORMAT | RATIO | VERSION | YYYY-MM-DD
CONCEPT
The idea, not the file: SOCIAL-PROOF, FOUNDER-STORY, PROBLEM-AGITATE, DEMO. This is the field you will group by when you review what worked.
HOOK
The opening line or device in three words: STOP-SCROLLING, 3-REASONS, BEFORE-AFTER.
FORMAT
UGC, STATIC, MOTION, CAROUSEL, TESTIMONIAL, GREENSCREEN.
RATIO
1x1, 4x5, 9x16. Placement performance analysis is impossible without it.
VERSION
V1, V2, V3. Increment for any change to the asset, never reuse. Example: SOCIAL-PROOF | 3-REASONS | UGC | 9x16 | V2 | 2026-08-26
The UTM mapping
Use Meta dynamic macros so each ad fills its own values at click time
utm_source=facebook
Static. Use instagram only if you split by publisher platform and genuinely act on the difference.
utm_medium=paid-social
Static. Consistency across channels matters more than the exact word, but pick one and never change it.
utm_campaign={{campaign.name}}
The macro, not a hardcoded string. Hardcoding is what breaks when campaigns are duplicated.
utm_content={{ad.name}}
This is why the ad name matters: it becomes the row in your analytics report.
utm_term={{adset.name}}
Ad set in term keeps audience-level analysis available without adding a custom parameter.
Verify the braces survive publishing
Some tools URL-encode the macros, which sends a literal percent-encoded string to analytics instead of the resolved name.
Making it stick
Store the convention in the tool, not a document
A template applied at launch produces compliant names without anyone remembering the rules. A document produces arguments in month three.
Audit monthly with a filter
Filter ad names that do not contain your delimiter, or that contain a space. Anything returned was created outside the convention.
Never rename live ads to fix history
Renaming does not retroactively fix the UTM values already sent to analytics, so you end up with two identities for one ad. Fix the convention going forward instead.
Copy the patterns above into your own doc, replace the vocabularies with your own, and store the final version wherever your ads are actually created.