Skip to main content

Overview

The Meta Ads skill wraps social-cli to give you the five things that actually matter about your Meta campaigns — in plain text, every day. The thesis: 90% of ad management is pattern recognition. Spend trending up or down. CTR declining (creative fatigue). CPA spiking (audience exhaustion). Winners emerging. Losers bleeding. This skill spots the patterns. You make the calls.

Brand Memory Integration

The skill reads and writes to your brand workspace to provide context-aware reporting.

Reads

workspace/brand/stack.md
optional
Stored ad account ID, target CPA/ROAS. Auto-fills account, benchmarks performance against targets.
workspace/brand/creative-kit.md
optional
Brand creative guidelines and assets. Provides context for creative recommendations.
workspace/brand/audience.md
optional
Target audience profiles. Interprets audience performance data.
workspace/brand/learnings.md
optional
Past performance patterns. Spots recurring issues — “this happened last month too.”

Writes

workspace/brand/stack.md
Stores ad account ID on first use
workspace/brand/learnings.md
Appends performance findings, fatigue patterns, winning creative traits

Setup (One Time)

1. Install social-cli

npm install -g @vishalgojha/social-cli

2. Create a Meta App

If you don’t have one:
  1. Go to developers.facebook.com → My Apps → Create App
  2. Choose “Business” type
  3. Add “Marketing API” product
  4. Note your App ID and App Secret

3. Authenticate

social auth login
# Opens browser → approve → done

4. Set Default Ad Account

# List your ad accounts
social marketing accounts

# Set default
social marketing set-default-account act_123456

# Or use env var
export META_AD_ACCOUNT=act_123456

The 5 Daily Questions

The core of the system. Five questions that replace 20 minutes of Ads Manager clicking:
  1. Am I on track? — Today’s spend vs expectations
  2. What’s running? — Active campaigns at a glance
  3. How’s performance? — 7-day metrics by campaign
  4. Who’s winning/losing? — Ad-level performance sorted
  5. Any fatigue? — CTR trends, frequency, CPC movement

Invocation

Tell me: "Daily ads check"
Or: "Run the 5 questions on my ads"
Or: "How are my Meta ads doing?"

Script

scripts/meta-ads.sh daily-check

Example Output

═══════════════════════════════════════
  META ADS — DAILY CHECK
  The 5 Questions That Matter
  Account: act_123456789
═══════════════════════════════════════

① SPEND: Am I on track?
---
  Today: $247.32 (pacing 15% above target)
  Yesterday: $215.18

② CAMPAIGNS: What's running?
---
  Summer Sale - Prospecting    ACTIVE  $150/day
  Summer Sale - Retargeting    ACTIVE  $100/day
  Q2 Brand Awareness           PAUSED  $0/day

③ PERFORMANCE: Last 7 days
---
  Campaign                     Spend      CTR    CPC     Conversions
  Summer Sale - Prospecting    $1,050     1.2%   $0.85   47
  Summer Sale - Retargeting    $700       2.1%   $0.52   89

④ AD PERFORMANCE: Winners & losers
---
  Top spending ads (last 7d):
  • Notes App Hero — $312 spend, 1.8% CTR, $0.62 CPC
  • Receipt Screenshot — $287 spend, 2.3% CTR, $0.41 CPC
  • Kitchen Still Life — $198 spend, 0.7% CTR, $1.12 CPC

⑤ CREATIVE: Any fatigue signals?
---
  ↑ Watch for: CTR dropping day-over-day, frequency >3, CPC rising

  Ad: Notes App Hero
  Day 1: 2.1% CTR, Freq 1.2
  Day 7: 1.6% CTR, Freq 2.8  ← CTR declining

Reports

Overview

Account-level summary with campaign breakdown.
scripts/meta-ads.sh overview --preset last_30d
Invocation:
"Meta ads overview for last 30 days"

Campaigns

List campaigns, optionally filtered by status.
scripts/meta-ads.sh campaigns --status ACTIVE
Invocation:
"Show me active campaigns"

Top Creatives

Ad-level performance ranked by results.
scripts/meta-ads.sh top-creatives --preset last_7d
Invocation:
"What are my best performing ads?"

Bleeders 🩸

Ads with high spend but poor performance — candidates for pause. Flags ads with CTR < 1% or frequency > 3.5.
scripts/meta-ads.sh bleeders --preset last_7d
Invocation:
"Any ads bleeding money?"
"Find underperforming ads"
Example Output:
🩸 Potential Bleeders — last_7d
Account: act_123456789
================================

Ads with high spend and poor CTR/CPC (candidates for pause):

⚠️  Kitchen Still Life v3
   Campaign: Summer Sale - Prospecting
   Spend: $198.45 | CTR: 0.7% | CPC: $1.12 | Freq: 4.2

⚠️  Generic Product Photo
   Campaign: Q2 Brand Awareness
   Spend: $156.23 | CTR: 0.5% | CPC: $1.87 | Freq: 5.1

Winners 🏆

Top performing ads by CTR and efficiency. These are your scale candidates.
scripts/meta-ads.sh winners --preset last_7d
Invocation:
"Which ads should I scale?"
"Show me the winners"
Example Output:
🏆 Winners — last_7d
Account: act_123456789
================================

Top performing ads by CTR and efficiency:

🏆 Receipt Screenshot - Fear Angle
   Campaign: Summer Sale - Prospecting
   Spend: $287.12 | CTR: 2.3% | CPC: $0.41 | Clicks: 699

🏆 Notes App - Money Hook
   Campaign: Summer Sale - Retargeting
   Spend: $312.45 | CTR: 1.8% | CPC: $0.62 | Clicks: 504

Fatigue Check 😴

Daily breakdown to spot creative fatigue — CTR declining day-over-day, frequency climbing, CPC rising.
scripts/meta-ads.sh fatigue-check
Invocation:
"Any creative fatigue?"
"Check for ad fatigue"

Custom Reports

Full control. Specify level, fields, breakdowns.
scripts/meta-ads.sh custom \
  --level ad \
  --fields "ad_name,spend,ctr,cpc" \
  --breakdowns "age,gender"
Invocation:
"Show me ad performance broken down by age and gender"

Date Presets

scripts/meta-ads.sh overview --preset today

Actions (Use With Care)

Beyond reporting, social-cli can take action. These require explicit approval.
All mutating actions are high-risk and require confirmation. The skill should ALWAYS present findings and recommendations first, then ask for explicit approval before taking action.

Pause a Bleeder

social marketing pause ad AD_ID

Resume a Winner

social marketing resume ad AD_ID

Shift Budget

# Budget in cents
social marketing set-budget adset ADSET_ID --daily-budget 5000

The AI Ad Manager Workflow

This is the system from the newsletter. Here’s how it works in practice: Morning (automated via cron):
  1. Run daily-check
  2. Flag bleeders (CTR < 1%, frequency > 3.5, CPA > threshold)
  3. Flag winners (top CTR, low CPC, scaling headroom)
  4. Send summary to Telegram/Slack
You (2 minutes over coffee):
  1. Read the summary
  2. Approve/reject recommendations
  3. Ask follow-up questions if needed
The AI (on approval):
  1. Pause confirmed bleeders
  2. Increase budget on confirmed winners
  3. Log decisions to learnings.md

Invocation Pattern

When the user asks about Meta ads, Facebook ads, Instagram ads, or campaign performance:
  1. Check workspace/brand/stack.md for stored ad account ID
  2. Check META_AD_ACCOUNT env var
  3. If neither, run social marketing accounts to list available accounts
  4. Run the appropriate report
  5. Interpret results in context of brand goals (from stack.md/learnings.md)
  6. For bleeders/winners, present clear recommendations with reasoning
  7. Never take action without explicit user approval
  8. Log findings to workspace/brand/learnings.md

The 5 Daily Questions (Detailed)

When running daily-check, frame the output around these questions:
  1. “Am I on track?” — Compare today’s spend rate to daily budget. If pacing high or low, flag it.
  2. “What’s running?” — List active campaigns with status. Flag any that should be off.
  3. “How’s the last 7 days?” — Campaign-level metrics. Compare to previous 7 if available.
  4. “Who’s winning and who’s losing?” — Ad-level sort. Top 3 winners, bottom 3 losers with specific metrics.
  5. “Any fatigue signals?” — Frequency trends, CTR day-over-day, CPC movement. Concrete numbers, not vibes.

Direct social-cli Commands

You can also use social-cli commands directly for more control.
# Get account status
social marketing status

# List campaigns
social marketing campaigns --status ACTIVE

# Get insights
social marketing insights \
  --preset last_7d \
  --level campaign \
  --fields "campaign_name,spend,impressions,clicks,ctr,cpc"

# Ad-level insights with daily breakdown
social marketing insights \
  --preset last_7d \
  --level ad \
  --time-increment 1 \
  --fields "ad_name,date_start,ctr,frequency,cpc"

Next Steps

Build docs developers (and LLMs) love