metaads — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited metaads (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
CRITICAL: Route to the correct workflow based on user intent.
When user needs to set up or configure Meta Ads API access: Examples: "set up meta ads", "connect meta ads", "configure facebook ads", "my token expired", "meta ads setup", credential errors from --check -> READ: ~/.claude/skills/MetaAds/workflows/Setup.md -> EXECUTE: Walk user through complete setup (Business Manager, App, token, .env)
When user wants to publish, create, or launch a campaign: Examples: "publish ads", "create campaign", "launch campaign", "upload ad images", "publish meta ads", "push this campaign to Meta", "create ad set" -> READ: ~/.claude/skills/MetaAds/workflows/PublishCampaign.md -> EXECUTE: Campaign publishing workflow -> If credentials fail, route to Setup.md first
When user wants to check performance, metrics, or analyze results: Examples: "check meta ad performance", "ROAS", "which ad is winning", "ad spend", "campaign metrics", "how are my ads doing", "audience breakdown", "creative performance" -> READ: ~/.claude/skills/MetaAds/workflows/AnalyzePerformance.md -> EXECUTE: Performance analysis workflow -> If credentials fail, route to Setup.md first
When user wants to manage campaigns (pause/resume/status): Examples: "pause campaign", "resume campaign", "campaign status", "list campaigns" -> Use uv run ~/.claude/skills/MetaAds/tools/Publish.py directly with --pause, --resume, --status, or --list
Guided Setup:
Campaign Publishing:
Performance Analytics:
Campaign Management:
| Script | Purpose |
|---|---|
tools/Publish.py | Campaign creation, image upload, pause/resume |
tools/Analytics.py | Performance metrics, breakdowns, sync, export |
Both scripts use PEP 723 inline dependencies — just run with uv run directly from the skill directory. No install or copy step needed.
Run scripts directly from the skill directory. They load .env from the current working directory (Path.cwd()), so run them from your project root:
# From your project root (where .env lives):
uv run ~/.claude/skills/MetaAds/tools/Publish.py --check
uv run ~/.claude/skills/MetaAds/tools/Analytics.py --summaryPrerequisites: uv must be installed. If not: curl -LsSf https://astral.sh/uv/install.sh | sh
Environment Variables (`.env`):
| Variable | Required | Description |
|---|---|---|
META_ADS_ACCESS_TOKEN | Yes | System User or long-lived User token |
META_ADS_ACCOUNT_ID | Yes | Ad account ID with act_ prefix |
FACEBOOK_APP_ID | For refresh | App ID for token exchange |
FACEBOOK_APP_SECRET | For refresh | App Secret for token exchange |
Use these objectives in campaign configs:
| Objective | When to Use | Optimization Goal |
|---|---|---|
OUTCOME_SALES | DTC purchases, Shopify conversions | OFFSITE_CONVERSIONS |
OUTCOME_LEADS | Lead gen, email signups, quiz funnels | LEAD_GENERATION |
OUTCOME_TRAFFIC | Landing page visits, blog traffic | LINK_CLICKS |
OUTCOME_AWARENESS | Brand awareness, video views | REACH or IMPRESSIONS |
OUTCOME_ENGAGEMENT | Post engagement, page likes | POST_ENGAGEMENT |
Generic template for any DTC brand:
{
"campaign": {
"name": "campaign-name-month-year",
"objective": "OUTCOME_SALES"
},
"adsets": [
{
"name": "Broad-25-54-US",
"daily_budget": 5000,
"targeting": {
"age_min": 25,
"age_max": 54,
"genders": [0],
"geo_locations": {"countries": ["US"]},
"publisher_platforms": ["facebook", "instagram"],
"facebook_positions": ["feed", "video_feeds", "story", "reels"],
"instagram_positions": ["stream", "story", "reels", "explore"]
},
"optimization_goal": "OFFSITE_CONVERSIONS",
"bid_strategy": "LOWEST_COST_WITHOUT_CAP"
}
],
"creative": {
"images_directory": "./path/to/ad-images/",
"primary_texts": [
"Primary text variant 1 — lead with the hook or pain point",
"Primary text variant 2 — lead with the benefit or social proof",
"Primary text variant 3 — lead with a comparison or price anchor"
],
"headlines": [
"Short Punchy Headline",
"Benefit-Driven Headline",
"Price/Value Headline"
],
"descriptions": [
"Supporting description with key differentiator"
],
"link_url": "https://yoursite.com/landing-page",
"url_parameters": "utm_source=meta&utm_medium=paid-social&utm_campaign=campaign-name&utm_content={{ad.name}}",
"call_to_action_type": "SHOP_NOW"
}
}Config notes:
daily_budget is in cents (5000 = $50.00/day)genders: 0 = all, 1 = male, 2 = female{{ad.name}} is a Meta dynamic parameter — auto-fills with the ad namecall_to_action_type options: SHOP_NOW, LEARN_MORE, SIGN_UP, GET_OFFER, ORDER_NOW, SUBSCRIBE, BOOK_NOW| Metric | Good | OK | Needs Work | What It Means |
|---|---|---|---|---|
| CTR | >1.5% | 1-1.5% | <1% | % of impressions that click. Low = creative isn't resonating |
| CPM | <$15 | $15-25 | >$25 | Cost per 1000 impressions. High = competitive auction or narrow audience |
| CPC | <$1 | $1-2 | >$2 | Cost per click. High = low CTR driving up costs |
| CPA | <$30 | $30-50 | >$50 | Cost per purchase. The ultimate efficiency metric |
| ROAS | >3x | 2-3x | <2x | Revenue per $1 spent. Below 2x usually means losing money after COGS |
| Frequency | 1-3 | 3-5 | >5 | Avg times each person saw the ad. High = ad fatigue |
| Hook Rate | >25% | 15-25% | <15% | % who watch first 3 sec of video. Low = weak opening |
| Hold Rate | >10% | 5-10% | <5% | % who watch 15+ sec. Low = content doesn't sustain interest |
Scaling winners:
Fixing underperformers:
Meta learning phase:
Example 1: First-time Setup
User: "I want to set up Meta ads for my store"
Skill Response:
Example 2: Publish a Campaign
User: "Create a campaign for our new product launch"
Skill Response:
Example 3: Check Performance
User: "How are my Meta ads doing?"
Skill Response:
Example 4: Token Expired
User: "My meta ads token isn't working" / agent sees error code 190
Skill Response:
Example 5: Manage Campaign
User: "Pause campaign 12345678"
Skill Response:
uv run ~/.claude/skills/MetaAds/tools/Publish.py --pause 12345678Last Updated: 2026-02-07
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.