Created: Feb 23, 2026 Updated: Apr 30, 2026 Status: local official-CLI adapter in progress Owner: @themattberman
An OpenClaw-powered Meta Ads manager that replaces daily Ads Manager sessions with AI-generated briefings and recommendations.
The Promise: Configure official Meta Ads CLI access → run daily briefings with bleeders, winners, pacing, and fatigue alerts → review dry-run recommendations → approve any spend-impacting action explicitly.
Target Users:
- Founders running their own Meta ads
- Small marketing teams without a dedicated media buyer
- Agency operators managing multiple accounts
- Anyone tired of clicking through Ads Manager
OpenClaw skills
↓
run.sh
↓
scripts/meta-kit.sh # local dispatcher/report layer
↓
scripts/lib/config.sh # env loading and account selection
scripts/lib/meta-cli.sh # official CLI wrapper + snapshots
scripts/lib/safety.sh # approval, dry-run, PAUSED-only guards
scripts/lib/mock.sh # fixture-backed mock mode
↓
Official Meta Ads CLI (`meta`, package `meta-ads`)
↓
Meta Marketing API
The adapter layer keeps OpenClaw skills stable while Meta's CLI syntax stays centralized in one mapping file.
Official docs path:
https://developers.facebook.com/documentation/ads-commerce/ads-ai-connectors/ads-cli/ads-cli-overview
Key facts:
- Package:
meta-adson PyPI - Binary:
meta - Python: 3.12+
- Auth: Meta admin system user access token
- Official env vars:
ACCESS_TOKEN,AD_ACCOUNT_ID, optionalBUSINESS_ID - Command pattern:
meta ads <resource> <action> [options] - Global flags go before
ads, e.g.meta --output json --no-input ads campaign list - Resource names are singular:
campaign,adset,ad,creative,adaccount,page,insights,dataset,catalog,product-feed,product-item,product-set
Purpose: Daily reporting and ad-management recommendations.
Reports:
- Daily check / 5 Daily Questions
- Account overview
- Campaign listing
- Winners
- Bleeders
- Fatigue check
- Efficiency and pacing reads
Purpose: Track creative health over time.
Capabilities:
- CTR trend monitoring
- Frequency creep detection
- CPC inflation alerts
- Creative rotation recommendations
Purpose: Spend efficiency analysis.
Capabilities:
- Campaign efficiency ranking
- Budget shift recommendations
- Spend pacing checks
- Recommendations only unless explicitly approved
Purpose: Generate ad copy matched to specific image creatives.
Capabilities:
- Analyze image creative
- Cross-reference winning copy patterns when read-only data is available
- Generate headline/body variants
- Output payload candidates for
ad-uploaddry runs
Purpose: Prepare upload/create payloads for Meta.
Capabilities:
- Build creative/ad payload candidates
- Validate payload posture
- Use official CLI-first where supported
- Create only as
PAUSED, only after explicit approval
Purpose: Audit Meta Pixel + Conversions API setup.
Capabilities:
- Dataset/pixel inventory via official CLI where supported
- CAPI testing remains separate and approval-gated because it can send events to Meta
- Cron or user triggers
./run.sh daily-check. run.shcallsscripts/meta-kit.sh.- Adapter loads config and mode.
- In
mockmode, fixtures are used. - In
read-onlymode, the adapter calls official Ads CLI and saves snapshots. - Reports identify pacing, active campaigns, trends, winners, bleeders, and fatigue.
- Agent presents recommendations and asks before any action.
- User asks a question.
- Agent selects the matching report command.
- Adapter pulls mock/read-only data.
- Agent interprets against
ad-config.jsonand brand memory. - If spend-impacting action is useful, agent creates a dry-run plan and waits for approval.
| Mode | Purpose | External calls | Mutations |
|---|---|---|---|
mock |
Local development/demo | No | No |
read-only |
Real reporting | Yes, read-only | No |
live-approved |
Explicitly approved mutation session | Yes | Approval-gated |
Reporting can run in mock or read-only. Live mutations are never implicit.
Any action that affects spend requires explicit user confirmation:
- create/update/delete resources
- pause/resume/status changes
- budget changes
- any command using
--force
Every proposed mutation writes a JSON artifact under local/dry-runs/ containing:
- timestamp
- account ID
- mode
- exact command preview
- payload path
- risk note
- approval requirement
- rollback note
New campaigns/ad sets/ads/creatives must be created as PAUSED unless a later reviewed version intentionally changes this. Deletes remain unsupported in v1.
Ignored by git:
.env.env.*.locallocal/*.token*.secrets
Default thresholds in ad-config.json:
| Metric | Default | Purpose |
|---|---|---|
| Bleeder CTR | < 1.0% | Flag underperforming ads |
| Max frequency | > 3.5 | Creative fatigue signal |
| Fatigue CTR drop | > 20% over 3 days | Early fatigue warning |
| Spend pace alert | ±15% of daily budget | Over/underspend warning |
| Target CPA | $25.00 | Campaign efficiency target |
| Target ROAS | 3.0x | Return on ad spend target |
Local/static:
bash -n run.sh scripts/*.sh scripts/lib/*.shMock reports:
META_KIT_MODE=mock ./run.sh daily-check
META_KIT_MODE=mock ./run.sh overview --preset last_7d
META_KIT_MODE=mock ./run.sh campaigns
META_KIT_MODE=mock ./run.sh bleeders
META_KIT_MODE=mock ./run.sh winners
META_KIT_MODE=mock ./run.sh fatigue
META_KIT_MODE=mock ./run.sh efficiency
META_KIT_MODE=mock ./run.sh pacing
META_KIT_MODE=mock ./scripts/meta-kit.sh doctorOfficial CLI help, no credentials required:
uvx --python 3.12 --from meta-ads meta --help
uvx --python 3.12 --from meta-ads meta ads --help
uvx --python 3.12 --from meta-ads meta ads campaign list --help
uvx --python 3.12 --from meta-ads meta ads insights get --help- Real read-only validation against one approved account
- Official CLI-backed creative/ad upload dry-run payloads
- Multi-account agency mode with per-client env files
- Weekly report artifacts
- Creative performance dashboards
- Automated A/B test analysis
- Google Ads adapter