Paid media Independent solution

Ad Copy Optimizer

Generate policy-safe ad variants across distinct angles, get a predicted strength score before you spend, then feed live A/B results back in so every round of copy is written from what actually converted.

The problem

Ad testing is slow, and learnings rarely compound

Writing enough variants to test properly is a grind, half get disapproved on policy, and once a test ends the insight lives in someone's head — not in the next batch of copy. Budget burns while you wait for winners, and the same mistakes repeat.

This solution generates on-policy variants across real angles and closes the loop from results back to copy.

Primary objective
Ship more winning ad variants faster — and make every test teach the next one.
How it works

Generate → policy check → score → learn from results

Generate
Variants across distinct angles
Policy check
Screen for platform disapprovals
Score
Predicted strength before spend
Learn
A/B results → next-round copy
What it does
  • ✓ Multi-angle variant generation
  • ✓ Headline / description / CTA sets
  • ✓ Character-limit compliance
  • ✓ Policy-risk screening
  • ✓ Predicted-strength scoring
  • ✓ Results-driven next round
Built with
  • ✓ Claude for copy & angle reasoning
  • ✓ Google Ads & Meta APIs
  • ✓ Historical performance store
  • ✓ Policy-rule knowledge base
  • ✓ Human approval before launch
Guardrails
  • ✓ No claims without support
  • ✓ Prohibited-content filtering
  • ✓ Brand & legal tone limits
  • ✓ Human sign-off before spend
  • ✓ Full variant audit trail
Under the hood

Angle-diverse variants, grounded in past winners

Generate genuinely different angles rather than reworded twins, and bias toward what has converted before — with a policy screen ahead of any spend.

ads/variants.py PYTHON
from anthropic import Anthropic
from policy import screen        # flags likely disapprovals
client = Anthropic()

ANGLES = ["pain-relief", "social-proof", "speed", "price", "authority"]

def generate_variants(product: str, winners: list[str]) -> list:
    prompt = f"""Write one Google RSA headline (<=30 chars) per angle.
Angles: {ANGLES}
Product: {product}
These converted well before — learn from them, don't copy: {winners}
Reply as JSON: [{{"angle":..., "headline":...}}]"""

    msg = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=700, temperature=0.7,
        messages=[{"role": "user", "content": prompt}],
    )
    variants = parse_json(msg.content[0].text)
    # Screen before a human ever sees them — never launch on red flags
    for v in variants:
        v["policy"] = screen(v["headline"])
    return [v for v in variants if v["policy"].ok]
Outcomes
Minutes
To a full test matrix
Fewer
Policy disapprovals
Compounding
Learnings each round
Lower
Wasted ad spend

Make every ad test teach the next

Pairs with Keyword Intelligence for angles and the Content Engine for landing pages.

Start a conversation →
More SEO & Marketing solutions
Ad Copy Optimizer | Smort