Skip to main content

Structure your Meta ad names so Kickbite can segment them

A naming convention for the Meta Ads Manager ad-name field. Once your names are structured, Kickbite groups creative performance by angle, offer, product, format, and variant using simple contains() queries.

Written by Juan Garzon

Structure your Meta ad names so Kickbite can group performance by every concept variable you're testing — angle, offer, product, format, variant — using simple contains() queries.


The problem

Free-text ad names break creative reporting. Names like "shop the spring deal" or "TF best video v2 final FINAL" tell Kickbite nothing about what's being tested. Every ad becomes its own bucket. You can't ask "which angle is winning across all our products?" or "how does video compare to image, holding angle constant?" without manually tagging hundreds of ads after the fact.

When you're running 50–200+ creatives, this is the difference between answering "which angle wins?" in seconds vs. hours. A structured ad name carries the test hypothesis inside the name itself: every concept variable you care about — angle, offer, product, format, variant — appears in the string, ready to be grouped.

The convention below makes ad naming a system instead of a habit. Once it's locked, your team's media buyers can't accidentally drop a dimension, invent a synonym, or break the report.


How Kickbite parses your ad names

Kickbite groups performance by running contains() queries on the ad name string. A query like contains('ErvaringenKlanten') returns every ad whose name includes that substring, regardless of where it sits in the name.

Two consequences:

  • Field order doesn't matter to Kickbite. Kickbite finds values by substring, not position. You can put format first or last — the grouping works either way. You'll still want a consistent reading order so humans scanning Ads Manager see a predictable rhythm, but that's a team convention, not a Kickbite requirement.

  • Every concept variable being tested must appear in the name. If angle isn't in the name, Kickbite can't group by angle. The grouping is only as rich as the structure you encode.

That's the whole mechanic. The rest of this article is about making the values inside the name collision-proof and consistent.


The convention at a glance

A Meta ad name is a single underscore-joined string of dictionary values:

<value1>_<value2>_<value3>_..._<valueN>

Worked example:

TF_Video_Sales_Deal_ToiletPietro_ErvaringenKlanten_Text1

Reading the example: brand TF, format Video, funnel Sales, offer Deal, product ToiletPietro, angle ErvaringenKlanten, variant Text1. The recommended reading order for humans is <brand>_<format>_<funnel>_<offer>_<product>_<angle>_<variant> — but again, Kickbite doesn't care about order.

Formatting rules — every value

  • PascalCase for multi-word values: ErvaringenKlanten, ToiletPietro, BundelVoordeel. Word boundaries are visible without internal separators.

  • Alphanumeric only. No spaces, hyphens, dots, ampersands, slashes, or accents (write e, not é). Hyphens and dots inside a value would either break downstream parsers or get URL-encoded if the name ever ends up in a URL.

  • Underscore is reserved as the field separator. It never appears inside a value.

  • All values capitalized, even single words (Video, not video), to keep the visual rhythm consistent.

  • Length under ~120 characters to stay within Meta's display limit. If you're getting close, drop optional context (brand code, funnel) before dropping required concept variables.


The required dictionary

Kickbite's segmentation can only group by values that appear in your dictionary. Lock the dictionary before you start naming ads.

Required concept variables

These four variables drive Kickbite's primary segmentation. Every ad name must include exactly one value from each.

variable

what it is

starter values

product

product or product line being promoted

brand-defined (e.g., ToiletPietro, KidsBedding)

offer

offer type featured in the creative

FullPrice, Deal, Discount, Bundle, Free, Trial, Gift, NoOffer

angle

messaging angle (the most important field)

Korting, ErvaringenKlanten, BundelVoordeel, PremiumKwaliteit

format

creative format

Video, Image, Carousel, Story, Reel, Collection, Ugc, Static

For the offer field, use NoOffer rather than NoneNone would collide with the substring None appearing in other contexts.

For genuine multi-product creatives, concatenate product values alphabetically: BadgoedBeddengoed, ApparelKidsBedding. There's a trade-off here, covered later.

Angle is where 80% of repeatable creative-testing wins come from. The other dimensions slice your data; angle tells you which message resonates. Give angles room to grow — you'll keep adding new ones as you test. Common extensions to the four starters: Probleem, Demonstratie, VoorNa, Schaarste, Educatie, Influencer.

Variant — required for any ad in a test

Every ad in a test (which is almost every ad) gets a variant identifier in the format <Type><Number>.

variable

format

examples

variant

<Type><Number>

Text1, Hook2, Thumb3, Concept1, Cta2

Allowed types: Text, Hook, Thumb, Cta, Music, Voiceover, Concept.

Even a single ad in a test of one gets Text1 or Concept1. Never blank — when a test concludes you need to know whether you tested text variations, hook variations, or thumbnail variations.

Optional context

variable

values

when to include

brand

2–4 PascalCase chars (e.g., TF, YM)

multi-brand workspaces

funnel

Awareness, Consideration, Sales, Retargeting, Retention

when funnel-stage filtering matters

You can add your own optional dimensions (audience, placement, geo, lang) as long as the values follow the formatting rules and don't collide with anything else in the dictionary.


Defining your brand's dictionary

Sit down with whoever owns paid-social analytics on your team and answer one question: "Six months from now, what dimensions do I want to group creative performance by?"

The answers become your dictionary. For each dimension, write down the complete list of allowed values. Once the dictionary is locked, no freestyle additions — every new value goes through a quick collision check (covered below) and gets added formally.

A starter template you can copy:

dimension

required?

values

product

yes

(your product taxonomy)

offer

yes

FullPrice, Deal, Discount, Bundle, Free, Trial, Gift, NoOffer

angle

yes

Korting, ErvaringenKlanten, BundelVoordeel, PremiumKwaliteit (extend as you test)

format

yes

Video, Image, Carousel, Story, Reel, Collection, Ugc, Static

variant

yes (for tests)

Text1, Hook1, Thumb1, Cta1, Music1, Voiceover1, Concept1

brand

optional

2–4 PascalCase chars

funnel

optional

Awareness, Consideration, Sales, Retargeting, Retention

Lean on the starter values where they fit, replace where they don't. The product list is yours; the angle list will grow with every test you run.


Collision-proofing — three rules

Because Kickbite uses contains(), the same collision risks that plague UTM tracking apply here. Three rules:

1. Distinct values across dimensions. A value should appear in exactly one dimension's dictionary. If Bundle is an offer value, do not also use Bundle (or any string containing Bundle) as an angle. A contains('Bundle') query would otherwise return both offer-bundle and angle-bundle ads, mixed together.

Worked counter-example: a media buyer asks the team to add Deal as a new angle. Refuse. Deal is already in the offer dictionary — using it as an angle would make contains('Deal') queries return both offer-deal ads and angle-deal ads, mixed together. Suggest something more distinctive: LimitedTimeDeal, WeeklyDeal, or just use a different angle name entirely.

2. Numeric values get a unit suffix. If you encode discount or price tiers in the ad name, write 10pct, not 10. Without the suffix, contains('10') falsely matches 100, 1099, or 2010. Same logic as the UTM convention.

3. Multi-word PascalCase for ambiguous values. Single short words like Sale are collision risks. Multi-word PascalCase values like ErvaringenKlanten or BundelVoordeel land cleanly in contains() queries because they're unique enough that nothing else accidentally matches.

When someone proposes a new dictionary value, run a quick mental collision check: does the new value appear as a substring of any other dimension's values? If yes, suggest a more distinctive alternative.


Deployment — two paths

Pick the path that matches whatever LLM tooling your team already uses. The output is identical; only the install differs.

Path A: Claude skill (Cowork or Claude Code)

A skill auto-activates whenever someone asks Claude to name a Meta ad. It enforces the dictionary, asks for missing fields, and outputs a clean ad name plus a TSV row for the log sheet.

  1. Create the folder ~/.claude/skills/meta-ad-name-builder/.

  2. Drop SKILL.md (the formal skill spec) inside.

  3. Restart Cowork or Claude Code.

  4. Test: ask Claude "Name a Meta video ad for brand TF, sales funnel, deal offer, ToiletPietro product, social proof angle, first text variant". The skill should produce TF_Video_Sales_Deal_ToiletPietro_ErvaringenKlanten_Text1 and a log row.

Path B: Copy-paste prompt (Claude.ai or ChatGPT)

For team members who use chat UIs without skill support.

  1. Open the copy-paste prompt (the ad-naming-prompt.md file from this skill).

  2. Paste the entire contents into a new conversation.

  3. Start describing ads.

The prompt enforces the same dictionary and produces the same output. Most teams ship both paths — skill for media buyers using Cowork, prompt for occasional users on Claude.ai.


Setting up the creative log sheet

Every ad name the builder produces comes with a TSV row. Pasting it into the next empty row of a Google Sheet builds your historical creative log automatically.

  1. Google Sheets → File → Import → select the CSV template.

  2. Choose "Replace spreadsheet" and "Detect automatically".

  3. Freeze the header row (View → Freeze → 1 row).

  4. Add data validation on the dictionary columns (format, funnel, offer, angle) using the dictionary values you locked in. The sheet itself will reject free-text entries.

  5. Share with the media-buying team as editor.

The headers are:

launch_date,brand,format,funnel,offer,product,angle,variant,ad_name,hypothesis,status,notes

The hypothesis column is one short sentence the buyer fills in before launch ("does customer-review framing beat discount framing for the toilet line?"). Leave status and notes blank unless you have something to say.


How segmentation looks in Kickbite

Once your ad names follow the convention, every concept variable is one query away.

[SCREENSHOT: Kickbite segmentation view showing groupings by angle]

Examples:

  • All social-proof ads across brands and products: contains('ErvaringenKlanten')

  • All bundle-offer performance: contains('Bundle')

  • All video format: contains('Video')

  • All hook variant tests: contains('Hook')

  • Specific brand × angle slice: contains('TF') AND contains('PremiumKwaliteit')

  • One specific A/B test, just the social-proof variant: contains('TF') AND contains('ToiletPietro') AND contains('ErvaringenKlanten')

Combine AND/OR to drill into any combination. The reports answer the questions your team is actually asking — "which angle is winning?", "is video beating image holding angle constant?", "which hook in the bundle test is converting?" — without anyone manually tagging anything.

A note on multi-product ads. contains('KidsBedding') will return both single-product KidsBedding ads and multi-product creatives that include KidsBedding (e.g., ApparelKidsBedding). This is intentional: when you ask "how is KidsBedding performing across all our creative", you want bundles in the answer. If you ever need to isolate single-product ads, add a secondary filter that excludes the bundle string (e.g., NOT contains('ApparelKidsBedding')). For most reporting, the inclusive behavior is what you want.


Worked workflows

Two short examples of the convention in practice.

A/B angle test

Test social proof vs. discount framing for the same product. Hold every other variable constant; vary only angle:

TF_Video_Sales_Deal_ToiletPietro_ErvaringenKlanten_Text1
TF_Video_Sales_Deal_ToiletPietro_Korting_Text1

After launch, contains('ErvaringenKlanten') and contains('Korting') return each variant's performance. The test result is unambiguous because nothing else in the names varies.

Hook variant series

Four hook variations of the same concept. Hold every variable constant except the variant identifier:

YM_Image_Retargeting_Bundle_KidsBedding_BundelVoordeel_Hook1
YM_Image_Retargeting_Bundle_KidsBedding_BundelVoordeel_Hook2
YM_Image_Retargeting_Bundle_KidsBedding_BundelVoordeel_Hook3
YM_Image_Retargeting_Bundle_KidsBedding_BundelVoordeel_Hook4

contains('Hook1') through contains('Hook4') directly answer which hook won.


Extending the dictionary

When the team needs a new value — a new angle they're testing, a new product launch, a new format like Gif — follow this sequence:

  1. Run the collision check: does the new value substring-match any existing value in any dimension?

  2. If clean, add the value to your skill's SKILL.md dictionary section (and to the prompt copy if you use the prompt path).

  3. Update the data validation lists in the log sheet.

  4. Communicate the new value in your team channel — no silent additions.

Never rename an existing dictionary value. Renaming retroactively breaks Kickbite's historical aggregations: yesterday's Probleem ads will stop matching tomorrow's ProblemFocus query. If you need a different name, leave the old value in the dictionary, mark it deprecated in writing, and use the new value going forward.


Anti-patterns to avoid

  • Don't use free-text names. Every ad must contain dictionary values for product, offer, angle, format, and variant.

  • Don't invent dictionary values on the fly. Ask first; run the collision check.

  • Don't use lowercase, spaces, hyphens, dots, or special characters inside a value.

  • Don't use a numeric value without a unit suffix (10pct, not 10).

  • Don't use a value that substring-collides with a value in another dimension.

  • Don't leave the variant blank — even a single ad in a test of one gets Text1 or Concept1.

  • Don't use this for campaign or ad set names. This convention is for the ad-name field only.


FAQ

What if my ad runs across Meta, TikTok, and Google?
This convention is Meta-only. TikTok and Google have their own naming systems and aren't covered here. Kickbite's Meta-side segmentation works once your Meta names are structured — your TikTok and Google reporting follows whatever conventions those platforms (and your team) use separately.

How long is too long?
Aim to stay under ~120 characters total. That's where Meta's Ads Manager display starts truncating names visually. Kickbite parses past that limit, but humans reading the names in Ads Manager won't. If you're getting close, drop optional context (brand code, funnel) before dropping required concept variables.

What if a media buyer ignores the convention and types a free-text name?
Two safeguards. First, the data validation on your log sheet rejects free-text entries — the sheet itself becomes a gate. Second, Kickbite filters out un-conforming names from segmented reports, so the offending ad simply won't appear in any angle/offer/format grouping. The buyer will notice their work is missing from reports and self-correct.

Can I add my own concept variable beyond the required four?
Yes. As long as the values follow the formatting rules (PascalCase, alphanumeric, underscore-separated) and don't substring-collide with values in any other dimension, add whatever dimensions help your reporting — audience, placement, geo, lang, anything else.

What if I want to rename an angle?
Don't. Renaming retroactively breaks every historical Kickbite aggregation that relied on the old value. Add a new value, mark the old value deprecated in writing, and use the new value going forward. Reports across the renaming boundary will simply show two values until the deprecated one ages out.

Does the order of fields matter?
Not to Kickbite. Field order is a team convention for human readability — the recommended reading order is <brand>_<format>_<funnel>_<offer>_<product>_<angle>_<variant>, but you can pick any order as long as the team uses it consistently.

Did this answer your question?