Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Design ad creative across Google, Meta, LinkedIn, Twitter/X, and TikTok with platform format specs, headline formulas, and A/B testing. Use when writing ad copy, generating headline variations, creating ad sets, or validating creative.
.claude/skills/borghei-ad-creative/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 249% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 733% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 369% | 0% |
| case-20 | ✗→✓ | ▲ Improved | 366% | 0% |
| case-21 | ✗→✓ | ▲ Improved | 421% | 0% |
Production-grade ad creative design, iteration, and optimization across all major advertising platforms.
ad creative, ad copy, headline generation, RSA headlines, Meta ad copy, LinkedIn ads, Google Ads, Twitter/X ads, TikTok ads, creative testing, A/B testing, ad variations, bulk creative, performance creative, display ads, search ads, social ads, CTA optimization, ad compliance, character limits, creative matrix, ad iteration, conversion copy, platform-specific ads
Before generating the copy, confirm these inputs. If any is unknown or vague, ASK — do not assume:
Stop rule: ask only the 2-3 that most change the output. If the user says "just draft it," proceed and list your assumptions at the top of the artifact.
Step 1: Define the Creative Brief
Document before writing any copy:
markdown## Creative Brief - Product/Offer: [Specific product, feature, or lead magnet] - Value Proposition: [One sentence — what changes in the customer's life] - Target Audience: [Job title, pain point, awareness level] - Platform(s): [Google / Meta / LinkedIn / Twitter/X / TikTok] - Funnel Stage: [Awareness / Consideration / Decision] - Existing Creative: [Yes/No — if yes, attach performance data] - Budget Context: [Daily/monthly spend, CPA targets]
Step 2: Generate Headlines by Formula Type
Produce minimum 10 headlines, distributed across formula categories:
Step 3: Write Platform-Specific Body Copy
For each platform, write 2-3 body copy variations:
Step 4: Assemble Ad Sets
Organize into testable ad sets:
[AD SET: Benefit-First] | [Platform] | [Funnel Stage]
Headline A: "..." (28/30 chars)
Headline B: "..." (26/30 chars)
Body: "..." (87/90 chars)
CTA: "Start Free Trial"Step 5: Validate and Submit
Run every ad through the quality checklist before upload.
Step 1: Audit Current Creative
For each running ad, classify:
Step 2: Extract the Winning Pattern
Identify what the top performers share:
Step 3: Generate Variations
Step 4: Build a Creative Testing Matrix
| Angle | Google | Meta | LinkedIn | |-------|--------|------|----------| | Benefit-first | copy] | copy] | copy] | | Social proof | copy] | copy] | copy] | | Problem agitation | copy] | copy] | copy] |
Step 1: Lock the Core Message
Define the single transferable message that works across all platforms.
Step 2: Adapt Per Platform
Reformat (not rewrite from scratch):
| Platform | Format | Headline Limit | Body/Description Limit | Key Constraints | |----------|--------|---------------|------------------------|-----------------| | Google RSA | Search | 30 chars x 15 | 90 chars x 4 descriptions | Max 3 pinned positions | | Google Display | Display | 30 chars x 5 short, 90 chars x 1 long | 90 chars x 5 | Requires 5+ images | | Google Performance Max | Multi | 30 chars x 5 short, 90 chars x 5 long | 90 chars x 5 | Auto-placement | | Meta Feed | Image/Video | 40 chars headline | 125 chars primary text (recommended) | Image text < 20% | | Meta Stories | Vertical | 40 chars | 125 chars | 9:16 aspect ratio | | LinkedIn Sponsored | Content | 70 chars headline | 150 chars intro text | No clickbait policies | | LinkedIn Message | InMail | 60 chars subject | 1,500 chars body | Personalization required | | Twitter/X | Promoted | 70 chars headline | 280 chars total | No deceptive tactics | | TikTok In-Feed | Video | No text overlay limit | 80-100 chars caption | Hook in first 2-3 seconds | | TikTok Spark | Native | Varies | 100 chars | Must use creator content |
Google Ads:
Meta Ads:
LinkedIn Ads:
The audience does not know you. Meet them where they are.
Framework: Problem > Amplify > Hint
Hook: [State the problem in their language]
Amplify: [Show the cost of inaction]
Hint: [Tease that a solution exists — don't pitch yet]What works at awareness:
What fails at awareness:
They know the problem. They are evaluating options.
Framework: Solution > Mechanism > Proof
Hook: [Name the outcome they want]
Mechanism: [Explain how you deliver it differently]
Proof: [Show evidence it works]What works at consideration:
They are close. Remove the last objection.
Framework: Proof > Risk Removal > Action
Hook: [Testimonial, case study, or result with numbers]
Risk Removal: [Free trial, money-back, no credit card]
Action: [Specific, clear CTA]What works at decision:
[Verb] [specific outcome] [timeframe or qualifier]Examples:
[Surprising claim or counterintuitive angle]Examples:
[Number] [people/companies] [outcome]Examples:
[Describe the pain vividly in their language]Examples:
[Real constraint + specific deadline or quantity]Examples:
Anti-pattern to avoid:
For every winning ad, document:
| Dimension | Answer | |-----------|--------| | Hook type | Problem / Benefit / Curiosity / Social Proof | | Funnel stage served | Awareness / Consideration / Decision | | Emotional driver | Fear / Ambition / FOMO / Frustration / Relief | | CTA friction level | Low (learn more) / Medium (free trial) / High (book demo) | | Specificity level | Vague claims / Specific numbers / Case study reference |
Preserve the winning pattern, vary one element at a time:
For every 3-5 on-theme variations, include 2-3 exploration ads:
After 7-14 days with statistical significance:
markdown## A/B Test: [Name] - Hypothesis: [If we change X, then Y will improve because Z] - Variable: [Headline / Body / CTA / Visual] - Control: [Current version] - Variant: [New version] - Metric: [CTR / CVR / CPA / ROAS] - Duration: [Start date - End date] - Sample size: [Impressions per variant] - Result: [Winner + confidence level] - Learning: [What we learned for future creative]
Platform Compliance:
Copy Quality:
Strategic Alignment:
Common Rejection Reasons to Pre-Check:
| Symptom | Likely Cause | Fix | |---------|-------------|-----| | Ad rejected by platform | Policy violation (caps, claims, trademarked terms) | Run headline_generator.py to generate compliant variants. Check rejection triggers. | | All headlines same style | No formula diversity | Generate across 5 formula types: benefit, curiosity, social proof, problem, urgency. | | CTR declining across ad set | Creative fatigue | Run creative_fatigue_detector.py. Refresh every 2-4 weeks. | | High CTR but low conversions | Ad-to-landing-page mismatch | Ensure headline promise matches landing page. Message match is the #1 conversion factor. | | Can't fill all Google RSA slots | Not enough headline variations | Use headline_generator.py to produce 15+ variations from value proposition. | | Video underperforming on Meta | Hook not in first 2-3 seconds | 80%+ of social impressions are mobile. Hook must appear in first 2 seconds. | | Same CPA across all creative | Not testing enough angles | Build a creative testing matrix with 5 hook types x platforms. Use creative_matrix_builder.py. |
In Scope: Ad headline/body copy generation, platform-specific formatting, A/B testing frameworks, creative iteration methodology, compliance validation, cross-platform adaptation.
Out of Scope: Visual design/production, video editing, campaign management (use paid-ads), landing page copy (use copywriting), media buying.
scripts/headline_generator.py)Generates ad headline variations from a value proposition using proven formula patterns, scored for platform compliance.
bashpython scripts/headline_generator.py --value-prop "Reduce churn by 30%" --platform google --audience "SaaS teams" python scripts/headline_generator.py --value-prop "Reduce churn by 30%" --json
scripts/creative_fatigue_detector.py)Analyzes ad performance trends (CTR, CPA, frequency) to detect creative fatigue and recommend refresh timing.
bashpython scripts/creative_fatigue_detector.py campaign_data.json python scripts/creative_fatigue_detector.py --sample --json
scripts/creative_matrix_builder.py)Generates a cross-platform creative testing matrix from a brief, organized by hook type and funnel stage.
bashpython scripts/creative_matrix_builder.py brief.json python scripts/creative_matrix_builder.py --sample --json
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-03 | fail→fail | 26,279 | 51,249 | +95% | 1 | 1 | 0% | 4,329 | 8,844 | +104% | 0 | 0 | — |
case-01 | fail→fail | 29,968 | 26,368 | -12% | 1 | 1 | 0% | 5,310 | 9,356 | +76% | 0 | 0 | — |
case-02 | fail→fail | 26,005 | 18,117 | -30% | 1 | 1 | 0% | 3,338 | 7,512 | +125% | 0 | 0 | — |
case-04 | fail→pass | 13,081 | 16,732 | +28% | 1 | 1 | 0% | 2,168 | 7,562 | +249% | 0 | 0 | — |
case-05 | pass→pass | 7,373 | 10,769 | +46% | 1 | 1 | 0% | 1,284 | 6,692 | +421% | 0 | 0 | — |
case-06 | pass→pass | 5,289 | 7,120 | +35% | 1 | 1 | 0% | 861 | 5,680 | +560% | 0 | 0 | — |
case-07 | pass→pass | 3,279 | 6,292 | +92% | 1 | 1 | 0% | 481 | 5,529 | +1049% | 0 | 0 | — |
case-08 | fail→fail | 5,367 | 10,896 | +103% | 1 | 1 | 0% | 773 | 5,539 | +617% | 0 | 0 | — |
case-09 | fail→pass | 4,476 | 7,043 | +57% | 1 | 1 | 0% | 684 | 5,696 | +733% | 0 | 0 | — |
case-10 | fail→fail | 7,727 | 11,612 | +50% | 1 | 1 | 0% | 1,085 | 6,515 | +500% | 0 | 0 | — |
case-11 | pass→pass | 11,218 | 7,245 | -35% | 1 | 1 | 0% | 1,631 | 5,756 | +253% | 0 | 0 | — |
case-12 | pass→pass | 11,588 | 8,011 | -31% | 1 | 1 | 0% | 1,752 | 5,668 | +224% | 0 | 0 | — |
case-13 | pass→pass | 12,459 | 8,965 | -28% | 1 | 1 | 0% | 1,893 | 6,022 | +218% | 0 | 0 | — |
case-14 | fail→fail | 9,152 | 14,427 | +58% | 1 | 1 | 0% | 1,309 | 7,133 | +445% | 0 | 0 | — |
case-15 | pass→pass | 16,023 | 13,596 | -15% | 1 | 1 | 0% | 2,261 | 6,612 | +192% | 0 | 0 | — |
case-16 | pass→pass | 14,823 | 9,759 | -34% | 1 | 1 | 0% | 2,265 | 6,198 | +174% | 0 | 0 | — |
case-17 | pass→pass | 12,761 | 12,863 | +1% | 1 | 1 | 0% | 1,880 | 6,367 | +239% | 0 | 0 | — |
case-18 | pass→fail | 12,958 | 7,323 | -43% | 1 | 1 | 0% | 1,874 | 5,765 | +208% | 0 | 0 | — |
case-19 | fail→pass | 6,571 | 2,123 | -68% | 1 | 1 | 0% | 1,063 | 4,988 | +369% | 0 | 0 | — |
case-20 | fail→pass | 7,259 | 2,018 | -72% | 1 | 1 | 0% | 1,053 | 4,910 | +366% | 0 | 0 | — |
case-21 | fail→pass | 13,667 | 2,452 | -82% | 1 | 1 | 0% | 963 | 5,014 | +421% | 0 | 0 | — |
case-22 | fail→fail | 18,068 | 23,227 | +29% | 1 | 1 | 0% | 3,746 | 9,308 | +148% | 0 | 0 | — |
case-23 | fail→fail | 18,264 | 22,438 | +23% | 1 | 1 | 0% | 3,038 | 8,188 | +170% | 0 | 0 | — |
case-24 | fail→fail | 17,000 | 12,138 | -29% | 1 | 1 | 0% | 2,749 | 6,422 | +134% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 23 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +17 percentage points is the difference between those two pass rates over the 23 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.