# Claude Code for marketers: running paid ads from the terminal

How to set Claude Code up for LinkedIn Ads and Google Ads, and 6 workflows shown with the exact prompt and the session each one produced.

*By Stan Rymkiewicz, maintainer of adwarp. Updated November 7, 2026.*

Claude Code can do a marketer's work without the marketer writing code: it is Anthropic's agent for the terminal and the Claude desktop app, and it reads the files in a folder and runs multi-step tasks from plain English. Connected to LinkedIn Ads and Google Ads through a Model Context Protocol (MCP) server, it pulls reports, audits accounts and drafts campaigns that stay drafts or paused until you approve them.

When Claude Code launched, Anthropic's growth marketer Austin Lau had to Google how to open a terminal. A week after installing it he had a Google Ads copy workflow that exports upload-ready CSV files, and [Anthropic's write-up](https://claude.com/resources/articles/how-anthropic-uses-claude-marketing) (January 26, 2026) puts the time per ad at 30 seconds, down from 30 minutes. The CSVs still went through manual review before upload.

What follows is the setup and 6 paid ads workflows run through Adwarp, the open-source MCP server and command-line tool (CLI) for LinkedIn Ads and Google Ads that I maintain, plus a CLAUDE.md file you can copy. Every workflow comes with the exact prompt and the session it produced.

## What Claude Code does for a marketer

Anthropic's [Claude Code overview](https://code.claude.com/docs/en/overview) describes a tool that reads your codebase, edits files, runs commands and connects to your other tools, in the terminal, an IDE, the desktop app or the browser. Swap the codebase for a folder of Campaign Manager exports and briefs, and it does marketing work the same way. It reads the CSVs, and once an MCP server is connected it can call the ad platforms as well.

*Fig. 01: Of Anthropic's 3 ways in, Claude Code is the one that works inside a folder on your machine, which is where ad account work happens.*

Anthropic offers 3 ways to work with Claude, and the useful differences are where your files live and which tools Claude can reach.

|  | Claude chat | Claude Code | Cowork |
| --- | --- | --- | --- |
| Runs on | The Claude app on web, desktop and mobile | The terminal, an IDE, the desktop app's Code tab and the web | The Claude app on desktop, web and mobile, with sessions in the cloud |
| File access | Files you upload to the conversation | Every file in the folder you start it in | Local folders you connect through the desktop app |
| MCP servers | Connectors, plus local servers such as Adwarp in Claude Desktop | Any local or remote server, added with `claude mcp add` | Connectors, plus plugins with local servers through the desktop app |
| Skills | Yes | Yes, from `~/.claude/skills` or the folder's `.claude/skills` | Yes, through plugins |
| Best for | A headline, or a question about 1 export | Repeat jobs on a folder and live ad accounts, and scheduled scripts | Handing off documents and spreadsheets with no terminal |

Sources: the [Claude Code overview](https://code.claude.com/docs/en/overview), Anthropic's [Get started with Claude Cowork](https://support.claude.com/en/articles/13345190-getting-started-with-cowork) and [claude.com/pricing](https://claude.com/pricing), checked November 7, 2026.

Cowork runs on the same agent architecture as Claude Code, without the terminal. This guide uses Claude Code for paid ads, since it adds Adwarp with 1 command and reads the account folder's CLAUDE.md every time it starts.

## Set it up in 10 minutes

Setup is 5 steps. The 10 minutes assume your LinkedIn developer app already has the Advertising API approved, so request that first: step 4 can't finish without it, and [Create a LinkedIn app](https://adwarp.dev/docs/linkedin-app) lists what to ask for. Google Ads has its own setup, which takes longer and sits outside this count.

*Fig. 02: The 5 setup steps and the minutes each takes, with connecting your ad accounts as the longest at 4.*

| Step | Action | Minutes |
| --- | --- | --- |
| 1. Pick a plan | Subscribe to Pro or a higher plan | 1 |
| 2. Install Claude Code | Paste 1 command, then check `claude --version` | 2 |
| 3. Make a folder | 1 folder per ad account or client | 1 |
| 4. Connect your ad accounts | Log in to LinkedIn with `npx -y adwarp auth login`, then add the server | 4 |
| 5. Add the skills | 1 command, no restart needed | 2 |

The minutes are estimates for a first install on a machine that already has Node.js.

### Pick a plan

Claude Code comes with every paid Claude plan and not with Free. On [claude.com/pricing](https://claude.com/pricing) on November 7, 2026, Pro costs 20 USD a month billed monthly, or 17 USD a month billed annually (200 USD up front). Start there and move up only if you keep hitting the limits, which [Costs and usage limits](#costs-and-usage-limits) explains.

### Install Claude Code

Open a terminal (Terminal on macOS, PowerShell on Windows) and paste the command for your system from the [Claude Code overview](https://code.claude.com/docs/en/overview). If you've never opened one, Anthropic's [terminal guide](https://code.claude.com/docs/en/terminal-guide) shows how.

`macOS, Linux, WSL`:
```bash
curl -fsSL https://claude.ai/install.sh | bash
```

`Windows PowerShell`:
```powershell
irm https://claude.ai/install.ps1 | iex
```

The installer prints nothing while it downloads. When it finishes, open a new terminal window and run `claude --version`, and a version number means it worked. The first time you run `claude`, it asks you to log in with your Claude account.

You can also skip the terminal for day-to-day work, since the Claude desktop app includes Claude Code under its Code tab. You'll still paste a few commands in step 4.

### Make a folder for your ads work

Claude Code works inside the folder you start it in. It reads the files there as context and loads the folder's CLAUDE.md at the start of every session, so give each ad account or client its own folder. The briefs and reports stay together, and 1 client's rules never load in another client's session.

`Terminal`:
```bash
mkdir -p ~/ads/northwind/{briefs,exports,reports}
cd ~/ads/northwind
```

The folder matters for the next step as well. `claude mcp add` registers a server at local scope unless you say otherwise, and a local server loads only in the folder where you added it ([MCP docs](https://code.claude.com/docs/en/mcp)). Add `--scope user` if you want Adwarp in every folder.

*Fig. 03: Each client folder keeps its own CLAUDE.md, and Adwarp added at local scope loads only in the northwind folder unless you add it with `--scope user`.*

### Connect LinkedIn Ads and Google Ads

Adwarp runs against your own LinkedIn developer app, so the credentials stay on your machine in `~/.adwarp`. It needs Node.js 20 or newer. With the app's client ID and secret in hand, run these in your own terminal, outside Claude Code, so the secret never passes through the chat:

`Terminal`:
```bash
mkdir -p ~/.adwarp
echo '{ "clientId": "...", "clientSecret": "...", "linkedinVersion": "202605" }' > ~/.adwarp/config.json
npx -y adwarp auth login      # opens LinkedIn's sign-in in your browser
npx -y adwarp accounts list   # copy your account ID into defaultAccountId in config.json
cd ~/ads/northwind
claude mcp add adwarp -- npx -y adwarp mcp
```

Then start `claude` and ask for something that only reads. If Adwarp answers from your account and nothing changes, it works.

```text
$ claude
> List my ad accounts.
adwarp.list_ad_accounts this app  1 account
500000123  Northwind Analytics  USD
Connected. That was a read, so nothing changed.
```

Google Ads has its own [setup](https://adwarp.dev/docs/google-ads-setup): a Google Cloud project with the Google Ads API enabled, a Desktop app OAuth client, then `adwarp google auth login`. Google moved API access onto the Cloud project when it sunset developer tokens on September 9, 2026 ([Google Ads API access levels](https://developers.google.com/google-ads/api/docs/api-policy/access-levels)), and [Google Ads API access in 2026](https://adwarp.dev/blog/google-ads-api-access) walks through the new steps.

Other clients take the same server. [Claude Desktop](https://adwarp.dev/docs/clients/claude-desktop) reads it from `claude_desktop_config.json`, [Cursor](https://adwarp.dev/docs/clients/cursor) from `~/.cursor/mcp.json` or a 1-click link, and [Codex](https://adwarp.dev/docs/clients/codex) adds it with `codex mcp add adwarp -- npx -y adwarp mcp`.

Adwarp isn't the only option. Google's own [Google Ads MCP server](https://developers.google.com/google-ads/api/docs/developer-toolkit/mcp-server) covers Google Ads reporting, and since version 0.0.6 (November 2, 2026) it can also create assets and labels, though not campaigns or budgets, and Meta opened its [ads AI connectors](https://digiday.com/marketing/meta-opens-its-ad-ecosystem-to-third-party-ai-tools/) to MCP assistants such as Claude on April 29, 2026, for Facebook and Instagram ads.

### Add the paid ads skills

The 17 skills in [adwarp-dev/paid-ads-skills](https://github.com/adwarp-dev/paid-ads-skills) are MIT licensed playbooks. Each one is a procedure Claude follows, down to the thresholds and the order of the final report.

`Terminal`:
```bash
npx skills add adwarp-dev/paid-ads-skills
```

Or install them as a plugin from inside Claude Code:

`Claude Code`:
```text
/plugin marketplace add adwarp-dev/paid-ads-skills
/plugin install paid-ads-skills@adwarp
```

An open session picks the new skills up on its own. Run `/reload-skills` only if `~/.claude/skills` didn't exist when the session started ([Claude Code's skills docs](https://code.claude.com/docs/en/skills)). Every skill also runs from a CSV export with nothing connected, so you can try one on the made-up data in the repo's examples folder before you point it at a live account. The [skills docs](https://adwarp.dev/docs/skills) list all 17.

## A CLAUDE.md for a marketing team

CLAUDE.md is a plain Markdown file that Claude Code reads at the start of every session ([memory docs](https://code.claude.com/docs/en/memory)). In the account folder it holds what you'd otherwise retype every Monday: what you sell, the account IDs, how campaigns are named, the monthly caps and the house rules. Anthropic suggests keeping each file under 200 lines.

*Fig. 04: 1 file in the account folder loads into every session, so Monday's report and Friday's pause run follow the same house rules.*

Here is a full file for a made-up finance software company. Swap in your own names, IDs and numbers.

`CLAUDE.md`:
```markdown
# Paid ads: Northwind Analytics

## Product and buyers
Northwind Analytics sells month-end close software to finance teams at
companies with 201 to 5,000 employees in the US and Canada.
Buyers: controllers, finance directors and CFOs.
Main offer: a 20-minute demo. Content offer: the 5-day close guide.

## Accounts
- LinkedIn Ads account: <LINKEDIN_AD_ACCOUNT_ID>
- Google Ads customer: <GOOGLE_ADS_CUSTOMER_ID> (manager: <GOOGLE_ADS_MANAGER_ID>)
- Conversions: "Demo booked" on both platforms, "Guide download" for content
- Credentials live in ~/.adwarp. Never ask me for a token or secret,
  and never write one into a file in this folder.

## Naming
- Campaign: <Program> | <Quarter> <Year>, e.g. 5-Day Close Guide | Q4 2026
- LinkedIn ad set: <Objective> | <Audience> | <Geo> | <Program> | <Format>
  e.g. WV | Finance Dir+ 201-5k | US CA | 5-Day Close Guide | Single image
- Google ad group: <Theme> - <match types>, e.g. Close software - exact and phrase
- Ad: <Program> | <Letter> <angle>, e.g. 5-Day Close Guide | A outcome

## Monthly caps
- LinkedIn Ads: 21,000 USD
- Google Ads: 10,500 USD
- Before any budget change, run ad-budget-pacing and show the projected
  month-end spend against these caps.

## House rules
- Create LinkedIn work as DRAFT and Google work as PAUSED. Never set a
  campaign, ad set or ad ACTIVE unless I say "activate" and name it.
- LinkedIn: Audience Network off, Audience Expansion off. Rotate ads evenly
  when we are testing messages.
- LinkedIn: exclude the Customers, Employees and Competitor employees
  audiences on every ad set.
- Google: Search network only (no search partners, no Display expansion),
  people in the location only, Manual CPC until a campaign has 30
  conversions in 30 days.
- Show every change as a table before you make it, and log the reason
  with log_ad_change.
- Pause single ads by ID only, at most 5 per run, never the last active
  ad in an ad set.
- Check the account ID against this file before any write.

## Weekly report (every Monday)
Run paid-media-weekly-report for the last 7 complete days against the 7 before.
1. 1 table: spend, impressions, clicks, click-through rate, cost per click,
   conversions and cost per conversion for LinkedIn Ads, Google Ads and
   combined, each with its % change.
2. Movers: up to 3 better and 3 worse, 20% or more, on 1,000+ impressions
   and 100+ USD in both weeks.
3. Flags: spend with no conversions, tracking breaks, entities below the floors.
4. Exactly 3 actions, ranked by money at stake.
Save it as reports/YYYY-MM-DD-weekly.md. Change nothing from the report
without asking.

## Folders
- briefs/: 1 brief per launch
- exports/: CSV exports from Campaign Manager and Google Ads
- reports/: weekly reports and saved CLI output
```

The IDs are placeholders, and credentials stay out of the file because account folders get shared. Anthropic's docs also say Claude treats CLAUDE.md as context rather than enforced configuration, so read the house rules as instructions Claude usually follows. The hard stops are in Adwarp's tools and Claude Code's permissions, covered under [Guardrails](#guardrails-what-claude-code-can-and-cant-change).

## Skills, MCP servers and plugins

Most Claude Code guides use these 3 words without saying which one does what. A skill tells Claude how to do a job, an MCP server gives it access to an account, and a plugin installs both as 1 package.

*Fig. 05: A plugin bundles skills, which say how to do the job, with MCP servers, which are the only part that reaches the ad accounts.*

|  | Definition | Access | Marketing example |
| --- | --- | --- | --- |
| Skill | A `SKILL.md` file of instructions Claude loads when the job comes up, or when you type `/skill-name` | Nothing by itself. It works through the tools Claude already has | `paid-media-weekly-report`: which numbers to pull, the floors for a mover and the 3-action ending |
| MCP server | A program that gives Claude tools for 1 outside system | Whatever its tools allow, with the login you gave it | Adwarp, with tools such as `performance_summary`, `create_campaign` and `gads_launch_search_campaign` |
| Plugin | A folder of skills, agents, hooks and MCP servers that installs as 1 unit | Whatever its parts can touch | `/plugin install paid-ads-skills@adwarp` adds the 17 skills |

Sources: Anthropic's [skills docs](https://code.claude.com/docs/en/skills), [MCP docs](https://code.claude.com/docs/en/mcp) and [plugins overview](https://code.claude.com/docs/en/plugins), checked November 7, 2026.

Most of the risk sits with the MCP server. A skill with a bad threshold produces a bad report that you catch when you read it, but a server with write tools can change a live account, so read its tool list before you connect it. Adwarp lists every tool with its inputs in the [tool reference](https://adwarp.dev/docs/tools).

## 6 paid ads workflows, with the exact prompts

Each workflow below gives the prompt, the skill and tools that ran, a trimmed session and what to check before you act on the result. The sessions run on the made-up accounts in the paid-ads-skills [examples folder](https://github.com/adwarp-dev/paid-ads-skills/tree/main/examples), so no number belongs to a real advertiser, and the Salesforce session uses a sandbox org.

*Fig. 06: 2 of the 6 workflows only read, and the 4 that write stop at a draft, a paused campaign, an audience that serves nothing yet or 1 named ad.*

### Write the weekly paid report

**Prompt:** "Write the weekly paid report for Oct 12 to Oct 18 against the week before."

**Skill and tools:** [paid-media-weekly-report](https://adwarp.dev/docs/skills/paid-media-weekly-report), with `performance_summary` and `get_performance` for LinkedIn Ads and `gads_performance` for Google Ads.

```text
> Write the weekly paid report for Oct 12 to Oct 18 against the week before.
Skill: paid-media-weekly-report
adwarp.performance_summary Oct 12 to Oct 18  totals + flags
adwarp.performance_summary Oct 5 to Oct 11  totals + flags
adwarp.get_performance ad sets, Oct 5 to Oct 18  6 ad sets
adwarp.gads_performance campaigns, Oct 5 to Oct 18  4 campaigns
Spend: LinkedIn Ads $6,919 (+18.0%), Google Ads $5,025 (+10.0%)
Conversions: LinkedIn Ads 35 (-2.8%), Google Ads 59 (+22.9%)
Search - Competitor Terms: $1,050 spent, 0 conversions
Retargeting - Site Visitors: click-through rate 0.95% to 0.42% on 54,000 impressions
3 actions, ranked by money at stake. Saved reports/2026-10-19-weekly.md
```

The report has the same shape every week, so next Monday's version reads against this one line by line. A campaign only counts as a mover after a 20% change on at least 1,000 impressions and 100 USD in both weeks, and the report always ends in exactly 3 actions ranked by money at stake.

*Fig. 07: The report from the session as a page, with both platforms in 1 table and the 3 actions, ranked by money at stake, at the bottom.*

**Check before you act:** ask for explicit dates, as the prompt does, because the CLI's period presets count today and `last_7_days` would be 6 full days plus a partial one. Conversions for the last 2 days are still arriving. Read the combined column loosely too, since it adds LinkedIn's conversion count to Google's and the 2 platforms count differently.

### Tear down a competitor's LinkedIn ads

**Prompt:** "Tear down Quillmark Payables' LinkedIn ads in the US and Germany. The copy I collected is in exports/ad-collection.csv."

**Skill and tools:** [linkedin-ad-library-teardown](https://adwarp.dev/docs/skills/linkedin-ad-library-teardown), with `inspect_competitor_ads` and `get_competitor_creatives` through LinkedIn's official Ad Library API.

```text
> Tear down Quillmark Payables' LinkedIn ads in the US and Germany. The copy I collected is in exports/ad-collection.csv.
Skill: linkedin-ad-library-teardown
adwarp.inspect_competitor_ads "Quillmark Payables" + company id, US, DE  24 ads
adwarp.get_competitor_creatives 10 ad ids  10 ready
Copy for the other 14 ads from exports/ad-collection.csv
Payers: Quillmark Payables Inc. 21, Harbor Lane Media 3
Themes: faster close 7, duplicate payments 6, AI agent 5, headcount 4
Offers: demo 9, middle of the funnel 13
All 5 AI agent ads from September were gone by Oct 15
5 gaps, each with a brief. Saved reports/quillmark-teardown.md
```

The API returns metadata: format, advertiser and payer, plus first and last impression dates, an impression range and targeting for ads shown in the EU. It doesn't return ad copy. Copy comes from Adwarp's optional remote creative worker, for at most 10 ads a run, or from a sheet you fill in by hand, which is why the prompt names one.

*Fig. 08: The Ad Library API covers the advertiser and the format, so the intro text and headline come from the creative worker or a sheet you fill in.*

**Check before you act:** give the company ID along with the name, because a name search also returns unrelated advertisers. Harbor Lane Media paid for 3 of these 24 ads, so check the payer list before you treat a message as the company's own. Read run length as a hint about what works, since a long runner may also be a cheap always-on ad. Your LinkedIn app needs the Ad Library product.

### Size an audience, then draft a LinkedIn campaign

**Prompt:** "Size finance Directors and up at 201 to 5,000 employees in the US and Canada, then draft the 5-day close guide campaign from briefs/close-guide.json."

**Skills and tools:** [linkedin-audience-sizing](https://adwarp.dev/docs/skills/linkedin-audience-sizing) and [linkedin-campaign-launch](https://adwarp.dev/docs/skills/linkedin-campaign-launch), with `search_targeting`, `estimate_audience`, `create_campaign_group`, `create_campaign` and `create_image_ad`.

```text
> Size finance Directors and up at 201 to 5,000 employees in the US and Canada, then draft the 5-day close guide campaign from briefs/close-guide.json.
Skills: linkedin-audience-sizing, linkedin-campaign-launch
adwarp.search_targeting locations "Canada"  1 URN
adwarp.estimate_audience location + job function  4,350,000
adwarp.estimate_audience + seniority  505,000
adwarp.estimate_audience + company size  141,000
adwarp.estimate_audience + 2 exclusions  137,500
Competitor employees is Expired, so it can't be excluded yet
107 USD a day for 28 days: 2,996 USD of the 3,000 USD cap
> Create the drafts. I'll fix the exclusion before anything goes live.
adwarp.create_campaign_group "5-Day Close Guide | Q4 2026"  DRAFT
adwarp.create_campaign single image, 107 USD a day  DRAFT
adwarp.create_image_ad 4 ads, A to D  DRAFT
Audience Network off, Audience Expansion off, ads rotate evenly.
Nothing serves until you set it ACTIVE.
```

Sizing comes first because an estimate costs nothing. The account Adwarp was built on ran 169 audience estimates on the way to 49 account-based ad sets. Every ad set Adwarp creates lands as a draft with LinkedIn Audience Network and Audience Expansion off, and no Adwarp tool turns either back on ([Safety](https://adwarp.dev/docs/safety), and [why the Audience Network stays off](https://adwarp.dev/blog/linkedin-audience-network)).

*Fig. 09: The session's ad set as it lands: a draft at 107 USD a day with Audience Network and Audience Expansion off, plus 4 image ads that are drafts too.*

**Check before you act:** Adwarp builds single-image and text ad sets today, and video, carousel and document ads go through the skill's build sheet in Campaign Manager. Adwarp 0.5.0 added `create_post_ad`, which sponsors a post that already exists, a member's post for a thought leader ad included, and also lands as a draft. The skill passes `applyDefaultExclusions: false` and lists the account's own exclusions, so the ad set excludes exactly what the plan shows. Add the expired exclusion back and re-read the estimate before you activate anything.

### Build a Google Search campaign that starts paused

**Prompt:** "Build a Search campaign for crew scheduling software: 120 USD a day, US, demo requests, 12 USD max cost per click."

**Skill and tools:** [google-ads-search-campaign-builder](https://adwarp.dev/docs/skills/google-ads-search-campaign-builder), then `gads_launch_search_campaign`, after `gads_keyword_ideas` and `gads_list_conversion_actions`.

```text
> Build a Search campaign for crew scheduling software: 120 USD a day, US, demo requests, 12 USD max cost per click.
Skill: google-ads-search-campaign-builder
adwarp.gads_keyword_ideas seeds + landing page, US  41 ideas
adwarp.gads_list_conversion_actions this account  "Demo request"
22 ideas kept in 3 ad groups, 8 parked, 11 dropped, 30 campaign negatives
2 responsive search ads per ad group, Manual CPC, Search network only
adwarp.gads_launch_search_campaign validateOnly  valid
Google validated the whole batch. Nothing was created.
> Create it.
adwarp.gads_launch_search_campaign apply  PAUSED
Add sitelinks and callouts, then enable it in Google Ads.
```

`gads_launch_search_campaign` sends the budget, campaign, targeting, ad groups, keywords and ads as 1 atomic request, and in the session it runs twice. The first call is Google's validateOnly dry run, in which Google checks the whole batch and stores nothing. After "Create it." the campaign lands paused. No Adwarp tool can enable it, so that step happens in Google Ads. 3 house rules are fixed: Search network only, people physically in the location, and manual cost-per-click bidding to start.

*Fig. 10: Google sees the same batch twice, and nothing is stored until the call after "Create it.", which saves the campaign paused.*

**Check before you act:** keyword ideas need Basic API access or higher, because Explorer access blocks Google's keyword planning services. Read the parked and dropped keyword lists, since dropped patterns become negatives. Add the sitelinks and callouts the brief lists in Google Ads before you enable it.

### Turn a Salesforce report into a LinkedIn audience

**Prompt:** "Make a LinkedIn audience from every contact at accounts flagged as targets in Salesforce."

**Tools:** `audience_from_salesforce` with a SOQL (Salesforce Object Query Language) query, or `audience_from_hubspot` for HubSpot.

```text
> Make a LinkedIn audience from every contact at accounts flagged as targets in Salesforce.
SELECT Email FROM Contact WHERE Account.Target_List__c = true AND Email != null
adwarp.audience_from_salesforce "Q4 target accounts", the query above  1,840 emails
adwarp.get_audience_status "Q4 target accounts"  building
Matching takes up to 48 hours. A campaign needs about 300 matched members to serve.
Audience created in the sandbox account. Nothing targets it yet.
```

Adwarp reaches Salesforce through your existing `sf` CLI login and never writes to it ([Salesforce integration](https://adwarp.dev/integrations/salesforce)). HubSpot works from a list or a property filter, and its dry run shows counts and a masked sample before anything uploads:

`Terminal`:
```bash
adwarp audience from-hubspot -n "Q4 target accounts" --list 4821 --dry-run
```

**Check before you act:** LinkedIn needs about 300 matched members before a campaign can serve, and matching takes up to 48 hours. The query has to select an email column, so pass `--email-field` if yours isn't called Email. This runs on the local MCP server or the CLI only, and your LinkedIn app needs the Audiences product.

*Fig. 11: Adwarp only reads Salesforce, and once the 1,840 emails reach LinkedIn, matching takes up to 48 hours and a campaign can serve at about 300 matched members.*

### Pick which ads to pause

**Prompt:** "Which LinkedIn ads should I pause? Use the rules in pause-rules.md."

**Skill and tools:** [linkedin-ads-pause-rules](https://adwarp.dev/docs/skills/linkedin-ads-pause-rules), with `list_campaigns`, `get_performance`, `update_ad` and `log_ad_change`.

```text
> Which LinkedIn ads should I pause? Use the rules in pause-rules.md.
Skill: linkedin-ads-pause-rules
adwarp.list_campaigns active ad sets, with format  7 ad sets
adwarp.get_performance ads, Sep 21 to Oct 18  21 ads
DRY RUN, nothing has changed
Pause 5: under their format's floor on 1,500+ impressions, $1,365 spent, 1 conversion
Webinar replay is the last active ad in its ad set: replace it first
Next run: SQL to board slides, over this run's cap of 5
Not judged: 2 document ads, no floor set for that format
> Pause these 5.
adwarp.update_ad 5 ads, dryRun  5 previews
adwarp.update_ad 5 ads, PAUSED  5 paused
adwarp.log_ad_change 5 reasons, tag pause-rules  journaled
Paused 5 of 5. Each change is in the journal with its reason.
```

You agree on the rules before any numbers are read, and the skill saves them in `pause-rules.md`. The click-through rate floor depends on the ad's format and applies once an ad has 1,500 impressions: 0.29% for single image, 0.22% for carousel and 0.17% for video, each 70% of the 2025 median for that format in [ZenABM's benchmark](https://zenabm.com/blog/linkedin-ads-ctr-benchmarks) (published February 16, 2026). Thought leader ads get their own floor of 1.88%, and formats with none, such as document ads, stay out of the run until you set one. The rest of the defaults: at most 5 pauses per run, highest spend first, with the top 5 ads by conversions, ads at or under your target cost per conversion and the last active ad in each ad set all protected, because pausing that last ad stops the whole ad set. Every number can change, and [LinkedIn click-through rate benchmarks](https://adwarp.dev/blog/linkedin-ads-ctr) help you set your own. Nothing is paused until you reply with the list.

*Fig. 12: The click-through rate floors for single image, carousel and video ads, each 70% of that format's 2025 median in ZenABM's benchmark and applied from 1,500 impressions.*

**Check before you act:** LinkedIn refuses to pause an ad that is still in review. A 1:1 account-based ad may never reach 1,500 impressions, so judge those over the whole flight. Replace a paused ad with a new draft rather than editing its post.

### 1 week in a marketer's terminal

This is the week the skills were built around, with each prompt or command as you'd type it in the Northwind folder.

| When | Job | Prompt or command |
| --- | --- | --- |
| Monday, 00:05 | Save last week's LinkedIn numbers, on cron | `adwarp report summary -p last_7_days` |
| Monday, 09:00 | Weekly report | "Write the weekly paid report for last week." |
| Every weekday, 09:00 | Health check | "Anything on fire in our ads?" |
| Every weekday, 09:00 | Pacing | "Are we on pace this month?" |
| Friday | Pause rules, dry run | "Which LinkedIn ads should I pause? Dry run only." |

The [health check](https://adwarp.dev/docs/skills/paid-media-health-check) stays silent unless something is wrong, and [pacing](https://adwarp.dev/docs/skills/ad-budget-pacing) prints 1 line when spend is on track, so most mornings take a glance. On Friday, `adwarp changelog list` shows every change Adwarp made that week, with the reasons you logged.

## Run reports without opening a chat

Every Adwarp tool is also an `adwarp` command, with the same credentials and the same change journal ([CLI docs](https://adwarp.dev/docs/cli)). Pulls that need no judgment can run on a schedule with no chat at all.

*Fig. 13: Cron saves the numbers early every Monday, so the weekly report starts from files that are already in the folder.*

`Terminal`:
```bash
npm install -g adwarp
adwarp report summary -p last_7_days                # LinkedIn Ads rollup and flags
adwarp report perf campaign -p last_7_days          # every LinkedIn ad set
adwarp google report perf campaign -p last_7_days   # every Google Ads campaign
```

Adwarp has no scheduler, so save the pulls with cron. Crontab reads `%` as a new line, so it has to be written `\%`:

`crontab`:
```text
5 0 * * 1 /usr/local/bin/adwarp report summary -p last_7_days > "$HOME/ads/northwind/reports/linkedin-$(date +\%F).txt"
10 0 * * 1 /usr/local/bin/adwarp google report perf campaign -p last_7_days > "$HOME/ads/northwind/reports/google-$(date +\%F).txt"
```

Cron starts with a short PATH, so use the full path that `which adwarp` prints on your machine. The CLI presets count today, which is why the jobs run just after midnight, when today is only minutes old. The CLI also has no custom dates, so keep every week's file, because last week's file is this week's comparison. Never put `--apply` in a scheduled job.

Then point Claude at the folder: "Write the weekly paid report from this week's and last week's files in reports/." To run that on a schedule too, the Claude desktop app has scheduled tasks that run on your machine with your local files and tools ([Claude Code overview](https://code.claude.com/docs/en/overview)).

## Guardrails: what Claude Code can and can't change

Adwarp's defaults are written into its tools, so they hold even when a prompt is vague ([Safety](https://adwarp.dev/docs/safety)).

*Fig. 14: Writes from the terminal stop at a gate, landing as drafts on LinkedIn and paused on Google until you decide either should go live.*

| Action | Lands as | Switched on by |
| --- | --- | --- |
| Create a LinkedIn campaign, ad set or ad | DRAFT | You, in Campaign Manager, or Adwarp when you explicitly ask for ACTIVE |
| Create a Google Ads Search campaign | PAUSED, after Google's validateOnly dry run | You, in Google Ads. Adwarp has no tool to enable it |
| Pause, resume or archive 1 LinkedIn ad | Only the ad you name. The CLI previews until you add `--apply` | You, by naming the ad |
| Change an ad set's budget, bid or targeting | `update_campaign`, previewed with a dry run first | You, after reading the preview |
| Upload a matched audience | A list LinkedIn matches in up to 48 hours | Nothing serves until a campaign uses it |
| Any write | A line in the change journal, `~/.adwarp/changelog.jsonl` | Read it with `adwarp changelog list` |

The journal is a plain local file. On the account Adwarp was built on it holds 1,125 changes, among them 29 budget changes, 23 bid changes and 16 rotation switches, plus 36 notes typed in by hand. Each line carries a timestamp and the entity ID, so when spend jumps on a Tuesday you can see what changed on Monday.

Claude Code adds its own layer. Recent versions start interactive sessions in auto mode, where a background classifier checks each action against your request, and Manual mode asks before the first use of each tool. An explicit ask rule forces a prompt on every call in every mode ([permission modes docs](https://code.claude.com/docs/en/permission-modes)), so name the tools that change an account in the folder's settings:

`.claude/settings.json`:
```json
{
  "permissions": {
    "ask": [
      "mcp__adwarp__create_campaign",
      "mcp__adwarp__update_campaign",
      "mcp__adwarp__update_ad",
      "mcp__adwarp__gads_launch_search_campaign"
    ]
  }
}
```

*Fig. 15: With the ask rule in `.claude/settings.json`, every call to `update_ad` stops for a yes or a no, whatever mode the session runs in.*

Keep tokens out of the chat. Adwarp reads its LinkedIn and Google credentials from `~/.adwarp`, so no prompt ever needs one, and a request to paste a secret into Claude means something is set up wrong. The same goes for CLAUDE.md and skill files, which get shared.

## Costs and usage limits

The Claude plan is the only fee on top of your ad spend. Adwarp is free and MIT licensed with no account, and neither LinkedIn nor Google lists a fee for its ads API, though both need approval. LinkedIn approves the Advertising API product on your app, and Google grants access levels per Google Cloud project now that developer tokens are gone.

*Prices and limits checked on November 7, 2026, on claude.com/pricing and Anthropic's help center.*

*Fig. 16: Pro at 20 USD a month is the only paid line on the bill, and its usage resets on a 5-hour window with a weekly limit on top (claude.com/pricing, November 7, 2026).*

| Plan | Price | Claude Code | Usage |
| --- | --- | --- | --- |
| Free | 0 USD | No | Limited, every 5 hours and every week |
| Pro | 20 USD a month, or 17 USD a month billed annually | Yes | More than Free, every 5 hours and every week |
| Max | 100 USD a month | Yes | 5x Pro, every 5 hours and every week |
| Ultra | 200 USD a month | Yes | 10x Pro's weekly usage, no 5-hour limit for verified accounts |
| Team, Standard seat | 25 USD a seat a month, or 20 USD billed annually | Yes, with Cowork | More than Pro |

Source: [claude.com/pricing](https://claude.com/pricing), November 7, 2026.

Chat, the desktop app and Claude Code all draw from 1 pool, according to Anthropic's [help center](https://support.claude.com/en/articles/11145838-use-claude-code-with-your-pro-or-max-plan). Pro and Max reset on a 5-hour window with a weekly limit on top. At a limit you can wait for the reset, upgrade, or turn on usage credits, which bill at standard API rates. Run `/status` in Claude Code to see how much is left.

The same article flags 2 billing traps. If an `ANTHROPIC_API_KEY` environment variable is set on your machine, Claude Code uses that key instead of your subscription, and the work bills as API usage. And the 100 USD of monthly API credits that come with Max can't be spent in Claude Code.

The ad platforms meter API calls by operations per day. Google's Explorer access, granted by automated review in most cases, allows 2,880 operations a day against production accounts, enough for reporting and launches. Keyword ideas need Basic access at 15,000 operations a day, because Explorer blocks the keyword planning services ([Google Ads API access levels](https://developers.google.com/google-ads/api/docs/api-policy/access-levels), checked November 7, 2026).

Put it to work: [Adwarp in Claude Code](https://adwarp.dev/linkedin-ads/claude). Add Adwarp to Claude Code with 1 command and run LinkedIn Ads from your terminal, with every campaign created as a draft.

## Questions

### Can Claude Code do marketing?

Yes. It reads the files in a folder and runs multi-step tasks from plain English, so it can write a report from exports, draft ad copy to character limits and, with an MCP server such as Adwarp, work inside LinkedIn Ads and Google Ads. Anthropic's write-up from January 26, 2026 says its growth team cut Google Ads copy from 30 minutes to 30 seconds per ad.

### How do I use Claude Code for marketing?

Install it, make 1 folder per ad account or client with a CLAUDE.md that holds the account IDs, naming and house rules, and start Claude Code in that folder. Connect the systems you need as MCP servers and add skills for repeat jobs such as the weekly report. Then ask for the job in plain English.

### Can I use Claude Code for business?

Yes. Claude Code comes with every paid plan, and the Team plan for 2 to 150 people includes Claude Code and Cowork from 20 USD a seat a month billed annually, or 25 USD monthly. Enterprise is 20 USD a seat a month plus usage at API rates, with a 20-seat minimum (claude.com/pricing, November 7, 2026).

### Which AI is good for marketing, and when is Claude Code the right pick?

Any of the large assistants can write a headline. Claude Code fits when the work touches files and accounts, such as a folder of exports, a report in a fixed format every Monday or a campaign built from a brief, because everything the job needs sits in 1 folder. For a single line of copy, a chat is quicker.

### Do I need to know how to code, or to use the terminal?

You don't need to code. You paste a few commands into a terminal once, and Anthropic's terminal guide shows how to open one. After that you type in plain English, and the Claude desktop app runs Claude Code under its Code tab if you'd rather not keep a terminal open.

### Which plan do I need, Pro or Max?

Start on Pro, which costs 20 USD a month or 17 USD a month billed annually and includes Claude Code. Move to Max at 100 USD a month if you keep hitting the limits, since Max gives 5 times Pro's usage every 5 hours and every week. Prices are from claude.com/pricing on November 7, 2026.

### What's the difference between Claude Code and Cowork for marketing?

Cowork runs on the same agent as Claude Code, inside the Claude app with no terminal, and its cloud sessions keep going when your laptop is closed. Claude Code works in a folder from the terminal, an IDE or the desktop app and takes any MCP server with 1 command. For live ad accounts and scheduled scripts, Claude Code is the better fit.

### Can Claude Code change my ad account or spend money without asking?

Not with Adwarp's defaults. LinkedIn campaigns and ads are created as drafts and go live only when you explicitly ask or switch them on in Campaign Manager, and Google Ads campaigns are created paused after a validateOnly dry run, with no Adwarp tool to enable them. An ask rule in Claude Code's settings adds a prompt before every call to the tools you name.

### Which MCP servers should a marketer connect?

Connect the ones for the systems you work in every week, and read each tool list for what it can write. For paid ads, Adwarp covers LinkedIn Ads and Google Ads, reading and drafting in both, and Google's own Google Ads MCP server covers Google reporting plus assets and labels. Your CRM and analytics tools usually come next.

### Does it work with Meta Ads?

Adwarp covers LinkedIn Ads and Google Ads only. Meta opened its own ads AI connectors to MCP assistants such as Claude on April 29, 2026, according to Digiday, so connect those for Facebook and Instagram ads alongside Adwarp.

## Related

- [Claude ads skills](https://adwarp.dev/blog/claude-ads-skills): The 17 paid ads skills one by one: what each returns and the data it reads.
- [Ads MCP servers](https://adwarp.dev/blog/ads-mcp-servers): The MCP servers for LinkedIn Ads, Google Ads and Meta Ads, and what each one can write.
- [Google Ads in Claude Code](https://adwarp.dev/google-ads/claude): Add the Google Ads tools to Claude Code and build Search campaigns that start paused.

Canonical page: https://adwarp.dev/blog/claude-code-for-marketers
Last updated: 2026-11-07
