Claude skills for LinkedIn Ads and Google Ads, compared
A pick for each paid ads job across 3 free skill sets, with the install command, a sample prompt and report, and what each skill can change in your account.
A Claude skill is a folder with a SKILL.md file that teaches Claude 1 job, and you add marketing skills with 1 command, npx skills add <repo>, in Claude Code, Codex or Cursor. For paid ads, the free sets include Corey Haines' marketingskills (1 generalist ads skill), claude-ads (audits across 12 platforms that don't change the account) and paid-ads-skills (17 skills for LinkedIn Ads and Google Ads, which we maintain), and the table below says which to install for which job.
We also maintain Adwarp, the open-source Model Context Protocol (MCP) server and command-line tool (CLI) that our skills call when you want live data instead of an export. Every count below was checked on the repos on November 7, 2026, and each of our skills has its own page in the skills docs. We installed every third-party skill the skills CLI could fetch into an empty test project and read the source of the rest, and every sample output under our own skills comes from the made-up accounts in the repo's examples folder, so you can run the same prompt on the same files and compare.
Which skill for which paid ads job
Find your job in the first column. The reads or writes column says whether the skill can touch the account, which is worth knowing before you point it at a live one.
| Job | Skill | Repo | Platforms | Reads or writes | Install | License |
|---|---|---|---|---|---|---|
| Audit a LinkedIn Ads account | linkedin-ads-audit | paid-ads-skills (ours) | LinkedIn Ads | Reads | npx skills add adwarp-dev/paid-ads-skills --skill linkedin-ads-audit | MIT |
| Review LinkedIn performance | linkedin-ads-performance-review | paid-ads-skills (ours) | LinkedIn Ads | Reads | npx skills add adwarp-dev/paid-ads-skills --skill linkedin-ads-performance-review | MIT |
| Pause losing LinkedIn ads | linkedin-ads-pause-rules | paid-ads-skills (ours) | LinkedIn Ads | Writes: pauses single ads after your yes | npx skills add adwarp-dev/paid-ads-skills --skill linkedin-ads-pause-rules | MIT |
| Size a LinkedIn audience | linkedin-audience-sizing | paid-ads-skills (ours) | LinkedIn Ads | Reads | npx skills add adwarp-dev/paid-ads-skills --skill linkedin-audience-sizing | MIT |
| Launch a LinkedIn campaign | linkedin-campaign-launch | paid-ads-skills (ours) | LinkedIn Ads | Writes: drafts after your yes | npx skills add adwarp-dev/paid-ads-skills --skill linkedin-campaign-launch | MIT |
| Build 1:1 account-based ads | linkedin-abm-builder | paid-ads-skills (ours) | LinkedIn Ads | Writes: drafts after your yes | npx skills add adwarp-dev/paid-ads-skills --skill linkedin-abm-builder | MIT |
| Audit a Google Ads account | google-ads-account-audit | paid-ads-skills (ours) | Google Ads | Reads | npx skills add adwarp-dev/paid-ads-skills --skill google-ads-account-audit | MIT |
| Find negative keywords | google-ads-search-terms | paid-ads-skills (ours) | Google Ads | Reads, writes an Editor file to your disk | npx skills add adwarp-dev/paid-ads-skills --skill google-ads-search-terms | MIT |
| Build a Search campaign | google-ads-search-campaign-builder | paid-ads-skills (ours) | Google Ads | Writes: 1 paused campaign after your yes | npx skills add adwarp-dev/paid-ads-skills --skill google-ads-search-campaign-builder | MIT |
| Weekly report | paid-media-weekly-report | paid-ads-skills (ours) | Both | Reads | npx skills add adwarp-dev/paid-ads-skills --skill paid-media-weekly-report | MIT |
| Daily alarm | paid-media-health-check | paid-ads-skills (ours) | Both | Reads | npx skills add adwarp-dev/paid-ads-skills --skill paid-media-health-check | MIT |
| Monthly pacing | ad-budget-pacing | paid-ads-skills (ours) | Both | Reads | npx skills add adwarp-dev/paid-ads-skills --skill ad-budget-pacing | MIT |
| Did a change work | ad-experiment-lift | paid-ads-skills (ours) | Both | Writes to the change log only | npx skills add adwarp-dev/paid-ads-skills --skill ad-experiment-lift | MIT |
| Audit 12 platforms from exports | /ads audit | claude-ads | 12, including LinkedIn Ads and Google Ads | Reads | /plugin marketplace add agricidaniel/claude-ads, then /plugin install claude-ads@ai-marketing-hub-claude-ads | MIT |
| Plan paid campaigns on any platform | ads | marketingskills | Google, Meta, LinkedIn, X | Reads what you give it | npx skills add coreyhaines31/marketingskills --skill ads | MIT |
| Marketing performance report | performance-report | Anthropic's marketing plugin | Any channel | Reads | claude plugin marketplace add anthropics/knowledge-work-plugins, then claude plugin install marketing@knowledge-work-plugins | Apache-2.0 |
Everything in the table is free and works without an account with whoever wrote it. InsightfulPipe's Google audit, further down, is the 1 pick in this post that only runs through its maker's connector.
What a Claude skill is
A skill is a folder. The SKILL.md file inside starts with a short block of YAML frontmatter holding a name and a description, and the instructions follow. The folder can carry more files, such as reference tables or scripts, which Claude opens only when the instructions point to them.
SKILL.md name, description, then the method Claude follows
README.md what the skill does, written for people
references/ weekly-run.md, opened only for a scheduled runClaude loads skills in stages. Anthropic's Agent Skills overview puts the name and description at about 100 tokens per skill, loaded at startup, the body at under 5,000 tokens once a request matches, and bundled files at nothing until Claude reads them. Installing all 17 of ours adds about 1,700 tokens of descriptions to a session, and nothing more until 1 of them fires.
The description does the matching, so it has to say what the skill does and when to use it. Ours end with the phrases people type, such as "which LinkedIn ads should I pause" and "turn off low CTR ads". In Claude Code you can skip the matching and call a skill by name with /linkedin-ads-pause-rules.
The format is an open standard. agentskills.io says Anthropic developed it and released it openly, and the skills CLI's README lists 79 agents that read it, Claude Code, Codex, Cursor and OpenCode among them.
The line between a skill and an MCP server is easiest to see in 1 skill. linkedin-ads-pause-rules holds the method: which ads should stop, in what order, and which are protected. Adwarp, an MCP server, holds the tools, and its update_ad is the call that actually pauses an ad. Without Adwarp, the same skill reads a Campaign Manager export and hands you the list to switch off yourself. The ads MCP servers compared covers the tool side.
Anthropic's overview also warns that a skill can direct Claude to run code, and says to use skills only from sources you trust and to read every bundled file first. That matters more for paid ads than for copywriting: ivangfalco/ads-skills, listed below, ships 39 Python scripts that call the ad platforms' APIs.
How to install them
There are 3 ways in. The skills CLI is the 1 we'd start with, since the same command works for Claude Code, Codex and Cursor. Here they are for our repo:
# 1. The skills CLI: Claude Code, Codex, Cursor and 76 more agents
npx skills add adwarp-dev/paid-ads-skills
# 2. A Claude Code plugin (type these inside Claude Code)
/plugin marketplace add adwarp-dev/paid-ads-skills
/plugin install paid-ads-skills@adwarp
# 3. By hand: copy any skill folder
git clone https://github.com/adwarp-dev/paid-ads-skills
cp -r paid-ads-skills/skills/linkedin-ads-audit ~/.claude/skills/Claude Code
npx skills add adwarp-dev/paid-ads-skills asks which skills you want and which agents to install them for. It installs into the current project's .claude/skills/ unless you add -g, which puts them in ~/.claude/skills/ for every project, and --skill linkedin-ads-audit picks 1. The CLI needs Node.js 22.20 or later.
When we ran it from inside a Claude Code session, the CLI noticed it was running under an agent and skipped its questions. Add -a claude-code in that case so the files land where Claude Code reads them.
The plugin route is 2 commands typed in Claude Code: /plugin marketplace add adwarp-dev/paid-ads-skills, then /plugin install paid-ads-skills@adwarp. Plugin skills are namespaced, so you call them as /paid-ads-skills:linkedin-ads-audit. You don't need a restart. The Claude Code skills docs say a session picks up skills added under ~/.claude/skills/ as they arrive, and you only run /reload-skills if that folder didn't exist when the session started.
Codex, Cursor and other agents
The same npx skills add command detects which agents you have installed. The CLI's agent table puts Codex skills in .agents/skills/ (or ~/.agents/skills/ with -g) and Cursor skills in .agents/skills/ (or ~/.cursor/skills/). Name the agent with -a codex or -a cursor to skip the question.
Codex also has a plugin command of its own, codex plugin marketplace add owner/repo, for repos that publish a Codex marketplace file at .agents/plugins/marketplace.json (OpenAI's Codex plugin docs). marketingskills ships that file. Ours doesn't, so in Codex use the skills CLI.
claude.ai and Claude Desktop
In claude.ai you upload a skill as a zip. Zip the skill folder so the folder sits at the root of the archive, open Customize, then Skills, click "+", choose "Create skill" and then "Upload a skill". Anthropic's help center (Using Skills in Claude, checked November 7, 2026) lists Free, Pro, Max, Ultra, Team and Enterprise plans, and code execution has to be on. It describes this 1 upload flow and gives no separate steps for the Claude Desktop app.
The help center's guide to creating custom skills caps the description at 200 characters, against 1,024 in the Agent Skills format. Ours run 470 to 850, so cut the description: line to 200 before you zip, and keep the phrases you actually type. Corey Haines' repo publishes -claude-web.zip files with shortened descriptions for the same reason.
Skills don't sync between surfaces. A skill you upload to claude.ai isn't in Claude Code or the API, and Claude Code's skills live on your disk. For live data in the Claude Desktop app, Adwarp runs as a local server (Claude Desktop setup).
LinkedIn Ads skills
LinkedIn is where the published lists of marketing skills run thin. They cover it with 1 skill that also does Google, Meta and X, and the ones we read name no LinkedIn audit, audience sizing or account-based skill. 10 of our 17 skills are LinkedIn-only, and LinkedIn Ads in Claude Code covers the live setup.
paid-ads-skills (ours)
| Skill | Ask it | Output | Reads or writes |
|---|---|---|---|
linkedin-ads-audit | "Audit my LinkedIn ads account" | 28 scored checks and fixes ranked by spend at risk | Reads |
linkedin-ads-performance-review | "How are my LinkedIn ads doing?" | Scale, pause, refresh and watch lists against like-for-like peers | Reads |
linkedin-ads-spend-analysis | "Where is my LinkedIn budget going?" | Where the money goes, what returned nothing, the moves worth making | Reads, applies a move after your yes |
linkedin-ads-lead-drivers | "Which LinkedIn ads drive leads?" | Drivers, a pause list with the money each ad burned, the angles that win | Reads, pauses after your yes |
linkedin-ads-pause-rules | "Which LinkedIn ads should I pause?" | Rules you approve once, then a dry run every week | Pauses after your yes |
linkedin-audience-sizing | "How big should this audience be?" | A narrowing ladder that lands the audience in range | Reads |
linkedin-audience-ops | "Audit my matched audiences" | Audience health, clean list uploads, Salesforce and HubSpot refreshes | Uploads after a dry run and your yes |
linkedin-abm-builder | "Build 1:1 ads for these accounts" | An ad set per account: audience, 3 ads, a fixed flight | Creates drafts after your yes |
linkedin-campaign-launch | "Launch a LinkedIn campaign for this" | A confirmed brief, sized before spend | Creates drafts after your yes |
linkedin-ad-library-teardown | "What LinkedIn ads is this company running?" | Themes, offers, formats, run length and gaps | Reads public ads only |
Every card below is MIT licensed, covers LinkedIn Ads, and installs with npx skills add adwarp-dev/paid-ads-skills --skill <name>. The sessions show the prompt and a trimmed version of the report the skill writes from the made-up Northwind Analytics files.
linkedin-ads-audit
28 checks in 7 groups: tracking, structure and naming, targeting, delivery settings, bidding and budget, creative, and landing pages with their UTM tags. Each check has a pass, warn or fail rule, a LinkedIn source or a labeled default, and the exact fix. The score is weighted by spend. Adwarp can't read Audience Expansion, bids or URL parameters, so in live mode those still come from a settings sheet you fill in. Reads only. Docs.
> Audit my LinkedIn ads account. The exports are in this folder.
LinkedIn Ads audit: Northwind Analytics (made-up data)
2026-09-19 to 2026-10-18: $11,745.40 across 7 active ad sets
28 checks: 2 pass, 14 warn, 11 fail, 1 not scored. Score 80, weighted by spend
D1 fail Audience Expansion on with a matched company list
D2 fail Audience Network took $793.28 (28%) of Finance Leaders, 0 conversions
A1 fail ABM Tier 2 forecast at 240, under the 300 LinkedIn needs
Fixes ranked by spend at risk. Nothing was changed.
linkedin-ads-performance-review
Key numbers by campaign, ad set and ad, each judged against peers with the same objective and audience type, plus week over week direction and creative fatigue. It ends in scale, pause, refresh and watch lists ranked by money at stake. A floor of about 1,000 impressions or 3 results keeps a small number from driving a call. Live, it starts from Adwarp's performance_summary. Reads only. Docs.
> How are my LinkedIn ads doing?
28 days: $11,174.86 spent (-1%), 63 website conversions against 50
Cost per conversion $128.92, down 22%
Top: Ops Leaders, $157.92 per conversion, 0.78x its peers
Bottom: Finance Leaders, $336.74 per conversion, 1.67x its peers
Pause: 772003 ROI calculator, $862.06 for 0 conversions
Refresh: 771004, click-through rate down 3 weeks running
Leads 3 against 4 this week: under the floor, no call
linkedin-ads-spend-analysis
Spend by campaign, ad set and ad, how concentrated it is against results, and 1 summed figure for the spend that returned nothing, with the rule printed next to it. It also checks each ad set's pacing against its own budget. Every move comes with the exact budget or status change, and nothing moves until you confirm it, through update_campaign with a dry run first. Docs.
> Where is my LinkedIn budget going?
30 days: $21,080 for 59 website conversions and 46 leads
Top ad set 20.9% of spend; 6 of 10 ad sets make 80%
Spend with nothing back: $3,360 (15.9%)
Competitor Users | US: $2,640, 0 conversions, 8.6x the yardstick
Its 231 landing page clicks predict 10.9 conversions: check tracking first
Then pause it and move $30 a day to Ops Leaders
Each move shows the old and new value and waits for your yes.
linkedin-ads-lead-drivers
Ranks ads by what they produced against a yardstick for their peer group and lists the ones that spent with nothing back. For Lead Gen Form ads it compares form opens and completion rates, which tells an ad problem from a form problem. Then it scores hooks, offers and formats head to head inside the same ad set. Pauses run only on the list you confirm. Docs.
> Which LinkedIn ads drive leads?
46 leads at $77.39, 59 conversions at $266.78
2 drivers made 80% of leads on 63% of lead spend
Pause list: 2 ads, $1,420 spent, $1,110 burned
Forms complete at 13.3% to 14.3% on every ad, so the ad sets the cost
Proof hooks won in 4 ad sets and lost in 0
Reply "pause these 2" to apply. Nothing is paused until you do.
linkedin-ads-pause-rules
You approve the rules once and they're saved to pause-rules.md. The defaults are a click-through rate floor per format once an ad has 1,500 impressions in 30 days: single image 0.29%, carousel 0.22%, video 0.17% and thought leader 1.88%, each 70% of ZenABM's median for that format (161,256 ads, updated February 16, 2026). Other formats get no floor until you set one. A run pauses at most 5 ads, highest spend first, and the top 5 ads by conversions and any ad at or under your target cost per conversion are protected. The last active ad in an ad set is never paused, since that would stop the whole ad set. Approving the rules once doesn't approve any run, so each week's list needs its own yes. Docs.
> Run my pause rules.
DRY RUN, nothing has changed
Floors after 1,500 impressions: single image 0.29%, carousel 0.22%, video 0.17%
21 ads read: 5 to pause, 1 to replace first, 1 for next run
Pause list: 5 ads, $1,365 spent, 1 conversion
Reply "pause these 5" to apply.
> pause these 5
adwarp.update_ad 5 ads, dryRun: true: 5 previews
adwarp.update_ad 5 ads, status: PAUSED: PAUSED
adwarp.log_ad_change tags: pause-rules: 5 entries
Paused 5 of 5. Next run: recheck 100000303, replace 100000501 first.
linkedin-audience-sizing
Walks a narrowing ladder: job function, then seniority, then industry, company size and region, and job titles only when needed. It records the estimate after each step and lands the audience in a range for its goal, 400 to 1,000 members for a 1:1 account-based ad set by default. When a step drops under the 300 members LinkedIn needs to serve, it widens. Live, every step is an estimate_audience call. Reads only. Docs.
> Size a 1:1 audience for Halvorsen Logistics.
adwarp.estimate_audience Norway or US, company: 6,800
adwarp.estimate_audience + 4 job functions: 2,450
adwarp.estimate_audience + VP or CXO: 260
260 is under the 300 LinkedIn needs to serve. Widening seniority.
adwarp.estimate_audience + Director: 610
610 members, inside the 400 to 1,000 range
$600 a month buys 11.6 impressions per member: expect fast fatigue
linkedin-audience-ops
Lists every matched audience and flags the ones stuck building, under 300, expired, stale or unused, checking exclusion lists first because a stale customer list shows prospecting ads to customers. It cleans uploads down to LinkedIn's template columns with emails hashed. Nothing uploads until you've seen the dry run and said yes to the file, row count, audience name and ad account. Salesforce and HubSpot refreshes work the same way. Docs.
> Audit my matched audiences, then clean contacts-raw.csv for upload.
10 audiences, 3 exclusion lists, 6 in live ad sets
Customers - all contacts: exclusion 112 days old, on 3 active ad sets
Webinar registrants Sept: Building for 120 hours, past LinkedIn's 48
Dry run: 653 rows in, 608 kept, 45 dropped
Upload 608 rows as a contact list named "Finance contacts Oct 2026"
to ad account 500000123? Reply yes to upload.
linkedin-abm-builder
Turns a target account list into 1:1 ad sets: company targeting plus the buying group's job functions and seniorities, 3 ads with different angles, a fixed flight, a budget and a landing page. Accounts too small to serve are grouped into a cluster or marked outbound only, and sales gets a coverage CSV. After you confirm the plan, Adwarp creates the campaign, ad sets and ads as LinkedIn drafts. Docs.
> Build 1:1 ads for the accounts in accounts.csv.
13 accounts: 10 1:1 ad sets, 1 cluster of 2, 1 outbound only
Flight Nov 2 to Nov 15: 2,142 USD against a 2,500 USD cap
33 ads, 3 angles each. Audience Expansion and Audience Network off
Create 1 campaign, 11 ad sets and 33 ads as LinkedIn drafts? Reply yes.
> yes
adwarp.create_campaign_group ABM Q4 2026: DRAFT
adwarp.create_campaign 11 ad sets: DRAFT
adwarp.create_image_ad 33 ads: DRAFT
Coverage CSV for sales: 13 accounts
linkedin-campaign-launch
Starts from a plain request, like the guide launch below, and fills in a complete brief. It estimates the audience before anything exists and applies safe settings: Audience Expansion and the LinkedIn Audience Network off, your standing exclusions, a conversion attached, and the ad format set at creation because LinkedIn can't change it later. You confirm the plan and it creates drafts. Without Adwarp it writes a build sheet for Campaign Manager. Docs.
> Launch a LinkedIn campaign for the 5-day close guide.
Website visits, single image, Nov 3 to Nov 30
Audience 137,500 after 2 of 3 exclusions
107 USD a day, 2,996 USD for the flight (cap 3,000)
Audience Expansion off, Audience Network off, Guide download attached
Competitor employees is Expired: re-upload it before creating
Creation waits for that list, then 1 campaign, 1 ad set and 4 ads as drafts.
linkedin-ad-library-teardown
Reads a company's ads in LinkedIn's public Ad Library, collected by hand or through Adwarp's use of LinkedIn's official Ad Library API, and works out themes, offers, formats, launch cadence, run length and the gaps you can use. It compares up to 3 companies side by side. No scraping, and no ad account access. Docs.
> What LinkedIn ads is Quillmark Payables running?
24 ads collected 2026-10-15, United States and Germany
Themes: faster close 29%, duplicate payments 25%, AI agent 21%
Offers: middle of the funnel 54%, demo 38%, no pricing or trial
Formats: single image 58%, video 17%, document 17%, carousel 8%
Gap: nobody talks to IT and ERP owners since their 2 ERP ads ended
Other LinkedIn Ads skills
We installed each of these with the skills CLI into the same empty project. 3 of them are named linkedin-ads, and each install replaced the folder the one before had written, so put them in separate projects if you want to compare them.
| Skill | Repo | Coverage | Reads or writes | License |
|---|---|---|---|---|
ads-linkedin | claude-ads | An audit of measurement, the Insight Tag, audiences, Lead Gen Forms, account-based campaigns, creative, bidding and pacing, from exports | Reads. Account changes are switched off for LinkedIn Ads in its capability manifest | MIT |
ads | marketingskills | Strategy, targeting, bidding and optimization for Google, Meta, LinkedIn and X in 1 file. It ends every recommendation with facts, hypotheses and missing data | Reads what you give it | MIT |
linkedin-ads | kostja94/marketing-skills | Setup, targeting and optimization guidance with links to LinkedIn's help pages, 1 of 172 skills in the repo | Reads what you give it | MIT |
linkedin-ads | Cold-IQ/ColdIQ-s-GTM-Skills | A strategist that routes to 9 sub-skills, from audiences to bidding, and points you to ColdIQ's own MCP server to build lists | Reads what you give it | No license file |
linkedin-ads | ivangfalco/ads-skills | Strategy files plus Python scripts that call the LinkedIn, Meta and Google Ads APIs, including campaign creation and updates | Writes through its scripts. Its CLAUDE.md says to start campaigns paused | MIT with the Commons Clause, which bars selling it |
npx skills add AgriciDaniel/claude-ads --skill ads-linkedin -a claude-code
npx skills add coreyhaines31/marketingskills --skill ads -a claude-code
npx skills add kostja94/marketing-skills --skill linkedin-ads -a claude-code
npx skills add Cold-IQ/ColdIQ-s-GTM-Skills --skill linkedin-ads -a claude-code
npx skills add ivangfalco/ads-skills --skill linkedin-ads -a claude-codeclaude-ads recommends its plugin over the CLI, because its skills lean on a Python core for scoring. ivangfalco's README says to clone the whole repo and open Claude Code in it, since the shared strategy files and the .env for API keys sit at the repo root.
Google Ads skills
Google Ads has more skills to choose from than LinkedIn Ads, and most of them are audits. They differ mostly in where the data comes from and whether the skill can write.
paid-ads-skills (ours)
All 3 are MIT licensed, cover Google Ads, and install with npx skills add adwarp-dev/paid-ads-skills --skill <name>. The sample data is a made-up crew scheduling company, Fernhill.
google-ads-account-audit
50 read-only checks across conversion tracking, auto-tagging, campaign settings, structure, keywords, search terms, negatives, responsive search ads, assets, Performance Max, AI Max, auto-applied recommendations and change history. Each check has a Google Ads Query Language (GAQL) query, a pass, warn or fail rule and a source. Tracking runs first: when it fails, every check that compares cost per conversion is marked unreliable. The report ends in fixes ranked by spend at risk. The full sample is in the last section. Docs.
> Audit my Google Ads account. Target CPA $150.
Score 50: 6 pass, 18 warn, 6 fail, 19 not checked, 1 n/a
Spend at risk: $5,366.19 of $19,280.00 (27.8%)
Measurement first: 135 conversions reported, 88 are demo requests
1. Fix conversion counting (C4, C3, C5)
2. Pause or rebuild Search - Competitors: $1,790.00, 0 conversions
3. Turn off search partners and add the negatives from search terms
google-ads-search-campaign-builder
Takes a product, landing page, location, language and daily budget, and returns a Search campaign brief: keyword research, tight ad groups, a match type plan, starter negatives, responsive search ads checked against Google's character limits, and settings (Search network only, presence targeting, manual bids until about 30 conversions in 30 days). Live, gads_launch_search_campaign runs with validateOnly: true first, so Google checks the whole request and stores nothing. The campaign is created paused, only after your yes. Docs.
> Build a search campaign for our crew scheduling software, $120 a day.
41 ideas from Keyword Planner: 22 in the brief, 8 parked, 11 dropped
3 ad groups at about 5 clicks a day each, Google Search only
adwarp.gads_launch_search_campaign validateOnly: true: valid
Create this campaign, paused, in account 123-456-7890?
> yes
adwarp.gads_launch_search_campaign validateOnly: false: PAUSED
Created paused. Enabling it is your step in Google Ads.
google-ads-search-terms
Finds search terms that spend without converting, irrelevant intent and single words that waste money across many terms. It proposes negatives with a match type and a level, drops any negative that would block 1 of your keywords, and lists converting terms worth adding. Adwarp has no tool to add negatives to an existing campaign, so the skill writes a Google Ads Editor file and a paste list, and you review and post them. Docs.
> Where is my search budget leaking?
$17,844.10 across 51 search terms, 108 conversions
Waste: $2,895.20 (16.2%) on terms with 0 conversions
jobs: 6 terms, $1,331.60, 0 conversions, broad negative
Dropped technician: it would block technician scheduling software
Wrote the Editor CSV and a paste list for Universal negatives
Adwarp can't add negatives to existing campaigns. Import them in Editor.
Other Google Ads skills
- claude-ads,
/ads audit google. Theads-googleskill covers measurement, Search, Shopping, Performance Max, Demand Gen, keywords and search terms, negatives, assets, bidding, budgets and policy, from exports. It calls itself read-only, and account changes are switched off for Google Ads in its manifest. MIT. - Ryze's Google Ads skills. irinabuht12-oss/marketing-skills, "built by Ryze AI", holds 49 skills, most for Google Ads or Meta Ads, including
google-ads-audit,search-term-miningandquality-score-breakdown. They run on pasted exports or through Ryze's hosted connector, which its README says has approval-gated writes. Install withclaude plugin marketplace add irinabuht12-oss/marketing-skills, thenclaude plugin install marketing-skills@ryze. The skills CLI found only 1 skill in this repo when we tried it, so use the plugin. No license file. - InsightfulPipe's Google Ads Account Audit. A download from its skill page that reads a live account through InsightfulPipe's MCP server, grades it out of 100 across 8 areas and ranks the top 5 fixes by monthly dollar impact. It can add negative keywords, sitelinks and callouts after you approve the exact change, and never touches budgets or bids. No license or price stated. We didn't install it, because it needs their connector.
- Anthropic's
performance-report. Part of the marketing plugin in anthropics/knowledge-work-plugins. It writes a channel report, paid search and social included, from a connected analytics tool such as Supermetrics or from data you paste. It doesn't connect to Google Ads itself. Apache-2.0.
Skills for both platforms
These 4 read LinkedIn Ads and Google Ads together, and work with just 1 if that's all you run. 3 of them are built to run on a schedule, and the 2 daily ones print a single line on a normal day.
Each is MIT licensed and installs with npx skills add adwarp-dev/paid-ads-skills --skill <name>.
paid-media-weekly-report
A fixed format: the last 7 days against the 7 before, per platform and combined, then movers, launches and endings, flags and exactly 3 actions. A mover has to clear 1,000 impressions and 100 USD of spend in both weeks, and 5 conversions a week before cost per conversion counts. The actions are proposals, and a scheduled run never acts on them. Reads only. Docs.
> Write the weekly paid report.
Oct 12 to Oct 18, 2026, against Oct 5 to Oct 11
LinkedIn Ads: $6,919 (+18.0%), 35 conversions (-2.8%)
Google Ads: $5,025 (+10.0%), 59 conversions (+22.9%)
Better: Search - Scheduling Software, $87.50 to $62.43 per conversion
Worse: Retargeting - Site Visitors, click-through rate 0.95% to 0.42%
Action 1: pause Search - Competitor Terms, $1,050 and 0 conversions
paid-media-health-check
9 checks on yesterday against recent baselines: tracking breaks, active campaigns with no delivery, spend spikes, cost per conversion jumps, spend with nothing back, click-through rate collapses, stuck or too-small LinkedIn audiences, disapproved Google ads, and campaigns limited by budget while on target. Volume floors keep chance swings from firing. When all is clear it prints 1 line. Reads only. Docs.
> Anything on fire in our ads?
Data through Oct 14: 8 alerts, about $1,354 a day at stake
1. LinkedIn, RevOps Leaders - Demo: SPEND SPIKE, $650, 2.4x normal
2. Google, Search - Generic Analytics: TRACKING BREAK, 0 conversions in 2 days
3. LinkedIn, Data Leaders - Demo: cost per conversion 3.6x its baseline
5 more below, each with its fix. A normal morning is 1 line.
ad-experiment-lift
Logs the hypothesis before the change: what changes, why, the metric, the expected effect and the read window. Then it reads before and after on equal windows with data floors, a placebo check on an earlier window, a control and the confounds written out, and returns worked, didn't work or inconclusive. It writes only to the change log, after you see the entry. Docs.
> Read the tests in ad-change-log.csv.
3 tests: 1 worked, 1 didn't work, 1 inconclusive
Test 1, outcome-led ads: 14 days before, 14 days after
Cost per conversion $168.52 to $131.76 (-21.8%)
Placebo -0.4%, control +4.6%, net lift -25.2%
WORKED: beat the 15% expected. Conversion rate held (z = -0.2)
ad-budget-pacing
Spend to date plus the last 7 days' daily average times the days left, against a monthly cap per platform and combined. It alerts above 105% or below 85% of a cap by default, with the daily budget change that would land on it. Before it suggests a raise, it checks whether budget is what's holding spend back. Reads only. Docs.
> Are we on pace this month?
LinkedIn Ads: OVER. $22,304 projected against $21,000 (106.2%)
Landing on the cap takes $693 a day, $93 less than now
Google Ads: UNDER. $8,598 projected against $10,500 (81.9%)
Budgets aren't the limit: campaigns spent 66% of them
Combined: on track, $30,902 of $31,500 (98.1%)
Nothing has changed. Reply with the budgets you approve.
claude-ads puts most of this into 1 skill, /ads monitor, which checks pacing, delivery, tracking, fatigue, policy and data quality across its 12 platforms. It wants 2 or more saved snapshots of the account, returns observations with a confidence level and likely causes, and doesn't change anything. Ours split that ground into 4 skills, so each can run on its own schedule.
General marketing skill libraries
If you came here for marketing skills in general, these are the big libraries. Each has 1 or 2 skills that touch paid ads.
- marketingskills by Corey Haines: 53 skills, MIT, 59,050 GitHub stars on November 7, 2026. For paid ads it has
adsfor campaign strategy andad-creativefor headlines and ad variations at volume.npx skills add coreyhaines31/marketingskillsinstalls the set. - Anthropic's marketing plugin in anthropics/knowledge-work-plugins: 8 skills under Apache-2.0, from
brand-reviewtoseo-audit.performance-reportandcampaign-planare the 2 that touch paid media, and the plugin comes with connector settings for tools such as HubSpot, Ahrefs and Supermetrics. - marketing-skills.com: Corey Haines' directory of the same 53 skills, sorted into 8 disciplines with 6 under Ads. Each page gives the
npx skills add coreyhaines31/marketingskills --skill <name>line for that skill.
Which skills can change your ad account
Most of these skills only read. When one writes, a tool does the writing, so the tool's rules decide what a change looks like when it lands.
| Skill | Reads or writes | Changes | Lands as | The confirm step |
|---|---|---|---|---|
linkedin-ads-pause-rules | Writes | The status of single ads, only to paused | LinkedIn, through Adwarp's update_ad, logged in the change journal | You confirm that run's exact list. Rules or a schedule never count |
linkedin-ads-lead-drivers | Writes | Pauses the ads on the confirmed list. Replacement ads only as drafts | LinkedIn, through Adwarp | The exact pause list, in the same session |
linkedin-ads-spend-analysis | Writes | Ad set budgets and status, single ad pauses | LinkedIn, through update_campaign or update_ad with a dry run first | Each move, by entity, field, old value and new value |
linkedin-audience-ops | Writes | Uploads a contact or company list | LinkedIn matched audiences | File, row count, audience name and ad account, after a dry run |
linkedin-campaign-launch, linkedin-abm-builder | Writes | 1 campaign, its ad sets and its ads | LinkedIn, as drafts | The exact plan. Any change to it means showing it again |
google-ads-search-campaign-builder | Writes | 1 Search campaign with budget, ad groups, keywords and ads | Google Ads, paused, after a validateOnly dry run | "Create this campaign, paused, in account <id>?" |
ad-experiment-lift | Writes to the log | A hypothesis entry | The change journal or a CSV, never the ad account | You see the entry before it's written |
google-ads-search-terms | Writes a file | Nothing in the account | A Google Ads Editor CSV on your disk | You review and post it in Editor |
| Our other 8 | Reads | Nothing on their own | Proposals in the report | Anything you ask for is shown first, with a dry run |
| claude-ads | Reads | Nothing. Account changes are switched off for LinkedIn Ads and Google Ads | Draft proposals in the report | A 6-step approval gate, not yet enabled |
| Ryze's skills | Reads | Nothing by themselves | Ryze's hosted connector, if you connect it | Ryze's approval step |
| InsightfulPipe's audit | Writes | Negative keywords, sitelinks, callouts | Google Ads, through InsightfulPipe's MCP server | You approve the exact change |
ivangfalco's linkedin-ads | Writes | Campaigns, budgets, bids and statuses | LinkedIn Ads, Meta and Google Ads APIs, through Python scripts | Its CLAUDE.md: start campaigns paused, never enable spend without confirmation |
marketingskills ads, kostja94 and ColdIQ linkedin-ads, Anthropic's performance-report | Reads | Nothing | Advice or a report | None needed |
Our skills change an account only through Adwarp, and only after you confirm the exact change in the same session. LinkedIn campaigns and ads are created as drafts and go live only when you ask for ACTIVE or switch them on in Campaign Manager, and every ad set Adwarp creates has Audience Expansion and the Audience Network off. A single ad pauses or resumes only when it's named. Google campaigns are created paused after a validateOnly dry run, and Adwarp has no tool that enables a Google campaign. Every change goes to the change journal, and Safety has the full rules.
Run a skill on an export or on live data
Every skill in our set runs both ways, and google-ads-account-audit shows the difference best, because some of its checks can only be made on a live account.
From exports, download the reports the skill names (campaigns, campaigns by network, keywords, search terms, ads, the conversions summary, change history and a Google Ads Editor export), put the CSVs in a folder and start Claude Code there. Nothing connects to the account. Auto-tagging, enhanced conversions, Consent Mode, auto-apply and AI Max never appear in a report, so those checks come back "not checked" unless you add screenshots of the settings pages.
$ ls
ads.csv campaigns.csv campaigns-by-network.csv change-history.csv conversions.csv
editor-ads.csv editor-campaigns.csv keywords.csv search-terms.csv
$ claude
> Audit my Google Ads account from these exports. Target CPA $150, brand term fernhill.
Export mode: 9 files, 2026-09-21 to 2026-10-20, 4 Search campaigns and 1 Performance Max
19 checks not checked: settings no export carries
Auto-tagging, enhanced conversions, Consent Mode, AI Max: add screenshots
9 fixes ranked by spend at risk, 3 to do first
Live, add Adwarp with claude mcp add adwarp -- npx -y adwarp mcp (install) and finish the Google Ads setup, or follow Google Ads in Claude Code. The skill runs about 30 GAQL queries from its reference file through gads_search, which only takes SELECT queries. Google's Google Ads MCP server works for the same reads through its search tool. Its README also lists write tools for assets and labels, which you can switch off in tools_config.yaml for a read-only setup.
$ claude mcp add adwarp -- npx -y adwarp mcp
$ claude
> Audit my Google Ads account for the last 30 days. Target CPA $150.
adwarp.gads_list_accounts : 1 account
adwarp.gads_search Q01 FROM customer: 1 row
adwarp.gads_search Q02 FROM conversion_action: 5 rows
adwarp.gads_search Q04 FROM campaign: 5 rows
adwarp.gads_search Q11 FROM search_term_view: 30 days
The rest of the catalog runs the same way, read-only.
Auto-tagging and conversion tracking now come from the account
Consent Mode still needs a screenshot: the API has no field for it
Here is the full report the skill writes from the export files, so you can see the whole format before you run it.
Full sample report: google-ads-account-audit on the made-up Fernhill exportsShow
# Google Ads audit: Fernhill (made-up account)
Window: 2026-09-21 to 2026-10-20 | Currency: USD | Target CPA: $150.00 (user target)
Data: Export mode: campaigns, network split, Editor campaign rows, keywords, search terms, ads, Editor ad rows, conversions summary, change history | Campaigns in scope: 4 Search, 1 Performance Max | Out of scope: none
## Scorecard
| Area | Pass | Warn | Fail | Not checked | Score |
| --- | --- | --- | --- | --- | --- |
| Conversion tracking | 2 | 3 | 0 | 3 (+1 n/a) | 70 |
| Campaign settings | 2 | 3 | 3 | 1 | 44 |
| Structure | 1 | 0 | 0 | 1 | 100 |
| Keywords | 0 | 4 | 1 | 0 | 40 |
| Search terms | 1 | 2 | 1 | 0 | 50 |
| Negatives | 0 | 0 | 0 | 4 | not scored |
| Responsive search ads | 0 | 4 | 1 | 0 | 40 |
| Assets | 0 | 0 | 0 | 2 | not scored |
| Performance Max | 0 | 0 | 0 | 4 | not scored |
| AI Max | 0 | 0 | 0 | 3 | not scored |
| Recommendations and history | 0 | 2 | 0 | 1 | 50 |
| Overall | 6 | 18 | 6 | 19 (+1 n/a) | 50 |
Defaults used: waste = 0 conversions and cost above 2x target CPA ($300); network and match type CPA flags at 1.5x; budget-limited at 10% lost IS (budget); top keywords = 80% of keyword spend (6 keywords); visible search terms at 70%; change churn above 3 changes in 14 days. Scoring: (passes + 0.5 x warns) / scored checks.
Spend at risk in the window: $5,366.19 (27.8% of $19,280.00 total cost), counting each campaign, keyword and search term once.
Measurement first: reported conversions are 135, so reported CPA is $142.81. Counting only "Demo request (Google tag)" (88), CPA is $219.09, above the $150.00 target. Search - Crew Scheduling (Target CPA) and PMax - All Products (Maximize conversions) bid on the inflated count ($11,040.00 of spend).
## Fixes ranked by spend at risk
| # | Check | Finding | Spend at risk | Fix |
| --- | --- | --- | --- | --- |
| 1 | C4 Double counting | 2 primary "Submit lead form" actions both record conversions: "Demo request (Google tag)" (88) and "GA4 generate_lead" (31) | Blocks bidding ($11,040.00) | Goals > Conversions > Summary: set "GA4 generate_lead" to Secondary, keep "Demo request (Google tag)" as the primary lead action |
| 2 | C3 Micro action as primary | "Calendly link click" (Outbound click, 16 conversions) is primary | Blocks bidding ($11,040.00) | Set "Calendly link click" to Secondary in Action optimization |
| 3 | C5 Counting | "Demo request (Google tag)" (Submit lead form) counts every conversion | Blocks bidding ($11,040.00) | Edit "Demo request (Google tag)" > Count > One |
| 4 | S9 Spends without converting | Search - Competitors: $1,790.00, 350 clicks, 0 conversions. Its 2 broad keywords (K5, S6) and partner traffic (S1) are inside this figure | $1,790.00 | Pause the campaign, or rebuild it with exact competitor + alternative terms, its own landing page and a CPA cap |
| 5 | Q1 Wasted search terms | 5 terms outside Search - Competitors, 0 conversions, each over $300: "crew scheduling jobs" $420.00, "airline crew scheduling" $330.00, "field service technician jobs" $380.00, "truck dispatch software" $470.00, "free scheduling app" $380.00 | $1,980.00 | Run google-ads-search-terms for the negative list and the Editor upload file |
| 6 | S1 Search partners | Search - Crew Scheduling: partners $860.00, 2 conversions (CPA $430.00) against Google Search CPA $133.04 | $593.91 | Campaign settings > Networks on Search - Crew Scheduling: untick Google search partners |
| 7 | S1 Search partners | Search - Field Service: partners $620.00, 1 conversion (CPA $620.00) against Google Search CPA $181.72 | $438.28 | Campaign settings > Networks on Search - Field Service: untick Google search partners |
| 8 | K1 Broad match CPA | Broad keywords in Search - Field Service: $3,064.00, 11 conversions (CPA $278.55) on Manual CPC. Excess over target $1,414.00, minus $850.00 already counted in Q1 | $564.00 | Change "dispatch software" and "scheduling software" to phrase, or move the campaign to Smart Bidding once tracking is fixed (S6) |
| 9 | R5 Disapproved ad | Search - Field Service > Dispatch software - broad: 1 RSA disapproved | Lost reach, no figure | Ads > Status > policy details: remove "#1", "Best ... Ever" and "Guaranteed" claims, then resubmit |
## Upside
| Check | Finding | Estimate | Action |
| --- | --- | --- | --- |
| S7 | Search - Crew Scheduling lost 21.00% of impressions to budget at CPA $143.85 | About 28.4 more conversions a month (52 x 21.00% / 38.50%), a rough estimate. At the demo-request-only CPA ($219.09) this campaign may not be on target: fix C4 first | Move budget from Search - Competitors after the tracking fix confirms the CPA |
| Q4 | "crew scheduling softwares" 2 conversions at $135.00 (close variant of a keyword, optional); "crew scheduling for construction" 3 conversions at $96.67; "crew scheduling app pricing" 2 conversions at $75.00; "field service software for small business" 3 conversions at $120.00; "dispatch software for hvac" 2 conversions at $105.00 | Converting terms that aren't keywords | Add as exact keywords in the ad groups that served them |
## Warnings without a dollar figure
- S2: Search - Crew Scheduling: Display $500.00, 4 conversions (CPA $125.00) against Google Search CPA $133.04.
- S3: Search - Crew Scheduling, Search - Field Service, PMax - All Products use presence or interest ($16,930.00 of spend). Leakage isn't in these exports; connected mode measures it with user_location_view.
- K2: "dispatch software" (broad, $2,274.00, QS 5): expected CTR below average; "crew scheduling app" (phrase, $1,950.00, QS 5): expected CTR below average; "crew scheduling" (phrase, $1,780.00, QS 4): expected CTR and ad relevance below average; "jobber alternative" (broad, $930.00, QS 4): expected CTR and landing page experience below average.
- K3: "crew roster software" (Low search volume); "technician scheduling software" (Low search volume); "field service app" (Below first page bid).
- K4: "crew scheduling app" (phrase match) in Crew scheduling - phrase and Crew app - phrase.
- Q3: Exact $2,425.00 / 42 = $57.74; close variants and broad $4,240.00 / 11 = $385.45.
- R1: Search - Crew Scheduling > Crew scheduling - phrase: 1 enabled RSA; Search - Crew Scheduling > Crew app - phrase: 1 enabled RSA; Search - Field Service > Dispatch software - broad: 1 enabled RSA; Search - Competitors > Competitors: 1 enabled RSA.
- R2: Crew scheduling - exact: Average ($970.00); Crew scheduling - phrase: Poor ($4,240.00); Crew app - phrase: Average ($160.00); Dispatch software - broad: Average ($3,064.00); Competitors: Poor ($1,790.00).
- R3: Crew scheduling - phrase: 6 headlines, 2 descriptions; Crew app - phrase: 8 headlines, 2 descriptions; Dispatch software - broad: 8 headlines, 2 descriptions; Competitors: 5 headlines, 2 descriptions.
- R4: Crew scheduling - phrase: 3 of 6 headlines pinned, positions 1, 2, 3 each hold 1 headline.
- H2: Oct 18, 2026: Keyword added: scheduling software (Broad match) (Search - Field Service); Oct 2, 2026: Networks: Google search partners turned on (Search - Competitors).
- H3: Search - Crew Scheduling: 5 target or budget changes since 2026-10-07 (Target CPA $150.00 to $135.00; Target CPA $160.00 to $150.00; Budget $200.00 to $250.00; Target CPA $140.00 to $160.00; Target CPA $120.00 to $140.00).
## Passed
C1 (5 conversion actions, 3 primary); C2 (3 of 3 primary actions recording conversions); S5 (Search - Crew Scheduling: Target CPA on 52 conversions in 30 days. Info: Search - Brand (Manual CPC, 31 conversions), Search - Field Service (Manual CPC, 30 conversions) could test Smart Bidding); S8 (Rank-limited campaigns (Search - Field Service, Search - Competitors) are over target CPA, so higher bids are the wrong fix; see K1, K2 and S9); T2 (Brand keywords sit only in Search - Brand); Q2 (Search terms cover $11,578.00 of $15,220.00 Search network cost (76.1%). Display expansion cost has no search terms and is left out).
## Not checked
- C7: Enhanced conversions setting is not in any report. Screenshot Goals > Settings, or run query Q01.
- C8: Consent Mode status shows only in Goals > Conversions > Summary > action > Diagnostics.
- C9: Auto-tagging is in Admin > Account settings, not in a report.
- S4: Location criteria need location rows from a Google Ads Editor export, or query Q06.
- T1: Ad group status reasons need query Q08 or an Editor export.
- N1, N2, N3: No negative keyword export in this run (Editor export or queries Q14 and Q15).
- N4: Performance Max runs; the account-level negative list needs query Q15 or Admin > Account settings.
- A1, A2: No asset export in this run (query Q17).
- P1, P2, P3, P4: PMax - All Products runs, but no Performance Max search terms, brand exclusion or asset group data was exported (queries Q18 and Q19).
- X1, X2, X3: AI Max status is a campaign setting outside these exports (queries Q04, Q12, Q13).
- H1: Auto-apply settings are in Recommendations > Auto-apply. Change history shows auto-applied changes (see H2), so auto-apply is on for at least keywords and networks.
- n/a: C6 (No value-based bidding).
## Do these 3 first
1. Fix conversion counting (C4, C3, C5): 1 primary lead action counted once per click. Search - Crew Scheduling sets bids from these numbers today.
2. Pause or rebuild Search - Competitors (S9): $1,790.00 in 30 days with 0 conversions.
3. Turn off search partners on Search - Crew Scheduling and Search - Field Service (S1, $1,032.19 excess cost) and add the negatives from google-ads-search-terms (Q1, $1,980.00).Put it to work
Paid ads skills
All 17 skills in paid-ads-skills with their install commands, the exports each one reads, and the Adwarp tools it calls for live data.
adwarp.dev/docs/skillsBy Stan Rymkiewicz, maintainer of adwarp. Published November 7, 2026.