Up to 15 headlines per RSA ad. In seconds.

AI generates ad copy at scale — headlines, descriptions, and body text written directly into your campaign files. Optimize what's live, judge quality in CI, and ship copy you'd actually write yourself.

Terminal
$ ads generate --campaign campaigns/brand-search.ts \
    --brief "Acme: AI workflow automation for ops teams.
             Zero code. 500+ integrations. Ship in minutes." \
    --headlines 15 --descriptions 4

  Headlines (15/15):
  ✓  Automate Your Entire Workflow          28 chars · score 94
  ✓  AI Workflows, Zero Code Required       30 chars · score 91
  ✓  Connect Every Tool in Your Stack       29 chars · score 88
  ✓  From Trigger to Action in Seconds      30 chars · score 87
  … 11 more

  Descriptions (4/4):
  ✓  Acme automates the work between your tools. Triggers, logic, 500+ integrations. No code.

  Written to campaigns/brand-search.ts. Run `ads plan` to review.

Writing 15 headline variations for a single RSA ad takes 20 minutes. A typical account has dozens of ad groups. The math doesn't work.

Copy goes stale. What performed well six months ago may be missing current messaging, updated CTAs, or new product angles.

Quality is inconsistent. Some ad groups get thoughtful, tested copy. Others get placeholder text that never gets updated.

ads-as-code ships an `ads generate` command that writes RSA headlines and descriptions directly into your campaign files — in seconds, at scale.

How it works

Generate from a brief — fill an RSA ad in seconds

Pass a product brief and `ads generate` writes up to 15 headlines and 4 descriptions for any ad group in your campaign. Copy is written directly into your TypeScript campaign file, ready to review and apply.

Terminal
$ ads generate --campaign campaigns/brand-search.ts --ad-group "Core KW" \
    --brief "Acme: zero-code workflow automation. Key benefits: 500+ integrations,
             deploys in minutes. Tone: professional, outcome-focused."

  Headlines:
   1  Automate Your Entire Workflow          28 chars · score 94
   2  AI Workflows, Zero Code Required       30 chars · score 91
   3  Connect Every Tool in Your Stack       29 chars · score 88
   4  500+ Integrations, One Platform        28 chars · score 85
   5  Deploy in Minutes, Not Months          28 chars · score 80

  ✓ Written to campaigns/brand-search.ts

Optimize existing copy — score and improve what's there

`ads optimize` reads your existing headlines and descriptions, scores them against ad platform best practices, and rewrites low-scoring copy while keeping your best performers.

Terminal
$ ads optimize --campaign campaigns/retarget.ts --min-score 75

  Analyzing: retarget / Site Visitors / Trial Nudge

  ✓  Still Thinking It Over?           score 88  (keep)
  ✗  Acme Workflow Automation Tool  score 41  (rewrite)
  ✗  Click Here to Get Started        score 38  (rewrite)

  Rewrites:
  ✓  Automate Workflows — Free 14-Day Trial  score 91
  ✓  No-Code Automation for SaaS Teams       score 87

  ✓ Updated campaigns/retarget.ts  (2 headlines replaced)

Quality judging — score before you ship

`ads judge` scores your ad copy against platform best practices and your brand voice guide without rewriting anything. Use it in CI to catch weak copy before it goes live.

Terminal
$ ads judge --campaign campaigns/brand-search.ts

  brand-search / Core KW / RSA              avg score: 88  ✓
  brand-search / Competitor KW / RSA        avg score: 62  ⚠
    ✗ only 9/15 headlines filled (need ≥ 12)
    ✗ no CTA in descriptions

  1 ad group below quality threshold. Run `ads optimize` to fix.

Capabilities

Generate from briefs

Pass a product brief and get up to 15 headlines + 4 descriptions per RSA ad, written directly into your campaign files.

`ads optimize` command

Score existing copy and rewrite only the headlines and descriptions below your quality threshold.

Quality judgment

`ads judge` scores copy without rewriting. Run in CI to block low-quality ads before they go live.

Brand voice configuration

Define tone, vocabulary, and off-limits phrases in `ads.config.ts`. All AI generation respects these constraints.

Batch generation

Generate copy for every ad group in a campaign in one command. Scales from one ad to hundreds.

Works with Google + Meta

Generate RSA copy for Google Search ads and headline + body copy for Meta ads from the same brief.