Stop clicking.
Start committing.

Define ad campaigns in TypeScript. Preview changes with plan. Apply with confidence.

Terminal
$ ads plan
 
+ campaign/brand-search create
+ campaign/brand-search/core-keywords create
+ campaign/brand-search/core-keywords/rsa create
~ campaign/retarget/budget $15 → $25/day
~ campaign/retarget/broad/rsa +2 headlines
- campaign/old-summer-promo delete
 
5 to create, 2 to update, 1 to delete.
Run ads apply to execute.

Three commands. Full control.

Define ad campaigns in TypeScript. Preview changes with plan. Apply them to Google Ads and Meta. Detect drift when someone edits in the UI.

01

Define

Campaigns are TypeScript. Type-safe, reviewable, version-controlled.

TypeScript
import { google, daily, exact, broad,
  headlines, descriptions, rsa, url } from '@upspawn/ads'

export default google.search('Brand - Acme', {
  budget: daily(20),
  bidding: 'maximize-clicks',
})
  .group('core-keywords', {
    keywords: [...exact('workflow automation'), ...broad('ai automation')],
    ad: rsa(
      headlines('Automate Any Workflow', 'AI-Powered', 'Free Trial'),
      descriptions('Connect 200+ apps. Ship workflows in minutes.'),
      url('https://acme.dev'),
    ),
  })
produces this ad
A
acme.dev· Sponsored
Automate Any Workflow | AI-Powered | Free Trial

Connect 200+ apps. Ship workflows in minutes.

Brand - Acme
└─ core-keywords
├─ workflow automation [exact]
├─ ai automation [broad]
└─ RSA → 3 headlines, 1 description
02

Plan

Preview every change before it touches your ad account.

Terminal
$ ads plan

+ campaign/brand-acme                    create
+ campaign/brand-acme/core-keywords      create
+ campaign/brand-acme/core-keywords/rsa  create

  3 to create. Run ads apply to execute.
03

Apply

Execute with confidence. Rollback with git revert.

Terminal
$ ads apply

✓ Created campaign/brand-acme
✓ Created campaign/brand-acme/core-keywords
✓ Created RSA ad

  3 resources created.
2
Providers
50+
Helpers
15
CLI Commands
100%
Type-Safe

Everything ads should be.

Plan / Apply

Preview every change before it goes live. Rollback with git.

Import

Pull existing campaigns into TypeScript. Zero rewrite.

Google Ads

Search campaigns without the gRPC nightmares.

Meta Ads

Facebook and Instagram campaigns that live in git.

Creatives

Images, videos, and carousels — versioned and deployed.

AI Copy Generation

Headlines, descriptions, keywords — generated in seconds.

AI Variants

One campaign, every market. Translations and ICP expansion.

Pipelines

CI/CD for ads. Deploy on merge. Test in staging.

Developer Experience

Your AI already knows TypeScript.