adwarp

Start with 1 prompt

Paste it into Claude Code, Codex or Cursor. Your agent installs Adwarp, walks you through your LinkedIn app and checks the connection.

setup prompt
Set up Adwarp for me. It's the open-source ad agent for LinkedIn Ads and Google Ads: https://github.com/adwarp-dev/adwarp

1. Check that Node.js 20 or newer is installed.
2. Walk me through creating my own LinkedIn developer app with the Advertising API product: https://github.com/adwarp-dev/adwarp/blob/main/docs/linkedin-app.md
3. Save the app's client ID and secret to ~/.adwarp/config.json as clientId and clientSecret.
4. Run "npx -y adwarp auth login" and wait while I approve access in my browser.
5. Add Adwarp to the AI client I'm using right now as an MCP server that runs "npx -y adwarp mcp". In Claude Code that's: claude mcp add adwarp -- npx -y adwarp mcp
6. Check the connection by listing my ad accounts, then save the one I pick as defaultAccountId in ~/.adwarp/config.json.

Don't create or change anything in my ad accounts during setup. LinkedIn campaigns start as drafts, so nothing spends until I turn it on.
adwarp
GitHub

Start with 1 prompt

Paste it into Claude Code, Codex or Cursor. Your agent installs Adwarp, walks you through your LinkedIn app and checks the connection.

setup prompt
Set up Adwarp for me. It's the open-source ad agent for LinkedIn Ads and Google Ads: https://github.com/adwarp-dev/adwarp

1. Check that Node.js 20 or newer is installed.
2. Walk me through creating my own LinkedIn developer app with the Advertising API product: https://github.com/adwarp-dev/adwarp/blob/main/docs/linkedin-app.md
3. Save the app's client ID and secret to ~/.adwarp/config.json as clientId and clientSecret.
4. Run "npx -y adwarp auth login" and wait while I approve access in my browser.
5. Add Adwarp to the AI client I'm using right now as an MCP server that runs "npx -y adwarp mcp". In Claude Code that's: claude mcp add adwarp -- npx -y adwarp mcp
6. Check the connection by listing my ad accounts, then save the one I pick as defaultAccountId in ~/.adwarp/config.json.

Don't create or change anything in my ad accounts during setup. LinkedIn campaigns start as drafts, so nothing spends until I turn it on.

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 Updated 19 min read

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 (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 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. 01Of 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
Claude chatClaude CodeCowork
Runs onThe Claude app on web, desktop and mobileThe terminal, an IDE, the desktop app's Code tab and the webThe Claude app on desktop, web and mobile, with sessions in the cloud
File accessFiles you upload to the conversationEvery file in the folder you start it inLocal folders you connect through the desktop app
MCP serversConnectors, plus local servers such as Adwarp in Claude DesktopAny local or remote server, added with claude mcp addConnectors, plus plugins with local servers through the desktop app
SkillsYesYes, from ~/.claude/skills or the folder's .claude/skillsYes, through plugins
Best forA headline, or a question about 1 exportRepeat jobs on a folder and live ad accounts, and scheduled scriptsHanding off documents and spreadsheets with no terminal

Sources: the Claude Code overview, Anthropic's Get started with Claude Cowork and 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 lists what to ask for. Google Ads has its own setup, which takes longer and sits outside this count.

Fig. 02The 5 setup steps and the minutes each takes, with connecting your ad accounts as the longest at 4.
Step, Action, Minutes
StepActionMinutes
1. Pick a planSubscribe to Pro or a higher plan1
2. Install Claude CodePaste 1 command, then check claude --version2
3. Make a folder1 folder per ad account or client1
4. Connect your ad accountsLog in to LinkedIn with npx -y adwarp auth login, then add the server4
5. Add the skills1 command, no restart needed2

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 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 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. If you've never opened one, Anthropic's terminal guide shows how.

macOS, Linux, WSL
curl -fsSL https://claude.ai/install.sh | bash
Windows 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
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). Add --scope user if you want Adwarp in every folder.

Fig. 03Each 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
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.

claude ~ northwind

$ 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: 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), and Google Ads API access in 2026 walks through the new steps.

Other clients take the same server. Claude Desktop reads it from claude_desktop_config.json, Cursor from ~/.cursor/mcp.json or a 1-click link, and 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 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 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 are MIT licensed playbooks. Each one is a procedure Claude follows, down to the thresholds and the order of the final report.

Terminal
npx skills add adwarp-dev/paid-ads-skills

Or install them as a plugin from inside Claude Code:

Claude Code
/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). 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 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). 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. 041 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
# 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.

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. 05A 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
DefinitionAccessMarketing example
SkillA SKILL.md file of instructions Claude loads when the job comes up, or when you type /skill-nameNothing by itself. It works through the tools Claude already haspaid-media-weekly-report: which numbers to pull, the floors for a mover and the 3-action ending
MCP serverA program that gives Claude tools for 1 outside systemWhatever its tools allow, with the login you gave itAdwarp, with tools such as performance_summary, create_campaign and gads_launch_search_campaign
PluginA folder of skills, agents, hooks and MCP servers that installs as 1 unitWhatever its parts can touch/plugin install paid-ads-skills@adwarp adds the 17 skills

Sources: Anthropic's skills docs, MCP docs and plugins overview, 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.

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, so no number belongs to a real advertiser, and the Salesforce session uses a sandbox org.

Fig. 062 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, with performance_summary and get_performance for LinkedIn Ads and gads_performance for Google Ads.

claude ~ weekly report

> 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. 07The 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, with inspect_competitor_ads and get_competitor_creatives through LinkedIn's official Ad Library API.

claude ~ ad library

> 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. 08The 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 and linkedin-campaign-launch, with search_targeting, estimate_audience, create_campaign_group, create_campaign and create_image_ad.

claude ~ close guide launch

> 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, and why the Audience Network stays off).

Fig. 09The 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, then gads_launch_search_campaign, after gads_keyword_ideas and gads_list_conversion_actions.

claude ~ search campaign

> 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. 10Google 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.

claude ~ salesforce audience

> 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). HubSpot works from a list or a property filter, and its dry run shows counts and a masked sample before anything uploads:

Terminal
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. 11Adwarp 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, with list_campaigns, get_performance, update_ad and log_ad_change.

claude ~ pause rules

> 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 (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 help you set your own. Nothing is paused until you reply with the list.

Fig. 12The 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.

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). Pulls that need no judgment can run on a schedule with no chat at all.

Fig. 13Cron saves the numbers early every Monday, so the weekly report starts from files that are already in the folder.
Terminal
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
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).

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).

Fig. 14Writes 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
ActionLands asSwitched on by
Create a LinkedIn campaign, ad set or adDRAFTYou, in Campaign Manager, or Adwarp when you explicitly ask for ACTIVE
Create a Google Ads Search campaignPAUSED, after Google's validateOnly dry runYou, in Google Ads. Adwarp has no tool to enable it
Pause, resume or archive 1 LinkedIn adOnly the ad you name. The CLI previews until you add --applyYou, by naming the ad
Change an ad set's budget, bid or targetingupdate_campaign, previewed with a dry run firstYou, after reading the preview
Upload a matched audienceA list LinkedIn matches in up to 48 hoursNothing serves until a campaign uses it
Any writeA line in the change journal, ~/.adwarp/changelog.jsonlRead 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), so name the tools that change an account in the folder's settings:

.claude/settings.json
{
  "permissions": {
    "ask": [
      "mcp__adwarp__create_campaign",
      "mcp__adwarp__update_campaign",
      "mcp__adwarp__update_ad",
      "mcp__adwarp__gads_launch_search_campaign"
    ]
  }
}
Fig. 15With 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. 16Pro 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
PlanPriceClaude CodeUsage
Free0 USDNoLimited, every 5 hours and every week
Pro20 USD a month, or 17 USD a month billed annuallyYesMore than Free, every 5 hours and every week
Max100 USD a monthYes5x Pro, every 5 hours and every week
Ultra200 USD a monthYes10x Pro's weekly usage, no 5-hour limit for verified accounts
Team, Standard seat25 USD a seat a month, or 20 USD billed annuallyYes, with CoworkMore than Pro

Source: claude.com/pricing, November 7, 2026.

Chat, the desktop app and Claude Code all draw from 1 pool, according to Anthropic's help center. 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, checked November 7, 2026).

Put it to work

Adwarp in Claude Code

Add Adwarp to Claude Code with 1 command and run LinkedIn Ads from your terminal, with every campaign created as a draft.

adwarp.dev/linkedin-ads/claude

By Stan Rymkiewicz, maintainer of adwarp. Published November 7, 2026.

FAQ

Questions Short answers, with sources.

Ask on GitHub
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.

How the safety model works

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.

Free and open source MIT licensed. Run it locally, self-host the endpoint, or read every line on GitHub.

$ claude mcp add adwarp -- npx -y adwarp mcp

Read the docs

GitHub