원클릭으로
ad-copy-generator
// Generate high-converting Meta ad copy matched to specific image creatives. Analyzes visuals, writes copy that reinforces the image, cross-references account performance data, and outputs asset_feed_spec-ready variants.
// Generate high-converting Meta ad copy matched to specific image creatives. Analyzes visuals, writes copy that reinforces the image, cross-references account performance data, and outputs asset_feed_spec-ready variants.
| name | ad-copy-generator |
| description | Generate high-converting Meta ad copy matched to specific image creatives. Analyzes visuals, writes copy that reinforces the image, cross-references account performance data, and outputs asset_feed_spec-ready variants. |
| metadata | {"openclaw":{"emoji":"✍️","user-invocable":true,"homepage":"https://github.com/TheMattBerman/meta-ads-kit","requires":{"env":["FACEBOOK_ACCESS_TOKEN"]}}} |
Write Meta ad copy that's matched to the actual image creative — not generic copy pasted across every ad. Each image gets copy that reinforces its specific message, written in the brand's voice, informed by what's already working in the account.
Read workspace/brand/ per the _vibe-system protocol if available.
This skill reads brand context to make every piece of copy sound like the brand, not a template.
Reads: voice-profile.md, positioning.md, audience.md (all optional)
On invocation:
voice-profile.md — Match tone, vocabulary, forbidden words. Show: "Voice loaded — [tone summary]."positioning.md — Use angle as copy's foundation. Show: "Positioning: [angle]."audience.md — Know who we're talking to, their awareness level, their language. Show: "Writing for [audience summary]."workspace/brand/ doesn't exist — Skip. Ask for ICP, voice notes, and forbidden words inline. This skill works standalone.Before writing, check for existing copy:
workspace/campaigns/{name}/ads/ — If copy exists, show what's there.Before writing a single word, look at the account. What copy is converting?
# Top performers by CTR — last 30 days
curl -s "https://graph.facebook.com/v22.0/ACT_ID/insights?\
level=ad&fields=ad_name,impressions,clicks,ctr,cpc,cost_per_action_type\
&date_preset=last_30d&sort=ctr_descending&limit=20\
&access_token=$FACEBOOK_ACCESS_TOKEN"
Then pull copy from winners:
# Get creative ID from the ad
curl -s "https://graph.facebook.com/v22.0/AD_ID?fields=creative{id}&access_token=$FACEBOOK_ACCESS_TOKEN"
# Get the actual copy
curl -s "https://graph.facebook.com/v22.0/CREATIVE_ID?fields=asset_feed_spec&access_token=$FACEBOOK_ACCESS_TOKEN"
Extract patterns:
Show the user what you found: "Your top 3 ads all open with a specific number and close with social proof. Average headline: 32 chars. I'll match that pattern."
Read the client's CLAUDE.md, brand profile, or ask inline:
| Need | Where | Fallback |
|---|---|---|
| ICP | audience.md or CLAUDE.md | Ask: "Who's this for?" |
| Voice | voice-profile.md | Ask: "Any words to avoid? Tone preference?" |
| Pain points | audience.md | Extract from top-performing copy |
| Key stats | Brand brief / CLAUDE.md | Ask: "What proof points can I use?" |
| Forbidden words | voice-profile.md | Default ban list (see below) |
Default forbidden words (always banned unless brand explicitly uses them): revolutionary, game-changer, cutting-edge, innovative solution, transform your business, unlock your potential, unleash, harness the power, leverage (as verb), next-level, best-in-class, world-class, seamless, robust, synergy
For every image that needs copy, use vision to identify:
The critical rule: Copy reinforces the image, never repeats it. If the image shows "$17K/month", the body tells the story behind that number. If the image shows a stressed host, the copy describes the chaos. Image and copy are two halves of one message.
Every ad pulls at least one psychological lever. Rotate across variants so Meta can test.
The Four Horsemen (Kallaway Framework):
| Horseman | Trigger | Opening Pattern |
|---|---|---|
| Money | Revenue loss, ROI, cost savings | "Every [thing] you miss is worth $X." |
| Time | Wasted hours, efficiency, speed | "Your [person] isn't a [wrong role]." |
| Status | Peer comparison, industry moves | "X+ [peers] already [did thing]." |
| Fear | Loss aversion, competitive threat | "The [competitor] down the street already has this." |
Matching psychology to image format:
| Image Format | Best Psychology | Copy Tone |
|---|---|---|
| Notes app / screenshot | Fear + Money | Casual first-person discovery |
| Fake tweet / social | Status + Fear | Conversational, peer voice |
| Data visualization | Money + Status | Authority, numbers-forward |
| Receipt / POS | Money + Time | Specific, transactional |
| Kitchen / still life | Fear + Time | Emotional, atmospheric |
| Review / testimonial | Status + Money | Third-person proof |
| Slack / workplace | Time + Status | Insider, operational |
| News article | Fear + Status | Urgent, newsjacking |
| Before/after | Money + Time | Contrast, transformation |
| Bold text / poster | Any | Direct, declarative |
| Google review | Status + Money | Social proof, customer voice |
| Whiteboard / letter board | Time + Fear | Physical, tangible |
| Lock screen / notifications | Fear + Time | Urgency, real-time |
These specs come from analyzing hundreds of winning Meta ads:
| 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 the highest-converting pattern |
| Opening line | Pain, stat, or bold claim | Never brand name, never "Introducing" |
| Closing line | Social proof + soft CTA | "X+ already made the switch." |
| Line breaks | After every 1-2 sentences | Scannability on mobile |
| No em dashes | Use hyphens or restructure | Rendering inconsistency across placements |
| No emojis in body | Unless brand voice uses them | Most B2B/professional ads don't |
Meta's algorithm tests combinations. Give it options:
Per creative:
Rules for variant quality:
Before finalizing, check your copy against Step 1 findings:
Flag any mismatches: "Your top performers use question headlines. 2 of my 3 headlines are questions — aligned."
| Stage | Objective | Copy Focus | CTA | Proof Level |
|---|---|---|---|---|
| ToFu | Awareness / Traffic | Problem awareness, curiosity | Learn More | Light — "X+ use this" |
| MoFu | Consideration / Leads | Solution proof, specific features | Get Free Audit / See Demo | Medium — case study snippets |
| BoFu | Conversion / Sales | Urgency, risk reversal, pricing | Start Free Trial / Book Demo | Heavy — ROI numbers, testimonials |
Adjust body copy density:
For each creative:
## [Creative Name]
*Image: [brief description of what the image shows]*
*Format: [notes app / tweet / receipt / etc.]*
*Psychology: [primary Horseman] + [secondary]*
*Funnel: [ToFu / MoFu / BoFu]*
*Matched to image: [one line on how copy reinforces the visual]*
### Headlines
1. [headline] ([XX] chars) — [Horseman]
2. [headline] ([XX] chars) — [Horseman]
3. [headline] ([XX] chars) — [Horseman]
### Body Copy
**V1 — [Horseman]: [Angle name]**
[body text]
*[word count] words*
**V2 — [Horseman]: [Angle name]**
[body text]
*[word count] words*
**V3 — [Horseman]: [Angle name]**
[body text]
*[word count] words*
### Descriptions
1. [description]
2. [description]
### asset_feed_spec (ready for API)
```json
{
"bodies": [
{"text": "V1 body..."},
{"text": "V2 body..."},
{"text": "V3 body..."}
],
"titles": [
{"text": "Headline 1"},
{"text": "Headline 2"},
{"text": "Headline 3"}
],
"descriptions": [
{"text": "Description 1"},
{"text": "Description 2"}
]
}
`` `
After generation, save to campaign directory:
workspace/campaigns/{campaign-name}/ads/
{creative-name}.md <- Full copy document
{creative-name}.json <- asset_feed_spec JSON
Append to workspace/brand/assets.md:
| {creative-name} copy | ad-copy | YYYY-MM-DD | {campaign-name} | draft | 3 headlines, 3 bodies |
If the user provides images and says "write copy for these" without specifying a full workflow:
This skill connects to the Meta Ads Copilot ecosystem:
ad-creative-monitor detects fatigue → triggers copy refreshworkspace/brand/learnings.mdSaved: workspace/campaigns/{name}/ads/ + workspace/brand/assets.md
Next up: Push copy to Meta via Graph API (ad-upload skill) or review in Ads Manager manually.
Meta Pixel + Conversions API (CAPI) setup, audit, testing, and EMQ optimization. Covers browser pixel installation, server-side CAPI implementation, deduplication, advanced matching, and Event Match Quality scoring across all major platforms.
Push ad copy and images to Meta via Graph API — no Ads Manager required. Uploads images, builds asset_feed_spec creatives, and creates or refreshes ads in existing ad sets. Downstream of ad-copy-generator.
Track creative performance over time and detect fatigue before it kills ROAS. Monitors CTR decay, frequency creep, and CPC inflation at the ad level.
Analyze spend efficiency across campaigns and adsets. Recommends budget shifts from underperformers to winners.
Meta Ads management and reporting — daily checks, campaign performance, creative fatigue, bleeders, winners. Wraps social-cli for Facebook/Instagram ads. The '5 Daily Questions' that replace Ads Manager.