ads-meta

Installation

$npx skills add coopersimson96/ai-content-system --skill ads-meta

Summary

This skill enables an agent to perform deep audits of Meta Ads accounts by evaluating 46 structured checks across Pixel/CAPI setup, creative performance and fatigue, account structure, and audience targeting. After invoking this skill, the agent can produce a weighted Meta Ads Health Score (0-100) with detailed pass/warning/fail findings, optimization roadmaps, and campaign build guides.

SKILL.MD

Meta Ads Deep Analysis

Process

  1. Collect Meta Ads data (Ads Manager export, Events Manager screenshot, EMQ scores)
  2. Read ads/references/meta-audit.md for full 46-check audit
  3. Read ads/references/benchmarks.md for Meta-specific benchmarks
  4. Read ads/references/scoring-system.md for weighted scoring
  5. Evaluate all applicable checks as PASS, WARNING, or FAIL
  6. Calculate Meta Ads Health Score (0-100)
  7. Generate findings report with action plan

What to Analyze

Pixel / CAPI Health (30% weight)

  • Meta Pixel installed and firing on all pages
  • Conversions API (CAPI) active (30-40% data loss without it post-iOS 14.5)
  • Event deduplication configured (event_id matching, ≥90% dedup rate)
  • Event Match Quality (EMQ) ≥8.0 for Purchase event
  • All standard events configured (ViewContent, AddToCart, Purchase, Lead)
  • Custom conversions created for non-standard events
  • Aggregated Event Measurement (AEM) configured for iOS
  • Domain verification completed
  • Server-side events include customer_information parameters
  • Pixel fires with correct currency and value parameters

Creative (30% weight)

  • ≥3 creative formats active (image, video, carousel, collection)
  • ≥5 creatives per ad set (Meta recommendation)
  • Creative fatigue detection: CTR drop >20% over 14 days = FAIL
  • Video creative: 15s max for Stories/Reels, 30s max for Feed
  • UGC/testimonial creative tested
  • Dynamic Creative Optimization (DCO) tested
  • Ad copy: headline under 40 chars, primary text under 125 chars
  • Creative refresh cadence: every 2-4 weeks for high-spend

Account Structure (20% weight)

  • Campaign Budget Optimization (CBO) vs Ad Set Budget (ABO) intentional
  • Campaign consolidation: ≤5 active campaigns per objective type
  • Learning phase health: <30% ad sets in "Learning Limited" (FAIL >50%)
  • Budget per ad set: ≥5x target CPA (minimum for learning phase exit)
  • Ad set audience overlap <30% (Audience Overlap tool)
  • Campaign naming conventions consistent and descriptive
  • Advantage+ Shopping Campaigns (ASC) active for e-commerce
  • Simplified campaign structure (fewer, larger ad sets preferred)

Audience & Targeting (20% weight)

  • Prospecting frequency (7-day): <3.0 (WARNING 3-5, FAIL >5)
  • Retargeting frequency (7-day): <8.0 (WARNING 8-12, FAIL >12)
  • Custom Audiences: website visitors, customer lists, engagement
  • Lookalike Audiences: multiple seed sizes tested (1%, 3%, 5%)
  • Advantage+ Audience tested vs manual targeting
  • Interest targeting: broad enough for algorithm optimization
  • Exclusions: purchasers excluded from prospecting, overlap managed
  • Location targeting reviewed for relevance

Advantage+ Assessment

If Advantage+ features are in use:

  • ASC (Shopping Campaigns): catalog connected, existing customer cap set
  • Advantage+ Audience: performance vs manual audience compared
  • Advantage+ Creative: enhancements enabled (text, brightness, music)
  • Advantage+ Placements: enabled (let Meta optimize placement mix)
  • Budget allocation: Advantage+ campaigns getting fair test budget

Special Ad Categories

If ads are in restricted categories:

  • Special Ad Category declared before campaign creation
  • Targeting restrictions verified (no ZIP, age 18-65+ only, no Lookalike)
  • Creative compliance with category-specific policies
  • Read ads/references/compliance.md for full requirements

EMQ Optimization Guide

EMQ ScoreStatusAction
8.0-10.0ExcellentMaintain current setup
6.0-7.9GoodAdd more customer_information parameters
4.0-5.9FairImplement CAPI, improve data quality
<4.0PoorCritical: CAPI + Enhanced Matching required

Key parameters to maximize EMQ:

  • em (email) — highest match rate signal
  • ph (phone) — second highest match signal
  • fn, ln (first/last name) — improves match accuracy
  • ct, st, zp (city, state, zip) — geographic matching
  • external_id — CRM/user ID for cross-device matching

Key Thresholds

MetricPassWarningFail
EMQ (Purchase)≥8.06.0-7.9<6.0
Dedup rate≥90%70-90%<70%
CTR≥1.0%0.5-1.0%<0.5%
Creative formats≥321
Creatives per ad set≥53-4<3
Learning Limited<30%30-50%>50%
Budget per ad set≥5x CPA2-5x CPA<2x CPA

Output

Meta Ads Health Score

Meta Ads Health Score: XX/100 (Grade: X)

Pixel / CAPI Health: XX/100  ████████░░  (30%)
Creative:            XX/100  ██████████  (30%)
Account Structure:   XX/100  ███████░░░  (20%)
Audience:            XX/100  █████░░░░░  (20%)

Deliverables

  • META-ADS-REPORT.md — Full 46-check findings with pass/warning/fail
  • EMQ improvement roadmap
  • Creative fatigue alerts (any creative with CTR declining >20%)
  • Quick Wins sorted by impact
  • Advantage+ adoption recommendations

PDF Export

When the user asks to export as PDF, use the shared converter at ads/references/md_to_pdf.py.

Usage: Copy it to the working directory, update INPUT/OUTPUT paths in __main__, run with python3.

CRITICAL fpdf2 rules (these prevent content from being cut off):

  1. NEVER use cell() + multi_cell() combos for list items. fpdf2 breaks page handling across this pattern. Instead, prepend the number/bullet to the text and use a SINGLE multi_cell() call:
    • Numbered: pdf.multi_cell(w, lh, f"{num}. {text}")
    • Bullet: pdf.multi_cell(w, lh, f" • {text}")
  2. ALWAYS call pdf.set_x(pdf.l_margin) before every multi_cell() call. After tables and other elements, the X cursor can be in an unpredictable position, causing "Not enough horizontal space" errors.
  3. NEVER use multi_cell(0, ...) (width=0). Always use an explicit width like pdf.cw (content width property). Width 0 calculates from current X which may be wrong.
  4. Always check_page() before rendering. Estimate line count with wrapped_line_count() and call check_page(lines * line_height) to force a page break before content starts, not in the middle of it.

Campaign Build Guide Structure

When generating campaign build guides, structure each campaign with clear stages that match the Ads Manager UI flow:

  • Stage 1: Campaign Settings — objective, name, budget, CBO, bidding
  • Stage 2: Ad Set Settings — audience, targeting, placements, optimization (each ad set as its own subsection with numbering restarting at 1)
  • Stage 3: Ad Settings — creative, copy, URLs, CTA

This prevents mixing campaign/ad set/ad level settings into one confusing numbered list.