# Manage LinkedIn campaigns from your terminal.

Adwarp is an open-source MCP server and CLI that turns 1 ask, or 1 brief file, into LinkedIn campaign groups, ad groups and ads with budgets, schedules and conversions attached. Everything lands as a draft, and nothing goes live until you explicitly ask.

## What you can ask.

Real requests, answered from your terminal.

### Launch 1 ad group per persona for each competitor.

```text
> Launch 1 ad group per persona for each competitor, 50 USD a day.
adwarp.create_campaign_group 5 competitors: DRAFT
adwarp.create_campaign 35 persona ad groups, 50 USD/day: DRAFT
3 persona audiences under 300 members, skipped
35 ad groups and 35 ads drafted. 0 USD spent.
```

### Launch the campaign in this brief file.

```text
$ npx adwarp launch --brief revops-vp.json
adwarp.create_campaign_group "RevOps VP Q4": DRAFT
adwarp.create_campaign 50 USD/day, Demo booked conversion: DRAFT
adwarp.create_text_ad 3 variants: DRAFT
Created 1 campaign group, 1 ad group and 3 ads, all drafts.
Review links printed for Campaign Manager. 0 USD spent.
```

### Switch the 14 drafts live at 9am tomorrow.

```text
> Switch the 14 drafts live at 9am tomorrow.
adwarp.list_campaigns group "Q4 launch", drafts: 14 drafts
LinkedIn ads can't carry a start date of their own
One-time job set for 9:00 tomorrow. It sets all 14 to ACTIVE then, not before.
```

### Rewrite the copy on the losing ad.

```text
> Rewrite the copy on the losing ad.
adwarp.get_performance ads, last 14 days: 14 ads
LinkedIn ignores edits to a live ad's post, so new copy goes out as a new ad
adwarp.create_image_ad new copy, same image and URL: DRAFT
New draft ready. Delete the old ad once this one is live?
```

## How it works.

1. Brief. Describe the campaign in plain words or in a brief file: audience, budget, schedule, conversion and copy.
2. Draft. Adwarp creates the campaign group, the ad groups and the ads as drafts, each ad group with its own budget and audience.
3. Go live. Review it in Campaign Manager, then switch it on there or ask Adwarp to set it ACTIVE.

## Why it gets better results.

### More variants tested

Launching an ad group costs 1 line instead of 20 clicks, so more audiences and messages get tried.

### A clean read on each

Every ad group gets its own budget and audience, so each result stands on its own.

### Nothing live by accident

Everything lands as a draft, and going live is always an explicit request.

In practice: 35 ad groups and 35 draft ads from 1 brief in a single run, and 14 drafts switched live at 9am by a one-time job, since LinkedIn ads can't carry a start date of their own.

## Questions, answered.

### Can I launch many ad groups at once?

Yes. Ask for every combination of audience and message, and Adwarp drafts each one as its own ad group with its own budget. 1 brief has produced 35 ad groups in a single run.

### How do budgets and bids work?

Each ad group carries its own daily or total budget and its own bid or bidding strategy, such as Maximum Delivery or a manual bid. Change them later with update_campaign, which shows you the change before it sends it.

### Does anything go live on its own?

No. Campaign groups, ad groups and ads are created as drafts. Adwarp sets them ACTIVE only when you explicitly ask, or you switch them on in Campaign Manager.

### How do LinkedIn's names compare with other ad platforms?

They sit 1 level off, which trips up everyone the first time: a LinkedIn campaign group is what other platforms call a campaign, and a LinkedIn campaign is their ad group.

| Other platforms | LinkedIn | What it holds |
| --- | --- | --- |
| Campaign | Campaign group | Status and the total budget |
| Ad group | Campaign | Targeting, budget, bid, schedule and format |
| Ad | Creative | The ad people see |
| Audience | Matched audience | A contact or company list you upload |

### Can I schedule start dates?

Yes, on campaign groups and ad groups. Ads can't carry their own start date.

Give the campaign group or the ad group a run schedule when you create it, or change it later with update_campaign. To start ads at a set time, schedule their ad group, or have a one-time job run this command when the time comes.

```bash
npx adwarp campaigns update <campaignId> --status ACTIVE --apply
```

### Which tools and commands does it use?

11 MCP tools and 4 CLI commands, with what each one does.

| Tool | What it does |
| --- | --- |
| `create_campaign_group` | Create a campaign group, as a draft |
| `create_campaign` | Create an ad group with targeting, budget, bid and schedule, as a draft |
| `create_text_ad` | Create a text ad, as a draft |
| `create_image_ad` | Create a single-image ad, as a draft |
| `launch_from_brief` | Audience, campaign group, ad group and ads in 1 call |
| `update_campaign` | Change budget, bid, schedule, targeting, rotation or status, with a dry run first |
| `update_ad` | Pause, resume or archive a single ad, with a dry run first |
| `list_campaigns` | Campaign groups and ad groups, drafts included |
| `list_ads` | The ads in an ad group, drafts included |
| `delete_ad` | Remove an ad, for example to replace its copy |
| `list_conversions` | Pick the conversion each ad group tracks |

CLI:

```bash
npx adwarp launch --brief brief.json
npx adwarp campaigns list
npx adwarp campaigns update <campaignId> --daily-budget <amount>
npx adwarp ad list <campaignId>
```

### What are the limits?

3 things to know before you start.

- Text ads and single-image ads today.
- The format is set when the ad group is created and can't be changed after.
- LinkedIn ignores edits to a live ad's post, so copy changes go out as a new draft.

## Related

- [Audiences](https://adwarp.dev/linkedin-ads/audiences): Size before you spend
- [Optimization](https://adwarp.dev/linkedin-ads/optimization): Pause rules, pacing and lift
- [LinkedIn Ads](https://adwarp.dev/linkedin-ads): Everything it does on LinkedIn

Unofficial. Not affiliated with or endorsed by LinkedIn or Google.

Canonical page: https://adwarp.dev/linkedin-ads/campaigns
Last updated: 2026-10-18
