The most expensive bottleneck in paid media isn’t ad spend — it’s creative throughput. Most accounts I take over have 3–4 active creatives that have been running for a month. Frequency caps blown, CTR halved, and nobody on the team has time to brief, write, design, and ship new ones.
The fix isn’t “AI ad copy.” Generic LLM output reads like generic LLM output and the algorithm punishes it within 48 hours. The fix is a tightly-constrained workflow that takes me from brief to 25 production-ready variants in about 12 minutes — without the wooden phrasing that makes readers scroll past.
This is the Brief → Variants bot from my OpenClaw stack. Here’s exactly how it works.
What “production-ready” means
Before any of the prompt details, the bar I’m holding output to:
- Variants that read like a human wrote them — no “Unlock the power of…”, no “Discover how…”, no em-dash addiction
- 5 hooks × 5 bodies × 5 CTAs that recombine into ~125 total ad combinations, but I only ship 25 hand-picked combos
- Each variant tagged with its persuasion angle (urgency, social proof, transformation, price, identity)
- Character counts that fit Meta’s headline (40), primary text (125 sweet spot), and CTA (~30) without truncation
- Brand voice that matches a 2-paragraph style guide I keep per client
Inputs the bot expects
The brief I paste in is structured. Free-form briefs give free-form output. Format:
PRODUCT:
What it is, what it does, who pays for it.
AUDIENCE:
Job titles, life stage, the pain they're feeling right now.
OFFER:
What they get, what it costs, what's the catch.
ANGLES TO TEST:
3–5 emotional or rational angles ranked by gut feel.
BRAND VOICE:
2 paragraphs from the style guide. Required.
WHAT TO AVOID:
Specific words/phrases that have lost in past tests.
That last line is the secret weapon. Every client has a list of phrases that just don’t work for their audience. Without it, the bot will reach for them every time, because they’re the words that show up most in training data for that category.
The bot’s job, written down
The prompt itself is about 60 lines. The structure:
- Role: a senior copywriter at a performance agency, 10 years’ Meta experience.
- Constraint: you write copy that performs, not copy that sounds clever.
- Hard rules: 12 banned phrases, no em-dashes, no rhetorical questions, no “imagine if” openers.
- Output format: a JSON-ish block with 5 hooks, 5 bodies, 5 CTAs, each annotated with
angle: ...andchar_count: .... - Self-check: at the end, reject any variant that violates the rules, then regenerate.
That self-check step is what bumped output quality the most. About 30% of first-draft variants get culled before I even see them, and the surviving ones are noticeably tighter.
What I do with the 25 variants
I don’t ship 25. I ship 6–8, picked across 3 angles. The other 17 sit in a backlog ready for the next week’s rotation.
The picking process is 90% gut, 10% character-count discipline:
- One hook + one body + one CTA per ad
- Don’t ship two variants of the same angle in the same week — the algorithm will treat them as the same and starve one
- Pair the most contrarian hook with the safest body; pair the most aggressive CTA with the warmest hook. Counter-weight, don’t double down.
What this looks like in practice
For one of my e-commerce clients, the typical week now looks like:
- Tuesday morning: brief into the bot, 12 minutes
- Tuesday afternoon: 6 variants picked, designer briefed
- Wednesday: designer ships
- Thursday: live in Meta
- Following Tuesday: results in, dead variants killed, brief the next round
Five years ago that cycle was two weeks. Now it’s seven days, and the creative looks better because I’m picking from 25 variants instead of three.
The pitfalls I’ve hit
A few worth flagging if you build something similar:
- The bot will drift toward “best practices” copy if you don’t reinforce the brand voice constantly. I include the voice section in every single brief, every time. Costs tokens. Worth it.
- Don’t let the bot write CTAs without context. Asking for CTAs in isolation produces “Shop Now” 19 times out of 20. Pair each CTA generation with the hook + body it’ll sit under.
- Reject hard. If 20 of the 25 variants are mediocre, regenerate the whole batch with stricter constraints. Don’t ship to fill a calendar slot.
The bot isn’t doing the creative work. It’s doing the typing. The creative work is in the brief, the angle picks, and the reject pile. That’s still mine.
Next post: how the Weekly Summary bot pulls from GA4 + Meta and lands a draft client report in Looker Studio before I’ve finished my coffee on Friday.