meta-ads
Manage Meta Ads (Facebook + Instagram) — performance, ROAS, CPM, frequency, audience overlap, learning phase, creative fatigue, budgets, ad sets, campaigns, ads. Use for any mention of Meta Ads, Facebook Ads, Instagram Ads, ROAS, CPM, ad spend, or campaign settings on Meta.
Install
npx skills add https://github.com/nowork-studio/notfair-plugin/tree/main/meta-ads/manage
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install nowork-studio-notfair-plugin@llmmart
git clone https://github.com/nowork-studio/notfair-plugin.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole nowork-studio/notfair-plugin collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
Meta Ads — Operate, Diagnose, Optimize
This skill is the analytical brain layered on top of the NotFair Meta MCP server. The live MCP server supplies the current capability descriptions and schemas; choose tools from those instructions. This skill tells the agent what to think about — the benchmarks, scoring rubrics, and decision trees that turn raw Meta insights into informed action.
You are an expert paid-social practitioner. Trust your judgment on tool sequencing — the references below give you the frameworks, you decide how to apply them.
Setup
Read and follow ../shared/preamble.md — handles MCP detection, OAuth, and ad account selection. Once cached, this is instant.
Operating principles
- Confirm before writing. Show the current value, the proposed new value, and the expected impact (in dollars, ROAS, or CPA terms) when you can compute it. Blind "done." erodes trust.
- Use the evidence the question needs. Choose available read capabilities and correlate related data. Respect the live contract for changes and verify resulting state.
- Show numbers in dollars, percentages, and the right denominator. Use the account currency, CPM and CPC always cited with the attribution window (e.g. "ROAS 3.2× on 7DC1DV"). Use link clicks not all-clicks for CTR. Vague metrics are not findings.
- Recommend, then act. When you spot waste or opportunity, present the finding with evidence and wait for approval before mutating.
- Respect the Learning Phase. Do not recommend changes to ad sets in Learning unless the change is to exit Learning faster (e.g. consolidating to hit the 50-events-in-7-days threshold). Stacking edits during Learning destabilizes delivery.
- Frequency-first triage. Before recommending budget changes, check frequency and CPM trend. Cold prospecting at frequency > 3.0 with rising CPM is a creative problem — adding budget makes it worse.
- Attribution-window discipline. Always cite the ad set's attribution setting when reporting ROAS or CPA. "ROAS 3.2×" without the window is meaningless because the window changes the number by 20–40%.
- Scope the data. Pull only the campaigns, ad sets, ads, insights, and delivery context needed for the question. Batch related reads when useful and supported.
Reference framework — when to read what
Pick the lens that matches the user's question. Don't pre-load all of these; load on demand.
| The user wants to… | Read |
|---|---|
| Understand or rank performance, find waste, evaluate ad sets | references/analysis-heuristics.md (entry point — links onward) |
| Diagnose creative fatigue, decide when to refresh | references/creative-fatigue.md |
| Diagnose Learning Phase / Learning Limited issues | references/learning-phase.md |
| Audit audience overlap, lookalike strategy, broad vs. narrow | references/audience-strategy.md |
| Compare metrics to industry CPM / CTR / ROAS norms or apply seasonal lens | references/industry-benchmarks.md |
| Restructure campaigns (CBO vs ABO, ASC vs manual, prospecting vs retargeting) | references/campaign-structure-guide.md |
For business context (services, brand voice, personas, unit economics), read {data_dir}/meta/business-context.json and {data_dir}/meta/personas/{accountId}.json. If they're missing or stale (>90 days), suggest /meta-ads-audit.
For profitability framing (Break-Even ROAS, Headroom $, MER, LTV:CAC, budget forecasting), read ../shared/meta-math.md.
Capability boundaries
Let the connected server's current instructions, schemas, and results determine what can be read or changed. Do not assume a capability exists or is unavailable from an older tool catalog. If the requested operation is unavailable, explain the gap and offer a supported alternative.
Account baseline
Maintain {data_dir}/meta/account-baseline.json for anomaly detection across sessions. Update at the end of any session where you pulled rolling-window campaign metrics — the data is already in your context, no extra API call.
{
"metaAccountId": "<from config>",
"lastUpdated": "<ISO 8601>",
"campaigns": {
"<campaignId>": {
"name": "<campaign name>",
"objective": "<OUTCOME_SALES | OUTCOME_LEADS | OUTCOME_TRAFFIC | ...>",
"rolling30d": {
"avgDailySpend": 0,
"totalPurchases": 0,
"purchaseValue": 0,
"avgCpa": 0,
"avgRoas": 0,
"avgCpm": 0,
"avgLinkCtr": 0,
"avgFrequency": 0,
"totalSpend": 0
},
"recent7d": {
"spend": 0,
"purchases": 0,
"purchaseValue": 0,
"cpa": 0,
"roas": 0,
"cpm": 0,
"linkCtr": 0,
"frequency": 0
},
"snapshotDate": "<ISO 8601>",
"attributionWindow": "7d_click_1d_view"
}
}
}
Update formula: rolling30d = (0.7 × previous_rolling30d) + (0.3 × recent7d × (30/7)). The (30/7) factor projects 7-day numbers to a 30-day equivalent. New campaigns: initialize rolling30d from recent7d directly. Cap at 50 campaigns (spend > $0 in last 30 days only) so the file stays small.
When a metric in recent7d differs from rolling30d by more than 30%, that's an anomaly to surface. CPM and frequency rising together is the classic creative-fatigue signature.
Conditional handoffs
After analysis, proactively offer the right next skill or recommendation:
- No business context, or context >90 days old → run
/meta-ads-auditfirst (downstream output is generic without it) - Creative fatigue across multiple ad sets (CTR down ≥30% w/w with frequency > 3.0) → recommend creative refresh and check which creation or upload capabilities are currently available
- Cold prospecting saturation (LAL/broad audience at frequency > 3.5, CPM rising) → recommend rotating to a fresh lookalike seed or testing Advantage+ Shopping if not already deployed
- Learning Limited ad sets (status
Learning Limitedfor > 7 days) → consolidate ad sets to clear the 50-events-in-7-days bar, or shift the optimization event to a higher-volume upper-funnel event - Reported in-platform ROAS diverges materially from MER / Shopify ground truth → flag attribution drift; recommend a holdout test or MMM reconciliation before scaling
Files (notfair-plugin)
-
references
-
analysis-heuristics.md 6.2 KB
# Meta Ads Analysis Heuristics Entry point for any "how is my account doing", "find waste", "rank ad sets", or "why is X happening" question. These are the rules a paid-social analyst applies in their head — encoded so the agent doesn't drift into generic dashboard summaries. ## The Four-Pass Framework For any account-level analysis, run four passes in order. Skip a pass only if it's empirically irrelevant to the question. ### Pass 1 — Stop the bleeding Find spend that is structurally negative and recommend pausing or restructuring before doing anything else. | Signal | Threshold | Action | |---|---|---| | Ad set spent ≥ $50 in last 7 days, 0 purchases (Sales objective) | Hard | Pause; investigate optimization event firing first | | Ad set ROAS < 0.5 × Break-Even ROAS over rolling 14 days | Hard | Pause unless deliberate top-of-funnel push with downstream LTV justification | | Ad set frequency > 5.0 with link CTR declining | Saturation | Rotate creative or audience; do not raise budget | | Ad set in Learning Limited > 14 days, no improvement | Stuck | Consolidate or shift optimization event to higher-volume upstream event | | Campaign spending on broken Pixel (EMQ < 5.0) | Tracking | Stop until Pixel + CAPI is fixed; downstream optimization is unreliable | ### Pass 2 — Capture more (scale what's working) Identify ad sets and creative that are clearing Break-Even ROAS with headroom, and recommend scaling within the **20% rule** to avoid Learning Phase reset. | Signal | Action | |---|---| | Ad set ROAS ≥ 1.3 × Break-Even, frequency ≤ 2.0, audience saturation < 30% | Increase budget +20% / week, monitor CPA drift after each step | | Top creative concept by ROAS, declining frequency or steady CTR | Duplicate into a fresh ad set with broader audience to extend reach | | Country / placement split shows a clear winner the campaign isn't capturing | Suggest a placement-isolated ad set for testing (acknowledge it limits Meta's optimization) | | ASC (Advantage+ Shopping) outperforming manual prospecting on ROAS | Shift more budget to ASC; preserve a small manual cell as a control | **Always check audience saturation before recommending scale.** A small custom audience already at 60% reach has nowhere to go. ### Pass 3 — Fix fundamentals The structural issues that throttle the whole account, regardless of campaign-level performance. | Issue | Symptom | Fix | |---|---|---| | Pixel + CAPI not deduplicated | Events Manager EMQ < 7.0, ROAS swings wildly between Meta vs Shopify | Server-side CAPI integration with event_id deduplication | | Default attribution mismatched to sales cycle | High-consideration ecom on 1-day click | Move to 7DC1DV (the default) and re-baseline | | Single ad set carries the whole campaign | Top ad set = > 70% of campaign spend | Diversify — single-ad-set dependency is fragile to fatigue | | No retargeting layer | All spend on prospecting | Add a retargeting ad set on warm site visitors / engagers / cart abandoners | | All creative on one concept / format | One UGC video, no static or other concepts | Build 3+ concept lanes; Meta needs creative diversity to optimize | | Special Ad Category misclassified | Credit / employment / housing vertical running standard targeting | Reclassify in Ads Manager — risk of takedown otherwise | ### Pass 4 — Test next After the account is clean and scaled, what's the next experiment? Frame this as a prioritized backlog, not a deployment: - New audience (lookalike from a different seed, broad with creative-led targeting) - New creative concept (UGC vs studio, problem-solution vs aspirational, founder-led vs polished) - New attribution window experiment (does 1-day click match the data better than 7DC1DV?) - New objective (move from Traffic to Conversions, or test Lead → Conversion event) ## Encoded Heuristics — apply these, they aren't obvious - **Rank by spend × (Break-Even ROAS – Current ROAS), not by ROAS.** A 0.8× ROAS ad set spending $5,000/mo loses more than a 0.3× ROAS ad set spending $300/mo — the dollar gap is what matters. - **Link CTR is a creative diagnostic, not a goal.** A 2.5% link CTR with 1.2× ROAS is worse than 0.8% link CTR with 4.5× ROAS. CTR rewards clickbait; ROAS rewards customers. - **Frequency without a CPM trend is incomplete.** Frequency 4.0 with stable CPM and stable CTR is fine for warm retargeting. Frequency 4.0 with CPM up 30% week-over-week is fatigue. - **Hook rate (3-sec views / impressions) leads link CTR by ~5 days on video creative.** Watch hook rate drop first; the CTR drop confirms it later. - **CPM rising with no creative or audience change usually means competitive pressure or seasonality.** Cross-check with Q4 inflation, Black Friday, vertical-specific spikes (e.g. Valentine's for floral / jewelry, fitness in January). - **Reported ROAS overestimates true ROAS post-iOS 14.** Modeled conversions inflate the in-platform number. Ground-truth against Shopify / GA4 / internal MMM before any major scaling decision. - **A "Learning Limited" status persisting > 7 days means the ad set will never exit Learning at current volume.** It needs consolidation, a higher-volume optimization event, or more budget to clear 50 events / week. - **Three ad sets with > 50% audience overlap to one another are not three ad sets — they're one fragmented ad set.** Consolidate. - **Branded campaigns are rare on Meta** (unlike Search). If the user is running search-style "brand defense", that's usually wasted spend on Meta — Meta's discovery-led format means brand searchers are already converting elsewhere. ## How to structure the analysis output For any audit-style question: 1. **Headline finding (one sentence).** "Account is profitable at MER 4.1× but Meta-reported ROAS overstates by ~25% vs. Shopify." 2. **Top 3 actions (with dollar impact).** "Pause ad sets X, Y, Z — saves $1,420/mo. Refresh creative on ad set A — projected lift $800/mo." 3. **Evidence.** Specific campaign / ad set names, dollar amounts, percentage deltas, attribution windows. 4. **What you didn't check (and why).** Honest. "Skipped placement breakdowns because the question was about budget pacing." Avoid the dashboard-summary trap: long tables of numbers without verdicts. Every number should be paired with a "so what" — otherwise it's noise. -
audience-strategy.md 6.5 KB
# Audience Strategy — Targeting, Lookalikes, Overlap Meta's bidding LLM has gotten good enough that audience strategy has shifted meaningfully since 2022. This reference is the current best-practice playbook, not the 2018 narrow-stack-of-interests approach that's still all over older blog posts. ## The Default: Broad For Sales / Conversions / Leads objectives at $100+/day with a healthy Pixel + CAPI: - **Geo** — country level (US, or country grouping) - **Age** — 18–65+ - **Gender** — All - **Detailed targeting** — none - **Custom audiences** — none for prospecting Yes, really. This is Meta's published recommendation and it tends to outperform interest-stacked targeting for accounts above ~$3k/month. The reason: Meta's bidding LLM has access to hundreds of real-time signals (site behavior, in-platform behavior, device, time, content engaged with, look-back conversions). Pre-filtering with detailed targeting interests strips the LLM of signal density without adding precision the algorithm doesn't already have. **Exceptions where narrow targeting still wins:** | Situation | Why narrow targeting wins | |---|---| | New account, < $50/day, limited Pixel data | Broad with no signal density just spreads thinly. Lookalike from a small purchaser seed concentrates the signal. | | Very specialized B2B (e.g. dental practice managers) | Detailed targeting on job titles is faster than waiting for Meta to find them via broad | | Restricted vertical with policy concerns | Narrow targeting reduces the surface area for personal-attribute violations | | Heavy local-service business (e.g. plumber in one zip) | Geo radius IS the targeting; broad demographic adds nothing | | Small custom audience for retargeting | The audience definition is the targeting; no detailed layers | ## Lookalike Strategy When lookalikes still make sense: - **Seed quality matters more than seed size.** A 500-person seed of high-LTV customers outperforms a 50,000-person seed of all-time site visitors. Quality > quantity, every time. - **Best seeds (in priority order):** purchasers (last 180 days) → high-LTV purchasers (top 25% AOV) → email subscribers who opened recently → site engagers who hit a key page → all site visitors. - **Size:** 1–3% lookalike is the sweet spot for most accounts. 1% = highest similarity, smallest reach. 3–5% = broader, more reach, less similarity. Above 5%, the audience is essentially broad anyway. - **Stacked lookalikes** (e.g. LAL 1–3% + LAL 1–5% in the same ad set) used to be a tactic — now it's just audience overlap. Don't. When lookalikes don't make sense: - Account already on broad with healthy ROAS — adding lookalike layers fragments signal. - Account has < 100 conversions in the last 180 days — the seed is too small to compute a reliable lookalike. - Lookalike already shipped 3 weeks ago and is fatigued — re-seed from a different source rather than expanding the same lookalike. ## Custom Audiences for Retargeting Standard retargeting stack: | Audience | Lookback | Use | |---|---|---| | Purchasers (LTV) | 180 days | Exclude from prospecting. Include in repeat-buyer / cross-sell campaigns. | | Add-to-Cart, no Purchase | 30 days | Highest-intent retargeting cohort | | Initiate Checkout, no Purchase | 14 days | Even higher intent than ATC; smaller audience | | Site visitors, no purchase | 30–90 days | Mid-funnel retargeting | | Video viewers (75%+) | 30–60 days | Warmer than site visitors for video-led brands | | Engagers (page / IG profile) | 90–180 days | Coldest of the warm audiences; useful for awareness brands | **Always exclude purchasers from prospecting.** Otherwise you're paying Meta to remarket to people who already converted on their own. The exception is repeat-purchase verticals (consumables, supplements, subscriptions) where re-engaging recent purchasers is the strategy. ## Audience Overlap The Audience Overlap tool reports % overlap between any two audiences in the same account. Within a campaign, Meta's auction de-duplicates impressions (one user sees one ad, not two), but the LLM still has to allocate budget across overlapping ad sets — which fragments signal density and slows learning. ### Overlap thresholds | Overlap | Diagnosis | |---|---| | < 15% | Independent audiences; healthy | | 15–25% | Acceptable for deliberately layered tests | | 25–50% | Functional overlap; consider consolidating | | > 50% | Same audience in different wrapping; consolidate immediately | **Three ad sets with > 50% pairwise overlap is one ad set in disguise.** Consolidating typically: - Increases per-ad-set conversion volume → speeds Learning Phase exit - Reduces signal fragmentation → improves LLM optimization - Eliminates cannibalization in the campaign-level auction - Costs you the per-audience reporting granularity (this is the only real downside; usually worth it) ## Advantage+ Audience and Detailed Targeting Expansion Meta's "Advantage+ Audience" / "Detailed Targeting Expansion" toggles tell Meta it can ignore your manual targeting and expand to users it predicts will convert. With these on: - The audience definition becomes a *suggestion*, not a constraint. - Performance often improves (especially for Sales objective), but reports get harder to interpret because the served audience may not match the defined audience. - For accounts mature enough to consider this, just go broad — the toggle and broad targeting converge. The exception is **Special Ad Categories** — for Credit / Employment / Housing, Advantage+ targeting expansion is restricted by policy regardless of the toggle. ## Auditing the Audience Strategy When asked "audit my targeting", run this checklist: 1. **Are prospecting and retargeting cleanly separated?** Same campaign with both is rare and usually wrong (except Advantage+ Shopping which intentionally blends them). 2. **Does prospecting exclude purchasers?** Pull the ad set's exclusion list — missing purchaser exclusion is a 5-minute fix worth real money. 3. **Are there 3+ ad sets with > 50% overlap?** Use the Audience Overlap tool. Consolidate. 4. **Is the account stuck on detailed targeting from 2019?** Look for ad sets with 5+ interest layers. These almost always underperform a simple broad version. Recommend an A/B test (broad vs. existing narrow) before recommending wholesale removal. 5. **Lookalike seeds — are any older than 90 days?** Refresh the seed; old seeds drift from current customer profile. 6. **Is there a no-retargeting account that should have one?** Almost any account spending > $1k/month should have at least one retargeting ad set on cart abandoners or site visitors. -
campaign-structure-guide.md 7 KB
# Campaign Structure Guide — CBO, ABO, ASC, Funnel How to organize a Meta Ads account in 2025–2026. The shape of the account matters less than the underlying signal density — but a chaotic structure costs you both signal density and the ability to reason about what's working. ## The Default Modern Structure For most ecom and lead-gen accounts spending $1k–$50k/month: ``` Campaign — Prospecting (CBO) ├── Ad Set — Broad │ └── 4–6 ad creatives (mix of video, static, formats) ├── Ad Set — LAL 1–3% Purchasers │ └── 4–6 ad creatives └── Ad Set — Custom audience seed (optional, if specific cohort matters) └── 4–6 ad creatives Campaign — Retargeting (CBO or ABO) ├── Ad Set — Cart abandoners (last 14 days) │ └── 3–5 retargeting-specific creatives ├── Ad Set — Site visitors no purchase (last 30 days) │ └── 3–5 creatives └── Ad Set — Engagers (FB + IG, last 90 days) └── 3–5 creatives Campaign — Advantage+ Shopping (separate, runs parallel for ecom) └── Single ad set (ASC manages internally) └── 8–15 creatives in one pool ``` Three campaigns. Most accounts have between two and five — anything more is usually structural debt, not strategy. ## CBO vs. ABO Decision **Campaign Budget Optimization (CBO / Advantage Campaign Budget)** — budget is set at the campaign level. Meta distributes across ad sets in real time, optimizing for total events. **Ad Set Budget Optimization (ABO)** — budget is set per ad set. The manager controls distribution. | Use CBO when | Use ABO when | |---|---| | Prospecting at scale ($500+/day) | Running clean A/B audience tests | | Multiple ad sets with similar objectives | Retargeting ad sets where you want guaranteed daily spend on each pool | | You want Meta's bidding LLM to allocate dynamically | You're testing a brand-new audience that needs guaranteed spend to clear Learning | | You don't care which ad set wins, only that the campaign wins | Each ad set has different unit economics and you need the per-ad-set ceiling | The defaults Meta nudges you toward (CBO + Advantage+ Audience + Advantage+ Placements) win the median account. ABO + manual everything wins for a specific subset of cases — usually accounts where the user has strong signal that they'd lose money on a specific cohort if Meta's allocator chose it. **Don't mix CBO and ABO in the same account without a reason.** Pick a default; treat exceptions as exceptions. ## When to Use Advantage+ Shopping (ASC) ASC consolidates prospecting and retargeting into one campaign with broad targeting and an Existing-Customer Cap (default 15%). Meta treats it as a unit and optimizes across the whole funnel. | ASC wins when | ASC loses when | |---|---| | Ecom with reliable Pixel + CAPI and Catalog | B2B / lead-gen (ASC is built for ecom) | | Account spends > $5k/month | Account < $1k/month (not enough signal) | | Brand has 8+ creative concepts ready to upload | Limited creative inventory | | Existing campaigns are mostly broad anyway | Heavy reliance on narrow custom audiences | For ecom accounts at scale, the standard recommendation is to run **ASC + a small manual control cell** (one prospecting campaign and one retargeting campaign). If ASC outperforms over a 30-day window, shift more budget to ASC and decommission manual prospecting. Keep retargeting separate if the brand has strong cart-abandoner / engager logic — ASC's existing-customer treatment is opaque. ## Anti-Patterns ### Too many campaigns Five prospecting campaigns split by audience type, each with one ad set, is fragmentation, not segmentation. Each campaign has to clear its own learning bar; signal density is split; the bidding LLM can't see the full picture. Consolidate. **Heuristic:** if a campaign has only one or two ad sets and < 20 events / week per ad set, it's probably part of a fragmentation problem. Look for opportunities to merge. ### Campaigns split by creative "Video Campaign" and "Static Campaign" running on the same audience and objective is a structural mistake — Meta wants creative diversity within ad sets, not isolated by campaign. Consolidate creatives into one ad set per audience. ### Campaigns split by placement "Reels Campaign" and "Feed Campaign" running on the same audience is similarly wrong. Use Advantage+ Placements (the default) and let Meta choose. Manual placement isolation is worth the cost only when you have a specific, evidence-based reason to exclude a placement. ### One ad set carrying the whole campaign When one ad set is > 70% of campaign spend, the campaign is fragile. The ad set is probably an outlier the LLM has converged on; when it fatigues, the campaign collapses. Diversify by adding 1–2 sibling ad sets even at lower projected ROAS, to give the LLM a fallback. This is risk management, not optimization. ### Special Ad Category misconfigured For Credit / Employment / Housing / Social Issues / Politics, the campaign must be marked as a Special Ad Category at creation. Running standard targeting on a covered vertical is policy violation — disapproval and account-level review risk. Always check vertical at audit time. ### Branded campaigns (rare on Meta) On Search, brand campaigns are mandatory — competitors bid on your name. On Meta, brand-search behavior doesn't apply. Running a Meta campaign for "people searching for [Brand]" misunderstands the platform — Meta is discovery, not search. Don't. ## Naming Conventions Consistency matters more than the exact convention. A workable default: ``` [Funnel Stage] - [Audience] - [Geo] - [Objective] - [vMonthYear] Examples: PROS - Broad - US - Sales - v0526 PROS - LAL 3% Purchasers - US - Sales - v0526 RT - Cart Abandon 14d - US - Sales - v0526 ASC - Sales - US - v0526 ``` The version field at the end (`v0526` for May 2026) lets you tell at a glance how old the structure is and helps with QBR-style account history reviews. Avoid generic names like "Test 1" or "New Campaign" — they become permanent debt. ## Restructuring Checklist When asked to "fix the campaign structure", run this checklist before recommending: 1. **Inventory** — list all active campaigns, ad sets, and ads with last-30-day spend and conversions. Order by spend desc. 2. **Identify the workhorses** — campaigns / ad sets accounting for > 80% of conversions. These are usually working; touch with caution. 3. **Identify the fragmentation** — campaigns spending < 5% of budget with < 20 events / week. These are candidates for consolidation or pause. 4. **Identify the anti-patterns** — overlap > 50% between ad sets, campaigns split by creative or placement, single-ad-set dependency. 5. **Propose the new shape** — show the user the *target* structure (campaigns / ad sets / ads), not just the deletions. Restructuring is migration, not pruning. 6. **Sequence the migration** — never restructure everything in one push. Migrate one campaign per week, monitor performance, accept the Learning Phase relearn cost as part of the budget. -
creative-fatigue.md 6.6 KB
# Creative Fatigue — Diagnosis and Refresh Cadence Meta is creative-led. The single highest-leverage variable in account performance is creative — not bidding, not audience, not budget. This reference is the diagnostic kit for "is this creative dying, and what do I do about it". ## The Fatigue Stack — Signals in Priority Order Read these in order. The earliest signal usually leads the others by 3–5 days. ### Signal 1 — Hook Rate (video only) ``` Hook Rate = 3-Sec Video Views / Impressions × 100 ``` | Hook Rate | Diagnosis | |---|---| | > 30% | Strong; the thumbnail / first frame is doing its job | | 20–30% | Acceptable for most verticals | | 10–20% | Weak hook; refresh first frame or thumbnail | | < 10% | Broken hook; viewer scrolls past before the message lands | **Trend matters more than absolute number.** A hook rate dropping from 28% to 18% in a week is a clearer signal than a flat 18%. Watch the trend over a rolling 7-day window. ### Signal 2 — Link CTR ``` Link CTR = Inline Link Clicks / Impressions × 100 ``` Use **inline_link_clicks**, not all-clicks. Vertical and creative format affect the absolute number — see `industry-benchmarks.md` — but the trend over time is universal. | Trend | Diagnosis | |---|---| | Link CTR steady week-over-week | Creative is healthy at this frequency | | Link CTR down 15–30% w/w | Early fatigue; plan a refresh in the next 5–10 days | | Link CTR down ≥ 30% w/w | Active fatigue; ship new creative now | | Link CTR up week-over-week with stable spend | Creative is gaining traction; do not change anything | ### Signal 3 — CPM Rise ``` CPM = (Spend / Impressions) × 1000 ``` CPM rises when (a) the audience is saturating and Meta has to bid higher to reach the next user, (b) competitors are bidding more aggressively (seasonality), or (c) Meta's relevance score for the ad has dropped (creative fatigue). | Trend | Diagnosis | |---|---| | CPM steady or rising < 10% w/w | Healthy | | CPM rising 10–30% w/w with stable CTR | Likely competitive pressure or seasonality, not creative | | CPM rising ≥ 30% w/w with declining CTR | Creative-driven fatigue; relevance is dropping | | CPM rising ≥ 30% w/w with frequency > 3.0 | Audience saturation; rotate audience or refresh creative | ### Signal 4 — Frequency ``` Frequency = Impressions / Reach (over a rolling 7-day window) ``` Frequency alone doesn't diagnose anything — it's a denominator for the other signals. But these guardrails apply: | Audience Type | Frequency Cap (weekly) | |---|---| | Cold prospecting (broad / lookalike) | ≤ 2.0 | | Warm retargeting (site visitors / engagers) | 2.0–3.5 | | Hot retargeting (cart abandoners, post-purchase) | 3.0–5.0 (urgency justifies high frequency) | Frequency above the cap with declining CTR/CPM is fatigue. Frequency above the cap with stable or rising CTR is rare but not actionable — leave it alone. ## The Refresh Decision Tree When fatigue signals fire, work down this tree: 1. **Is this a single-ad problem or a campaign-wide problem?** - Single ad fatiguing while siblings hold up → pause the fatigued ad, leave the rest. Plan a replacement creative. - All ads in the ad set fatiguing simultaneously → audience saturation, not creative fatigue. Move to step 3. - All ad sets in the campaign fatiguing → likely a seasonality / competitive pressure issue or a measurement break (Pixel issue). Cross-check. 2. **Single-ad refresh: what kind of new creative?** - Same concept, new variation (re-cut, new opening, different testimonial)? Cheap, safe; ~50% chance of matching the fatigued ad's peak. - New concept entirely (different angle, different emotion, different format)? More expensive but the only way to reset the fatigue clock cleanly. - Avoid refreshing only the headline / primary text on a fatigued visual. Meta's bidding LLM weights the visual heavily — copy tweaks alone rarely reset fatigue. 3. **Audience saturation: rotate or expand?** - If the audience is a custom audience or narrow lookalike, expand to LAL 1–3% or LAL 1–5%, or seed a new lookalike from a different source (purchasers vs subscribers vs site engagers). - If the audience is already broad, the fatigue is probably creative — go back to step 2. - If the audience is a retargeting pool, expand the lookback window (30 → 90 days) before rebuilding. 4. **Campaign-wide fatigue: when to stop refreshing.** - If you've shipped 3+ creative refreshes in 6 weeks and nothing is performing close to historical highs, the problem is probably not creative — it's market saturation or a structural issue (offer, landing page, attribution). Run a short-pause test (1–2 weeks of pause), then return with fresh creative + a fresh audience seed. ## Refresh Cadence — Spend-Velocity-Aware The right refresh cadence depends on how fast the audience is being burned through, not on calendar age. | Daily Spend per Ad Set | Typical Hero-Creative Lifespan | |---|---| | < $50 | 4–8 weeks | | $50–$200 | 2–4 weeks | | $200–$1,000 | 7–14 days | | > $1,000 | 5–10 days | Use frequency trend as the actual trigger, not these numbers — they're priors. A $1,000/day ad set that holds a 2.0 frequency cap because the audience is genuinely huge can run the same creative for 4 weeks. A $50/day ad set on a 500k-person custom audience burns through in two weeks. ## Concept Diversity — How Many Creatives at Once Per active ad set, target 4–6 distinct creative concepts running concurrently. - **Distinct concept**, not distinct variant. UGC of three different customers is one concept. Founder explainer + UGC testimonial + product demo + lifestyle is four concepts. - Same concept across 1:1, 4:5, and 9:16 aspect ratios counts as one — Meta treats the concept as one for relevance scoring; the ratios just unlock more placements. - Below 3 concepts per ad set, Meta's bidding LLM has nothing to optimize across — performance volatility increases. Above 8, you're spreading spend too thinly for any one to clear the 50-events-in-7-days Learning bar. ## What "creative fatigue" doesn't fix - **Bad offer** — no creative refresh saves an unwanted product or an uncompetitive price. - **Broken landing page** — high CTR with a slow / mismatched LP burns budget twice. - **Wrong audience** — perfect creative shown to the wrong cohort fatigues fast because it never resonated in the first place. - **Pixel / CAPI breakage** — fresh creative on broken tracking is invisible to Meta's optimization; the algorithm can't learn what works. When the user says "performance is dropping", check these structural issues *before* recommending a creative refresh. The cheapest fix is the structural one. -
industry-benchmarks.md 5.9 KB
# Meta Ads Industry Benchmarks Reference benchmarks for "is X good or bad" questions. **Always anchor to the user's vertical and unit economics first** — a "good" CPA in legal services is a disaster in ecom, and vice versa. These numbers are 2024–2025 vintage from third-party reports (Varos, Madgicx, Common Thread, Northbeam) plus our own observation of NotFair accounts. Adjust upward 10–15% for 2026 (CPMs continue to inflate). The most recent verification date is in `../../shared/policy-registry.json`. ## Vertical Benchmarks (Sales / Conversions Objective) | Vertical | CPM | Link CTR | CPA | ROAS (target) | |---|---|---|---|---| | Ecommerce — apparel / accessories | $9–14 | 1.0–1.6% | $25–45 | ≥ 2.5× | | Ecommerce — beauty / skincare | $10–15 | 1.1–1.7% | $20–40 | ≥ 3.0× | | Ecommerce — home / furniture | $11–16 | 0.9–1.4% | $40–80 | ≥ 2.5× | | Ecommerce — health / supplements | $12–18 | 1.0–1.5% | $30–55 | ≥ 3.0× | | DTC subscription (food, consumables) | $11–16 | 0.9–1.4% | $35–65 | ≥ 2.0× (LTV-led) | | Lead-gen B2C — local service | $7–11 | 1.2–2.0% | $12–28 (per lead) | n/a; CPL-led | | Lead-gen B2C — finance / insurance | $11–17 | 0.8–1.3% | $30–80 (per lead) | n/a; CPL-led | | B2B SaaS | $14–22 | 0.6–1.0% | $80–180 (per MQL) | n/a; CPL/MQL-led | | Mobile app install (gaming) | $6–10 | 1.5–2.5% | $1.50–6 (per install) | n/a; ROAS D7-led | | Mobile app install (utility / fintech) | $10–16 | 1.0–1.6% | $4–12 (per install) | n/a; ROAS D30-led | **These are ranges, not averages.** Within a vertical, well-managed accounts will sit at the better end of the range; poorly-managed accounts will be 50–100% worse. Compare an account to the lower end (good) to see how much improvement is realistic. ## Adjustments ### Q4 inflation | Period | CPM Multiplier vs. September | |---|---| | October | 1.20–1.40× | | Black Friday / Cyber Week | 1.60–2.00× | | Mid-December | 1.30–1.50× | | Dec 26 → Dec 31 | 0.85–1.05× | | January (post-holiday) | 0.70–0.85× | Use these to normalize "is performance dropping" questions. A 30% CPM rise from October to November is below trend; a 30% drop from November to mid-December is normal. ### Geographic adjustments (vs. US) | Country / Region | CPM Multiplier | |---|---| | US | 1.0× (baseline) | | UK / AU / CA / NZ | 0.85–1.05× | | Western Europe (DE, FR, IT, ES) | 0.65–0.85× | | Nordic | 0.95–1.15× | | LATAM | 0.20–0.40× | | SEA (high-income — SG, HK) | 0.80–1.00× | | SEA (mid-income — TH, MY, VN, PH, ID) | 0.10–0.25× | | India | 0.10–0.20× | Lower-CPM markets often have lower CVR and AOV that offset the cheaper impressions. Always cross-check ROAS against CPM, not CPM alone. ### Mobile vs. Desktop (Meta is mobile-dominant) For most accounts > 90% of impressions are mobile. Desktop is occasionally relevant for B2B SaaS (decision-makers researching from work) but should not be the default plan. Use an available performance read with publisher-platform and placement breakdowns when supported. ### Placement performance ranking (typical, 2025) | Placement | CPM | Link CTR | Notes | |---|---|---|---| | Facebook Feed | Mid | Mid–High | Workhorse placement | | Instagram Feed | Mid–High | Mid | Strong for visual brands | | Facebook Reels | Mid–Low | Low–Mid | Cheap impressions; lower intent | | Instagram Reels | Mid | Low–Mid | Cheap impressions; broad reach | | Stories (FB + IG) | Mid | Low | Brand impressions; rarely direct response | | Marketplace | Low | Mid | Surprisingly strong for ecom in some verticals | | Messenger | Low | Low | Often the weakest; consider excluding | | Audience Network | Very Low | Very Low | Often spam-tier; consider excluding for direct response | **Default recommendation:** start with Advantage+ Placements (let Meta choose). Move to manual placement selection only if a clear loser placement emerges in the breakdown report — and only after the ad set has 50+ events per placement to make a meaningful read. ## ROAS Reading Guide ROAS by itself is incomplete. Always cite: 1. **The number** — e.g. 3.2× 2. **The attribution window** — e.g. 7-day click + 1-day view (7DC1DV) 3. **The source** — Meta-reported, Shopify-attributed, GA4-attributed, MMM-modeled 4. **The denominator window** — last 7 days, last 30 days, lifetime `Meta-reported 7DC1DV ROAS 3.2× over last 30 days` is meaningful. `ROAS 3.2×` is not. In post-iOS 14 reality, **Meta-reported ROAS typically exceeds Shopify ROAS by 20–40%** because of modeled conversions. Always footnote this when handing the user a number to make a scaling decision. ## Hook Rate (video creative) Vertical-agnostic benchmarks for `3-Sec Video Views / Impressions`: | Hook Rate | Quality | |---|---| | > 35% | Excellent — top-decile creative | | 25–35% | Strong | | 18–25% | Average | | 10–18% | Weak — refresh the first 3 seconds | | < 10% | Broken — viewers skip before any message lands | Hook rate cuts across all verticals because it measures one thing: did the visual / first frame stop the scroll? If it didn't, nothing else matters. ## Benchmark Disclaimers 1. **Aged numbers.** Verify against current data (Varos / Madgicx public dashboards) for verticals where the user pushes back. CPMs inflate ~10–15% YoY. 2. **Within-vertical variance is huge.** Compare to similar-size accounts (within 0.5–2× spend) for a meaningful read. A $5k/month and a $500k/month brand in the same vertical will have very different benchmarks. 3. **AOV and unit economics override industry benchmarks.** A "high" CPA in absolute terms can be wildly profitable if AOV is high and margin is fat. Always compute Break-Even ROAS first (see `../../shared/meta-math.md`). 4. **Reported numbers ≠ ground truth.** Meta-reported ROAS systematically overstates actual ROAS in ecom. Treat these as Meta-reported benchmarks; reconcile against the user's e-commerce platform before acting on them. -
learning-phase.md 5.9 KB
# Learning Phase and Learning Limited — Operational Reference The Learning Phase is Meta's published heuristic for the period during which an ad set's delivery system is calibrating. Performance during Learning is not representative of steady-state performance — making decisions on Learning-phase data is the most common cause of bad calls. ## The 50-in-7 Rule An ad set exits Learning after approximately **50 optimization events within 7 rolling days**. The optimization event is whatever the ad set is optimizing for — Purchase, Lead, Add to Cart, Complete Registration, etc. | Status | Meaning | Implication | |---|---|---| | Learning | Ad set is calibrating; expected to exit on its own | Wait. Do not stack edits. | | Active (after Learning) | Steady state | Decisions on this data are reliable. | | Learning Limited | Ad set is in Learning but won't exit at current pace | Structural problem — see Diagnosis below. | | Learning (after edit) | Re-entered Learning because of a significant edit | Wait again. Edits compound the learning cost. | **The "approximately" matters.** Meta's actual threshold is opaque and varies by objective and account history. Treat 50/7 as the planning anchor; use the in-platform status as the source of truth. ## Significant Edits That Reset Learning Editing any of these triggers a relearn: - Optimization event change (e.g. Purchase → Add to Cart, or Conversion → Reach) - Audience targeting change (custom audiences, lookalikes, detailed targeting, geo, age, gender) - Attribution window change - Bid strategy change (Highest Volume → Cost Cap → Bid Cap, etc.) - Bid amount change (when on a bid-capped strategy) - Schedule change (start time, end time, day-parting) - Budget change of more than ~20% - Adding or removing creative from the ad set - Pausing for > 7 days then re-enabling **One edit per ad set per week.** Stacking three edits in one day creates noise that takes 14+ days to settle. **Significant ≠ visible.** A creative swap looks small; it's a full relearn. A budget change from $100 to $130 looks meaningful; it's only +30%, just over the threshold. Always model the edit size before deploying. ## Diagnosing Learning Limited `Learning Limited` is the status when the ad set has been in Learning for 7+ days and the system projects it cannot reach 50 events in 7 days at current pace. The fix is structural, not patient. ### Diagnostic checklist 1. **What is the ad set's current 7-day event volume?** If it's at 25 events / 7 days, it's halfway there — a budget bump may push it over. If it's at 5 events / 7 days, no realistic budget bump will clear the bar. 2. **Is the optimization event firing reliably?** Read conversion-event performance and confirm the event count matches what the user sees in Events Manager. A misconfigured Pixel makes the event invisible to Meta even when the actual event happened. 3. **Is the audience large enough?** Audiences below ~1M people often can't hit 50/7 at any reasonable budget — there are not enough qualified users in the pool. The fix is consolidating audiences, not patience. 4. **Is the budget enough for the CPA?** If projected CPA is $40 and the budget is $20/day, the ad set physically cannot hit 50 events in 7 days ($20 × 7 / $40 = 3.5 events). A budget bump or a CPA reduction (creative, audience, offer) is the only fix. ### Fix paths | Diagnosis | Fix | Tradeoff | |---|---|---| | Audience too small | Consolidate ad sets with similar audiences into one larger ad set | Loses audience-level isolation; signal density gained > granularity lost | | Optimization event too narrow | Move from Purchase to Add to Cart (upper-funnel event with higher volume) | Less precise optimization; pair with downstream LTV check | | Budget too low for the CPA | Increase budget by 20–50% | Costs more; only works if unit economics support it | | Too many ad sets in the campaign cannibalizing | Consolidate ad sets with > 25% audience overlap | Loses some testing granularity | | Multiple campaigns with the same audiences | Consolidate at the campaign level | Loses some objective-level separation | ### When Learning Limited is acceptable - The ad set is a **deliberate small-audience retargeting** ad set (cart abandoners last 3 days) — Meta will still serve, just on a less efficient delivery curve. Document it; don't try to fix. - The ad set is **brand-new with planned ramp** — the first week is always Learning. Do not call Learning Limited in the first 7 days. - The ad set has hit 50 events in a 7-day window historically and just dropped below — give it 5–7 days before structural changes. ## When NOT to Optimize During Learning Hold every optimization decision until the ad set exits Learning, except: - **Pausing structurally broken delivery.** If the ad set is at 0 events on day 4 with significant spend, the Pixel is probably broken. Pause and fix the Pixel; don't wait for Learning to "complete" against a broken signal. - **Halting policy violations.** Ads disapproved or flagged for policy review take priority over Learning patience. - **Recovering from a misconfigured optimization event.** If you discover the ad set is optimizing for the wrong event (e.g. Page View instead of Purchase), fix it immediately and accept the relearn. ## Talking About Learning Phase to Users Most users don't know the 50/7 rule, and many will push to "fix" an ad set still in Learning. The right framing: > "This ad set is still in Learning — Meta hasn't seen enough conversions yet to optimize delivery. Performance during this window isn't representative. We have two options: wait 3–5 more days for Learning to complete, or take a structural action that will reset Learning anyway. I recommend waiting unless we see something actively broken." If the user insists on changes during Learning, document the relearn cost in the recommendation: "This change will reset Learning. Expect 5–7 days of unstable delivery before metrics are meaningful again."
-
-
SKILL.md 6.9 KB
--- name: meta-ads description: Manage Meta Ads (Facebook + Instagram) — performance, ROAS, CPM, frequency, audience overlap, learning phase, creative fatigue, budgets, ad sets, campaigns, ads. Use for any mention of Meta Ads, Facebook Ads, Instagram Ads, ROAS, CPM, ad spend, or campaign settings on Meta. argument-hint: "<campaign / ad set name, or 'show performance'>" triggers: - meta ads - facebook ads - instagram ads - meta campaigns - ad sets - ROAS - CPM - link CTR - frequency - creative fatigue - audience overlap - learning phase - learning limited - CBO - ABO - advantage shopping - advantage plus - lookalike - retargeting - prospecting - pause campaign - update budget --- # Meta Ads — Operate, Diagnose, Optimize This skill is the analytical brain layered on top of the NotFair Meta MCP server. The live MCP server supplies the current capability descriptions and schemas; choose tools from those instructions. This skill tells the agent _what to think about_ — the benchmarks, scoring rubrics, and decision trees that turn raw Meta insights into informed action. You are an expert paid-social practitioner. Trust your judgment on tool sequencing — the references below give you the frameworks, you decide how to apply them. ## Setup Read and follow `../shared/preamble.md` — handles MCP detection, OAuth, and ad account selection. Once cached, this is instant. ## Operating principles 1. **Confirm before writing.** Show the current value, the proposed new value, and the expected impact (in dollars, ROAS, or CPA terms) when you can compute it. Blind "done." erodes trust. 2. **Use the evidence the question needs.** Choose available read capabilities and correlate related data. Respect the live contract for changes and verify resulting state. 3. **Show numbers in dollars, percentages, and the right denominator.** Use the account currency, CPM and CPC always cited with the attribution window (e.g. "ROAS 3.2× on 7DC1DV"). Use **link** clicks not all-clicks for CTR. Vague metrics are not findings. 4. **Recommend, then act.** When you spot waste or opportunity, present the finding with evidence and wait for approval before mutating. 5. **Respect the Learning Phase.** Do not recommend changes to ad sets in Learning unless the change is to exit Learning faster (e.g. consolidating to hit the 50-events-in-7-days threshold). Stacking edits during Learning destabilizes delivery. 6. **Frequency-first triage.** Before recommending budget changes, check frequency and CPM trend. Cold prospecting at frequency > 3.0 with rising CPM is a creative problem — adding budget makes it worse. 7. **Attribution-window discipline.** Always cite the ad set's attribution setting when reporting ROAS or CPA. "ROAS 3.2×" without the window is meaningless because the window changes the number by 20–40%. 8. **Scope the data.** Pull only the campaigns, ad sets, ads, insights, and delivery context needed for the question. Batch related reads when useful and supported. ## Reference framework — when to read what Pick the lens that matches the user's question. Don't pre-load all of these; load on demand. | The user wants to… | Read | |---|---| | Understand or rank performance, find waste, evaluate ad sets | `references/analysis-heuristics.md` (entry point — links onward) | | Diagnose creative fatigue, decide when to refresh | `references/creative-fatigue.md` | | Diagnose Learning Phase / Learning Limited issues | `references/learning-phase.md` | | Audit audience overlap, lookalike strategy, broad vs. narrow | `references/audience-strategy.md` | | Compare metrics to industry CPM / CTR / ROAS norms or apply seasonal lens | `references/industry-benchmarks.md` | | Restructure campaigns (CBO vs ABO, ASC vs manual, prospecting vs retargeting) | `references/campaign-structure-guide.md` | For business context (services, brand voice, personas, unit economics), read `{data_dir}/meta/business-context.json` and `{data_dir}/meta/personas/{accountId}.json`. If they're missing or stale (>90 days), suggest `/meta-ads-audit`. For profitability framing (Break-Even ROAS, Headroom $, MER, LTV:CAC, budget forecasting), read `../shared/meta-math.md`. ## Capability boundaries Let the connected server's current instructions, schemas, and results determine what can be read or changed. Do not assume a capability exists or is unavailable from an older tool catalog. If the requested operation is unavailable, explain the gap and offer a supported alternative. ## Account baseline Maintain `{data_dir}/meta/account-baseline.json` for anomaly detection across sessions. Update at the **end** of any session where you pulled rolling-window campaign metrics — the data is already in your context, no extra API call. ```json { "metaAccountId": "<from config>", "lastUpdated": "<ISO 8601>", "campaigns": { "<campaignId>": { "name": "<campaign name>", "objective": "<OUTCOME_SALES | OUTCOME_LEADS | OUTCOME_TRAFFIC | ...>", "rolling30d": { "avgDailySpend": 0, "totalPurchases": 0, "purchaseValue": 0, "avgCpa": 0, "avgRoas": 0, "avgCpm": 0, "avgLinkCtr": 0, "avgFrequency": 0, "totalSpend": 0 }, "recent7d": { "spend": 0, "purchases": 0, "purchaseValue": 0, "cpa": 0, "roas": 0, "cpm": 0, "linkCtr": 0, "frequency": 0 }, "snapshotDate": "<ISO 8601>", "attributionWindow": "7d_click_1d_view" } } } ``` Update formula: `rolling30d = (0.7 × previous_rolling30d) + (0.3 × recent7d × (30/7))`. The `(30/7)` factor projects 7-day numbers to a 30-day equivalent. New campaigns: initialize `rolling30d` from `recent7d` directly. Cap at 50 campaigns (spend > $0 in last 30 days only) so the file stays small. When a metric in `recent7d` differs from `rolling30d` by more than 30%, that's an anomaly to surface. CPM and frequency rising together is the classic creative-fatigue signature. ## Conditional handoffs After analysis, proactively offer the right next skill or recommendation: - **No business context, or context >90 days old** → run `/meta-ads-audit` first (downstream output is generic without it) - **Creative fatigue across multiple ad sets** (CTR down ≥30% w/w with frequency > 3.0) → recommend creative refresh and check which creation or upload capabilities are currently available - **Cold prospecting saturation** (LAL/broad audience at frequency > 3.5, CPM rising) → recommend rotating to a fresh lookalike seed or testing Advantage+ Shopping if not already deployed - **Learning Limited ad sets** (status `Learning Limited` for > 7 days) → consolidate ad sets to clear the 50-events-in-7-days bar, or shift the optimization event to a higher-volume upper-funnel event - **Reported in-platform ROAS diverges materially from MER / Shopify ground truth** → flag attribution drift; recommend a holdout test or MMM reconciliation before scaling
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.