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.md
source 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
    ads_management
    permission
  • 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

ParameterRequiredDescription
--preview
One ofPreview assembled ads without deploying
--deploy
theseDeploy ads to Facebook
--status
threeCheck status of deployed ads
--setup
Configure Facebook credentials
--message-id
For singleSpecific message ID to preview/deploy
--campaign-id
For batchAll draft ads in a campaign
--image
Deploy singleImage file path
--image-dir
Deploy batchDirectory of images (matched by angle name in filename)
--landing-url
DeployBooking/landing page URL
--objective
No
leads
(default),
messages
, or
link_clicks
--dry-run
NoPreview deployment without creating anything
--json
NoOutput 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

  1. Reads message from Supabase
    messages
    table (content_type = 'fb_ad')
  2. Reads component references from message's
    extra_data.components
  3. Resolves component keys → actual text from
    ad_components
    table
  4. Slots components into framework template using
    {{merge_tags}}
  5. Uploads image to Facebook → gets image_hash
  6. Creates Campaign (if new) → Ad Set (if new) → Ad Creative → Ad
  7. Updates message status to 'deployed' with FB IDs stored in extra_data

Database Schema

See

AD_ENGINE_SPEC.md
for full schema documentation.

Dependencies

  • psycopg2-binary
    — Supabase Postgres connection
  • facebook-business
    — Facebook Marketing API SDK
  • requests
    — HTTP client
  • All auto-installed on first run.