Growth marketer operator · San Jose, CA | ZuAI: 10K → 2M users at $0.02 CAC | $300k/mo ad spend managed
Ar.Bhavesh Pro
free tool · campaigns

One naming convention for campaign, ad set and ad.

build the three names from the same fields in the same order, so a reporting table groups itself months later instead of being read by eye. live character counts, warnings for the two things that break splitting, and nothing is uploaded.

campaign level ad set level ad level
separator
underscore is the default because it survives spreadsheets, URLs and most platform search boxes without being encoded or treated as a word break
case
lowercase by default, so Meta and meta cannot end up as two rows in the same report
campaign name meta_signups_pro-trial_2026-q4
30 characters
ad set name meta_signups_pro-trial_2026-q4_lookalike-1pct_us
48 characters
ad name meta_signups_pro-trial_2026-q4_lookalike-1pct_us_founder-story_v1
65 characters

Why this matters

the same three campaigns, named by three people in the same quarter, and then named once.

what most accounts look like
  • Meta - Signups - Sept push
  • tiktok_installs_v2 FINAL
  • Google | students | US | new
one convention
  • meta_signups_pro-trial_2026-q3
  • tiktok_installs_pro-trial_2026-q3
  • google_signups_pro-trial_2026-q3

the second set groups by channel, by objective, by offer and by quarter without anyone renaming anything. the first set can only be read.

Why a naming convention is really a column problem

a campaign name is not a label, it is a row key. every ad platform export and every dashboard hands you the name as one string, and the only way to answer a question like "did lookalikes beat interest targeting across both channels" is to split that string on one character and treat each piece as a column. if the pieces sit in a different order in every row, or there are four of them in one name and six in the next, nothing splits and you are back to reading names one at a time.

the test is mechanical. drop the export into a spreadsheet, run =SPLIT(A2, "_") or the split-text-to-columns menu item, and see whether column three is the offer in every single row. if it is, you can pivot the account by channel, by objective, by offer and by quarter in about a minute. if it is not, the convention failed, and no amount of care in the platform interface fixes it after the fact.

that is also why the separator can never appear inside a field. one lookalike_1pct in an underscore-joined name adds a phantom column and shifts every field after it by one, which is worse than a messy name, because the split still runs and quietly produces wrong groupings.

Fix the fields and their order, even when some are blank

the value of a convention comes from position, not from content. field one is always the channel, field two is always the objective, field three is always the offer. once that is true, anyone can read a name without a key, and a pivot table built last quarter still works on names created this week. the three levels here are nested on purpose: the campaign name carries channel, objective, offer and period, the ad set name repeats those and adds audience and geo, and the ad name adds the creative angle and the variant. most exports give you the ad row on its own, so a name that stands alone is worth the extra characters.

blanks are the part people get wrong. leaving a field empty does not just shorten the name, it shifts every field after it into the wrong column, so one row splits into six pieces and the next into four and the pivot silently mixes them. this builder skips empty fields rather than emitting a double separator, but the better habit is to fill every slot with a real short value: all for a geo that runs everywhere, evergreen for something with no end date, none for a level that genuinely has no variant.

use two different characters: one to join fields, another to join words inside a field. meta_signups_pro-trial_2026-q4 reads cleanly and splits cleanly because the underscore only ever means "next field" and the hyphen only ever means "same field, next word". that single rule prevents most of the mess a naming convention is supposed to prevent.

The convention matters less than having exactly one

teams lose real weeks arguing about underscores against pipes. it does not matter. what matters is that one document exists, that it lists the fields in order, and that every person launching in the account has seen it. a mediocre convention followed by everybody beats an elegant one followed by two people, because the reporting only works if the account is consistent, not if it is clever.

campaign names usually end up inside utm_campaign on every link the campaign points at, so the same rules apply twice over: lowercase, no spaces, and no characters that need encoding in a URL. this is the practical argument for the underscore. a pipe is readable in the platform interface and becomes %7C the moment the name lands in a link, which puts two versions of the same campaign in your analytics. build the tagged links with the UTM builder, and run anything you inherited through the UTM checker before trusting the numbers.

agree the convention before launch, not after. renaming a campaign later does not annotate history, it rewrites it: most platforms report on the current name, so an export you pulled last month and an export you pull today will disagree about what the same campaign was called. cheap to decide on day one, permanently annoying on day ninety.

Naming is the boring half. Knowing what to cut is the other one.

if the account is finally readable and you still cannot tell which ad set to kill this week, that is the conversation. bring one account to the call.

Let's talk Growth
FAQ

Common questions

What is a campaign naming convention?

a fixed set of fields, in a fixed order, joined by one character. meta_signups_pro-trial_2026-q4 is a convention. Meta Sept push (new) is a name someone typed. the difference only shows up months later, when the first can be split into columns and grouped and the second can only be read.

Which separator should I use, underscore, pipe or hyphen?

underscore, unless you have a specific reason. it survives spreadsheet exports, it needs no encoding in a URL, and it is easy to type into a platform search box. a pipe reads well but becomes %7C as soon as the name lands in a utm parameter. a hyphen collides with the character most people already use inside a field, as in pro-trial.

Should the ad set name repeat the campaign name?

in most accounts, yes. plenty of exports and dashboards hand you the ad set or ad row on its own, and a name like lookalike-1pct_us tells you nothing about which campaign it belonged to. repeating the parent costs characters and buys you a name that stands alone in any table. if your reporting always carries the campaign column next to it, you can drop the repeat.

How long should a campaign name be?

the platforms allow far more than you need, so the platform limit is not the real one. the report is. names get truncated in table columns, in pivot labels and in exports opened on a laptop, so past roughly 100 characters a name stops being readable exactly where you look at it. that is why the counter here turns at 100 rather than at a platform maximum.

Can I use the same name for utm_campaign?

that is usually the point of building it this way. campaign names end up inside utm_campaign on every link, so keep them lowercase, free of spaces, and made of characters that do not need encoding, and one string works in both places. the UTM builder puts it into a link and the UTM checker tells you what is wrong with the links you already shipped.

Is anything I type here uploaded?

no. it all runs in your browser, there is no account, and nothing is sent anywhere. you can load the page, go offline, and it still builds names. campaign names leak product plans and launch dates, so a naming tool that needs to see them is a tool worth skipping.

next

Other free tools