Skills ad-engine
Assemble modular ads from Supabase components and deploy to Facebook Ads Manager via the Marketing API. Supports preview, single/batch deploy, and status tracking. Uses ad_components table for A/B testing at scale.
install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/aces1up/ad-engine" ~/.claude/skills/clawdbot-skills-ad-engine && rm -rf "$T"
manifest:
skills/aces1up/ad-engine/SKILL.mdsource content
Ad Engine — Facebook Ads Deployment
Assemble ads from database components and deploy to Facebook. Reads from Supabase
ad_components + messages tables, assembles full ad copy, uploads images, and creates Campaign → Ad Set → Ad in Facebook Ads Manager.
First-Time Setup
1. Facebook prerequisites (one-time, manual):
- Facebook Business Manager account
- Ad Account created
- Facebook Page connected
- Facebook Developer App with
permissionads_management - Long-lived access token (generate at developers.facebook.com)
2. Store credentials:
python3 scripts/fb_deploy.py --setup
Prompts for access token, ad account ID, and page ID. Validates against FB API and saves to
~/.config/ad-engine/fb_config.json.
Usage
Preview assembled ads (no deployment):
# Preview a single ad python3 scripts/fb_deploy.py --preview --message-id 8555 # Preview all draft ads for a campaign python3 scripts/fb_deploy.py --preview --campaign-id 43 # Preview as JSON python3 scripts/fb_deploy.py --preview --campaign-id 43 --json
Deploy a single ad:
python3 scripts/fb_deploy.py --deploy \ --message-id 8556 \ --image /path/to/security-audit-ad.png \ --landing-url "https://calendly.com/your-link" \ --objective messages
Deploy all draft ads for a campaign:
python3 scripts/fb_deploy.py --deploy \ --campaign-id 43 \ --image-dir /path/to/ad-images/ \ --landing-url "https://calendly.com/your-link" \ --objective messages
Dry run (preview what would be created):
python3 scripts/fb_deploy.py --deploy \ --campaign-id 43 \ --image-dir /path/to/images/ \ --landing-url "https://calendly.com/link" \ --dry-run
Check deployed ad status + live metrics:
python3 scripts/fb_deploy.py --status --campaign-id 43
Parameters
| Parameter | Required | Description |
|---|---|---|
| One of | Preview assembled ads without deploying |
| these | Deploy ads to Facebook |
| three | Check status of deployed ads |
| Configure Facebook credentials | |
| For single | Specific message ID to preview/deploy |
| For batch | All draft ads in a campaign |
| Deploy single | Image file path |
| Deploy batch | Directory of images (matched by angle name in filename) |
| Deploy | Booking/landing page URL |
| No | (default), , or |
| No | Preview deployment without creating anything |
| No | Output as JSON |
Image Naming Convention
When using
--image-dir for batch deploy, name images by angle:
security-audit-ad.png → matches angle "security_audit" setup-is-hell-ad.png → matches angle "setup_is_hell" dm-trigger-checklist.png → matches angle "dm_trigger" anti-wrapper-graveyard.png → matches angle "anti_wrapper"
How It Works
- Reads message from Supabase
table (content_type = 'fb_ad')messages - Reads component references from message's
extra_data.components - Resolves component keys → actual text from
tablead_components - Slots components into framework template using
{{merge_tags}} - Uploads image to Facebook → gets image_hash
- Creates Campaign (if new) → Ad Set (if new) → Ad Creative → Ad
- Updates message status to 'deployed' with FB IDs stored in extra_data
Database Schema
See
AD_ENGINE_SPEC.md for full schema documentation.
Dependencies
— Supabase Postgres connectionpsycopg2-binary
— Facebook Marketing API SDKfacebook-business
— HTTP clientrequests- All auto-installed on first run.