Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when the user needs to design or clean up an ad account structure: campaign/ad set/ad hierarchy by objective, a naming convention that makes data readable, CBO vs ABO by stage, how many ad sets and creatives to run, and the minimum daily budget an ad set needs to exit learning. Trigger on 'account structure', 'campaign structure', 'naming convention', 'set up campaign', 'how many ad sets', 'CBO or ABO', or 'restructure ad account'.
.claude/skills/minhnv0807-52-account-structure-global/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | -10% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 110% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 103% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 69% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 47% | 0% |
Good structure means data you can read, optimizations you can trust, and scaling that does not fall apart. Run this after 53-tracking-setup-global verifies green, and after 51-audience-research-global and 54-media-plan-global exist.
Read the media plan and audience profile if they exist. If information is missing, ask up to 4 questions:
Account
|-- Campaign 1 — [Objective] — [Product/Offer] (Cold Testing)
| |-- Ad Set 1.1 — [Broad / Advantage+] -> Ad A (hook 1) / Ad B (hook 2)
| |-- Ad Set 1.2 — [Interest theme A] -> Ad A / Ad B
| |-- Ad Set 1.3 — [Interest theme B] -> Ad A / Ad B
| \-- Ad Set 1.4 — [Lookalike 1-3%] -> Ad A / Ad B
|-- Campaign 2 — [Objective] — Scale winner (split out once a winner is proven)
\-- Campaign 3 — Retargeting
\-- Ad Set 3.1 — [Warm 7-30 days] — objection-handling creative| Level | Format | Example | |-------|--------|---------| | Campaign | [Platform]_[Objective]_[Product]_[AudienceType]_[Market]_[MMYY] | META_LEAD_COURSE-A_COLD_US_0726 | | Ad Set | [Audience]_[Age]_[Gender]_[Placement]_[Budget] | INT-BUSINESS_25-45_ALL_ADVPLUS_150USD | | Ad | [CreativeType]_[HookType]_[Version] | VID_PAIN_v1, IMG_SOCIAL-PROOF_v2 |
Rules: uppercase, underscore separators, no spaces, no special characters. Include the market code when running more than one country — regional cost differences are large enough (Tier 1 CPM 6-7x Tier 2, per references/benchmarks-global.md) that blended reporting hides the truth. The ad name must match utm_content exactly (see 53-tracking-setup-global) so ads manager data and GA4 reconcile in both directions.
Before building, run this test on the planned structure:
| Question | If no | |----------|-------| | Can every ad set reach ~50 optimization events per week at its budget? | Merge ad sets or optimize for an earlier funnel event | | Do two ad sets target overlapping pools? | Merge them; overlap bids against yourself | | Is there a real hypothesis behind each split? | Delete the split |
On Meta, the default modern answer is one broad or Advantage+ ad set with several creatives, plus a small number of deliberate tests. On Google, prefer fewer campaigns with more conversion volume over many thin ad groups.
| | ABO (budget at ad set) | CBO / Advantage campaign budget | |---|------------------------|----------------------------------| | Use when | Testing — you need guaranteed spend on each audience | Scaling — a winner exists, let the algorithm allocate | | Advantage | Every ad set gets enough data to conclude | Automatically pushes spend to the best performer | | Risk | You must manually pause losers | Budget concentrates on one ad set; other tests starve | | Rule | Default to ABO in testing | Move to CBO only once an ad set is proven stable |
TESTING (weeks 1-2): one campaign per objective; 3-5 ad sets (broad/Advantage+, interest theme A, interest theme B, lookalike, small retargeting); 2-3 ads per ad set to test creative and hook. ABO with even budgets. Goal: find the winning audience and creative. Pause any ad set above 2x target CPA after 3 days.
SCALING: split the winner into its own CBO campaign. Increase +20-30% per step, never double overnight (see 55-scaling-ads-global). Do not edit the winning ad set while scaling. Keep testing new creative in parallel inside the testing campaign.
MAINTAINING: 15 minutes of daily monitoring. Refresh creative every 2-3 weeks. Retargeting runs continuously.
| Campaign type | % Budget | Purpose | |---------------|---------|---------| | Cold — testing | 30% | Find new winners | | Cold — scaling | 50% | Main volume | | Retargeting | 15% | Convert warm and hot | | Lookalike | 5% | Open new pools from proven seeds |
Do not use a fixed currency figure. Derive it from the target CPA so it holds in any market:
Daily floor per ad set = (50 optimization events x target CPA) / 7 days
Quick sanity check = daily budget >= 5x target CPAUsing global Meta CPA medians of $18-38 from references/benchmarks-global.md, the derived floor is roughly:
| Target CPA | Derived daily floor per ad set | |-----------:|-------------------------------:| | $18 | ~$130 | | $25 | ~$180 | | $38 | ~$270 |
If the budget cannot support that floor, do one of three things, in order: (a) merge ad sets, (b) optimize for an earlier, more frequent event such as Add to Cart or Lead instead of Purchase, (c) reduce the number of markets. Never split budget thinner and hope. In Tier 2 markets the same math produces a much lower floor because CPA is lower — recalculate per market, do not copy a Tier 1 floor into a Tier 2 account or vice versa.
Google Search and LinkedIn behave differently: Search needs enough clicks at the market CPC ($1-2 broad, $5-50+ on commercial intent) to gather signal, and LinkedIn's $30-100+ CPM means a viable B2B ad set floor is materially higher than a Meta one.
File name: account-structure-[product]-[YYYYMMDD].md
markdown# Account Structure — [Product] — [Platform] Stage: [Testing/Scaling/Maintaining] · Monthly budget: [amount] · Markets: [list] ## 1. Campaign tree [Full hierarchy using the naming convention] ## 2. Ad set table | Campaign | Ad set (named) | Audience | Daily budget | ABO/CBO | Ads inside | ## 3. Naming convention applied | Level | Format | Real example from this project | ## 4. Budget allocation | Campaign type | % | Daily amount | Monthly amount | ## 5. Learning-phase math | Ad set | Target CPA | Derived floor | Planned budget | Passes? | ## 6. Pre-launch checklist - [ ] Pixel/CAPI fires correctly on landing and confirmation pages (see 53-tracking-setup-global) - [ ] Correct conversion event selected (Lead / Purchase), no duplicates - [ ] Consent mode and CMP live in EU/UK and California traffic - [ ] UTMs on every link; utm_content matches the ad name exactly - [ ] Test events all green — NOT GREEN MEANS DO NOT LAUNCH - [ ] Naming format applied across campaigns, ad sets, and ads - [ ] Every ad set budget clears the derived learning floor - [ ] Exclusions applied: cold excludes purchasers and warm audiences
| Mistake | Consequence | Fix | |---------|-------------|-----| | Too many ad sets for the budget | Nothing exits learning, no conclusive data | Consolidate to 3-5, or 1 broad plus tests | | Editing an ad set mid-learning | Learning resets, CPA swings | Wait until learning completes, then edit | | Ad-hoc naming | Data cannot be filtered or compared | Apply the format and rename before launch | | Retargeting mixed into cold | Wrong message, artificially cheap CPA | Split campaigns and cross-exclude | | CBO during testing | Budget collapses onto one audience | ABO to test, CBO to scale | | One structure across many markets | Tier 1 costs get blended with Tier 2 | Split by market or at minimum tag the market | | Manual ad sets fighting Advantage+/PMax | Overlapping auctions, unreadable attribution | Pick one approach per objective and hold it |
51-audience-research-global: source of the targeting behind each ad set.54-media-plan-global: total budget and channel split before campaigns are cut.53-tracking-setup-global: must verify green before launch.05-ad-copy-global: copy and creative for each ad.19-ab-test-setup-global: how to test one variable inside this structure.55-scaling-ads-global: rules for splitting out and funding winners.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-02 | fail→pass | 44,730 | 31,034 | -31% | 1 | 1 | 0% | 8,295 | 7,459 | -10% | 0 | 0 | — |
case-01 | fail→fail | 28,757 | 24,384 | -15% | 1 | 1 | 0% | 5,469 | 6,537 | +20% | 0 | 0 | — |
case-03 | fail→fail | 32,948 | 22,861 | -31% | 1 | 1 | 0% | 5,005 | 6,903 | +38% | 0 | 0 | — |
case-04 | pass→pass | 11,733 | 19,227 | +64% | 1 | 1 | 0% | 1,901 | 4,797 | +152% | 0 | 0 | — |
case-05 | pass→pass | 14,305 | 19,276 | +35% | 1 | 1 | 0% | 2,804 | 5,248 | +87% | 0 | 0 | — |
case-06 | pass→pass | 16,825 | 20,289 | +21% | 1 | 1 | 0% | 2,619 | 5,682 | +117% | 0 | 0 | — |
case-07 | fail→pass | 16,504 | 19,074 | +16% | 1 | 1 | 0% | 2,822 | 5,927 | +110% | 0 | 0 | — |
case-08 | fail→pass | 16,976 | 17,519 | +3% | 1 | 1 | 0% | 2,772 | 5,627 | +103% | 0 | 0 | — |
case-09 | fail→fail | 12,776 | 13,298 | +4% | 1 | 1 | 0% | 2,594 | 5,258 | +103% | 0 | 0 | — |
case-10 | pass→pass | 8,523 | 8,854 | +4% | 1 | 1 | 0% | 1,569 | 4,289 | +173% | 0 | 0 | — |
case-11 | pass→pass | 14,505 | 17,956 | +24% | 1 | 1 | 0% | 2,404 | 5,974 | +149% | 0 | 0 | — |
case-12 | fail→pass | 12,392 | 7,513 | -39% | 1 | 1 | 0% | 2,311 | 3,908 | +69% | 0 | 0 | — |
case-13 | pass→pass | 13,457 | 12,963 | -4% | 1 | 1 | 0% | 2,318 | 4,727 | +104% | 0 | 0 | — |
case-19 | fail→pass | 19,195 | 13,743 | -28% | 1 | 1 | 0% | 3,247 | 4,778 | +47% | 0 | 0 | — |
case-14 | pass→pass | 14,808 | 19,616 | +32% | 1 | 1 | 0% | 2,377 | 6,393 | +169% | 0 | 0 | — |
case-15 | pass→pass | 17,134 | 16,555 | -3% | 1 | 1 | 0% | 2,780 | 5,573 | +100% | 0 | 0 | — |
case-16 | fail→pass | 14,576 | 18,244 | +25% | 1 | 1 | 0% | 2,335 | 5,425 | +132% | 0 | 0 | — |
case-17 | fail→pass | 12,287 | 9,906 | -19% | 1 | 1 | 0% | 1,536 | 4,042 | +163% | 0 | 0 | — |
case-18 | fail→fail | 13,344 | 16,021 | +20% | 1 | 1 | 0% | 2,802 | 6,168 | +120% | 0 | 0 | — |
case-20 | fail→pass | 9,747 | 5,471 | -44% | 1 | 1 | 0% | 1,775 | 3,555 | +100% | 0 | 0 | — |
case-21 | pass→pass | 15,504 | 3,718 | -76% | 1 | 1 | 0% | 2,798 | 3,147 | +12% | 0 | 0 | — |
case-22 | fail→pass | 13,585 | 11,576 | -15% | 1 | 1 | 0% | 2,324 | 4,484 | +93% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +41 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.