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.
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.
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, 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.
| 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 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.
curl -fsSL https://claude.ai/install.sh | bashirm https://claude.ai/install.ps1 | iexThe 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.
mkdir -p ~/ads/northwind/{briefs,exports,reports}
cd ~/ads/northwindThe 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.
--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:
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 mcpThen start claude and ask for something that only reads. If Adwarp answers from your account and nothing changes, it works.
$ 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.
npx skills add adwarp-dev/paid-ads-skillsOr install them as a plugin from inside Claude Code:
/plugin marketplace add adwarp-dev/paid-ads-skills
/plugin install paid-ads-skills@adwarpAn 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.
Here is a full file for a made-up finance software company. Swap in your own names, IDs and numbers.
# 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 outputThe 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.
| 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, 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.
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.
> 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.
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.
> 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.
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.
> 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).
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.
> 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.
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.
> 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:
adwarp audience from-hubspot -n "Q4 target accounts" --list 4821 --dry-runCheck 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.
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.
> 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.
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.
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 campaignAdwarp has no scheduler, so save the pulls with cron. Crontab reads % as a new line, so it has to be written \%:
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).
| 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), so name the tools that change an account in the folder's settings:
{
"permissions": {
"ask": [
"mcp__adwarp__create_campaign",
"mcp__adwarp__update_campaign",
"mcp__adwarp__update_ad",
"mcp__adwarp__gads_launch_search_campaign"
]
}
}.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.
| 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, 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/claudeBy Stan Rymkiewicz, maintainer of adwarp. Published November 7, 2026.