meta-ads
Core reporting — daily checks, bleeders, winners, fatigue detection
ad-creative-monitor
Track creative performance over time, detect fatigue before it kills ROAS
budget-optimizer
Analyze spend efficiency, recommend budget shifts between campaigns
ad-copy-generator
Generate ad copy matched to specific image creatives, outputs asset_feed_spec variants
ad-upload
Push images and copy straight to Meta via Graph API — no Ads Manager required
meta-ads
The foundation. This skill wraps social-cli to give you the 5 Daily Questions that replace Ads Manager.What It Does
- Daily briefings — Spend pacing, active campaigns, 7-day trends
- Bleeders report 🩸 — Ads with high spend + low CTR bleeding your budget
- Winners report 🏆 — Top performers ready to scale
- Fatigue detection 😴 — CTR declining, frequency climbing, CPC rising
- Custom reports — Ad performance broken down by age, gender, placement, etc.
- Actions (with approval) — Pause, resume, adjust budgets
When You Use It
Key Reports
| Report | What It Shows | When To Run |
|---|---|---|
| Daily Check | All 5 questions in one go | Every morning |
| Bleeders | CTR < 1% or frequency > 3.5 + high spend | When budget feels wasted |
| Winners | Top CTR, low CPC, scaling headroom | When you have budget to shift |
| Fatigue Check | Day-over-day CTR/CPC/frequency trends | Weekly or when CTR dips |
| Custom | Any field + breakdown combo | On-demand investigation |
All reporting is read-only. The skill can pull any data without asking. Actions that affect spend (pause/resume/budget changes) always require explicit approval.
Date Presets
You can run any report for:today— Today onlyyesterday— Yesterday onlylast_7d— Last 7 days (default)last_30d— Last 30 dayslast_90d— Last 90 days
"Meta ads overview for last 30 days"
Files Read/Written
Reads:ad-config.json— Your benchmarks (target CPA, max frequency, etc.)workspace/brand/stack.md— Stored ad account ID (optional)workspace/brand/learnings.md— Past performance patterns (optional)
workspace/brand/learnings.md— Appends findings: fatigue patterns, winning creative traits, performance anomaliesworkspace/brand/stack.md— Stores ad account ID on first use
ad-creative-monitor
The early warning system. Creative fatigue is the silent killer of ad accounts. This skill watches for fatigue signals daily and flags creatives that need rotation.What It Does
- Daily CTR tracking — Monitors CTR decay day-over-day at the ad level
- Frequency creep detection — Alerts when frequency exceeds thresholds
- CPC inflation tracking — Flags ads where CPC is quietly rising
- Creative lifespan estimation — Predicts when an ad will exhaust its audience
- Rotation recommendations — Tells you which ads to pause and when new creatives are needed
Fatigue Signals (Ranked by Severity)
| Signal | Threshold | Severity |
|---|---|---|
| CTR dropping 3+ days in a row | >20% decline from peak | 🔴 Critical |
| Frequency above 3.5 | Audience seeing ad too often | 🟡 Warning |
| CPC rising 3+ days in a row | >15% increase from baseline | 🟡 Warning |
| Impressions declining | Ad losing delivery | 🟠 Monitor |
When You Use It
- As part of the daily check (Question 5)
- Weekly on Mondays to plan creative refresh
- On-demand when you notice CTR dipping
Example Output
How it works: Pulls ad-level insights with daily time increment (
--time-increment 1), calculates day-over-day trends for CTR/CPC/frequency, compares against benchmarks in ad-config.json, flags any ad showing fatigue, and recommends rotation schedule.budget-optimizer
The efficiency analyzer. Most ad accounts have budget spread evenly across campaigns when performance isn’t even close to even. This skill finds where your money works hardest and recommends shifts.What It Does
- Efficiency ranking — Sorts campaigns/adsets by CPA, ROAS, or CPC
- Budget shift recommendations — Calculates how much to move from losers to winners
- Spend pacing checks — Flags over/underspend vs. daily or lifetime budgets
- ROI comparison — Shows which campaigns deliver the best return
When You Use It
- Weekly to optimize budget allocation
- When a campaign is underperforming
- Before scaling winners
How It Works
- Pulls campaign and adset level insights for the specified period
- Calculates efficiency metrics (CPA, ROAS, CPC relative to spend)
- Compares against benchmarks in
ad-config.json - Identifies top and bottom performers
- Calculates recommended budget shifts (percentage-based)
- Presents recommendations with clear reasoning
- Never adjusts budget without explicit approval
- Logs decisions to
workspace/brand/learnings.md
Example Output
Safety: Budget changes are high-risk actions. This skill always shows current vs. recommended budget, explains the reasoning with data, waits for explicit “yes” before executing, and logs every change for audit trail.
ad-copy-generator
The creative writer. Generates Meta ad copy that’s matched to specific image creatives — not generic copy pasted across every ad. Each image gets copy that reinforces its specific message.What It Does
- Image analysis — Uses vision to identify visual format (notes app, receipt, tweet, chart, etc.), on-image text, angle/hook, mood
- Account data cross-reference — Pulls your top-performing ads to find winning copy patterns
- Psychology-driven variants — Generates 3-5 headline + body variants, each hitting a different psychological trigger (Money, Time, Status, Fear)
- Brand voice matching — Reads
workspace/brand/voice-profile.mdto match tone and avoid forbidden words - asset_feed_spec output — Formats copy ready for Meta’s Degrees of Freedom optimization
The Process (Simplified)
- Pull what’s already working — Check top 20 ads by CTR in last 30 days, extract copy patterns
- Load brand context — Read voice profile, audience, positioning (or ask inline if not available)
- Analyze each image — Identify format, on-image text, psychology, mood, funnel stage
- Write copy using psychology — Rotate across the Four Horsemen (Money, Time, Status, Fear)
- Apply Meta specs — Headlines 25-40 chars, body 50-120 words, 2-3 short paragraphs
- Generate variants — 3-5 headlines × 3-5 bodies, each hitting different angles
- Cross-reference winners — Match headline length, hook structure, proof claims to what’s working
- Output asset_feed_spec — JSON ready to feed into
ad-upload
When You Use It
- When
ad-creative-monitordetects fatigue → time for fresh copy - When launching new campaigns
- When testing new creative concepts
Copy Specs (Meta Best Practices)
| Element | Spec | Why |
|---|---|---|
| Headline length | 25-40 chars, never >50 | Truncation on mobile kills CTR |
| Body word count | 50-120 words | Short enough to read, long enough to convince |
| Paragraphs | 2-3, each 1-2 sentences | Mobile readability — walls of text = scroll past |
| Numbers required | ≥1 per variant ($, %, or count) | Specificity = credibility |
| Social proof | Include where natural | ”X+ customers” is highest-converting pattern |
| Opening line | Pain, stat, or bold claim | Never brand name, never “Introducing” |
Example Output
[creative-name].json - asset_feed_spec JSON (ready for ad-upload)
- Validate copy + image |
- Upload image → get hash
| - Create creative with asset_feed_spec |
- Create ad (or update existing) |
- Save IDs to campaign files
- Right after
ad-copy-generatorproduces asset_feed_spec JSON - When refreshing fatigued creatives
- When launching new campaigns
Validation (Before Upload)
Runs local checks before touching the API:| Check | Rule |
|---|---|
| Headline | Max 40 chars (hard stop at 50) |
| Body | 50-500 chars per variant |
| Description | Max 30 chars |
| Image format | JPG or PNG only |
| Image size | Under 30MB, min 600×600px |
| Aspect ratio | 1:1, 4:5, 16:9, or 9:16 |
Dry-Run Mode
Add--dry-run to see exactly what would be sent without hitting the API:
- Validation results
- Exact JSON payload for each endpoint
- Estimated creative/ad names
- No API calls made, no IDs returned
Example Output
Always creates ads as PAUSED. Review in Ads Manager before activating. This prevents accidental budget burn.
Files Written
upload.json:
workspace/brand/assets.md:
How Skills Work Together
The five skills chain into a closed loop: Example workflow:- meta-ads runs daily check → finds Ad #238471 has frequency 4.2, CTR dropped 40%
- ad-creative-monitor confirms fatigue signal → recommends rotation
- ad-copy-generator writes 3 new body variants + 3 headlines matched to the same image
- ad-upload pushes fresh creative, attaches to existing ad (preserves ad ID and history)
- meta-ads monitors new creative performance over next 7 days
- If new copy outperforms, budget-optimizer recommends scaling it
Next Steps
Daily Questions
Understand the 5 questions that power the daily check
Workflow
See how skills chain into the full automation loop
Setup Guide
Get your ad account connected and run your first report
Configuration
Customize benchmarks and skill behavior