Not in the top 1,000 by GitHub stars
fourteenwm/ppc-ai-skills
Collection of free PPC AI skills, ready for use with any AI harness, but built for Claude Code originally.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
account-diagnostic/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
ad-copy-generation-framework/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
ad-copy-verification-standard/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
add-account-negative-keywords/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
ads-checker/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
budget-guardian/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
budget-recommendation-calculator/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
change-history-checker/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
client-communication-standards/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
competitor-analysis-v2/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
conversion-tracking-health/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
dgen-automation-disable/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
fair-housing-compliance/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
ga4-campaign-cross-reference/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
ga4-cross-analysis/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
ga4-lead-quality-investigation/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
gaql-query-patterns/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
geo-conflict-analyzer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
google-ads-api-setup/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
google-ads-query/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
google-ads-samples/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
impression-share-diagnostics/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
investigation-methodology/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
lead-quality-pattern-analysis/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
lead-quality-recommendation-prioritization/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
markdown-to-sheets-presenter/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
mcc-hack-audit/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
mutation-safety/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
neg-conflict-finder/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
non-serving-keyword-scanner/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
pmax-asset-automation/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
pmax-builder/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
portfolio-health-prioritization/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
portfolio-pacing-rules/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
rsa-bulk-edit/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
rsa-refresh/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
rsa-single-account/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
shared-budget-updater/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
sqr-classifier/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
sqr-pipeline/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
underspending-investigation/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
youtube-placement-audit/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
90f0e419f2d8 → 90f0e419f2d8
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 90f0e419f2d8
No earlier version was observed for comparison.
Heat
2.4- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
- account-diagnostic
account-diagnostic - ad-copy-generation-framework
ad-copy-generation-framework - ad-copy-verification-standard
ad-copy-verification-standard - add-account-negative-keywords
add-account-negative-keywords - ads-checker
ads-checker - budget-guardian
budget-guardian - budget-recommendation-calculator
budget-recommendation-calculator - change-history-checker
change-history-checker - client-communication-standards
client-communication-standards - competitor-analysis-v2
competitor-analysis-v2 - conversion-tracking-health
conversion-tracking-health - dgen-automation-disable
dgen-automation-disable - fair-housing-compliance
fair-housing-compliance - ga4-campaign-cross-reference
ga4-campaign-cross-reference - ga4-cross-analysis
ga4-cross-analysis - ga4-lead-quality-investigation
ga4-lead-quality-investigation - gaql-query-patterns
gaql-query-patterns - geo-conflict-analyzer
geo-conflict-analyzer - google-ads-api-setup
google-ads-api-setup - google-ads-query
google-ads-query - google-ads-samples
google-ads-samples - impression-share-diagnostics
impression-share-diagnostics - investigation-methodology
investigation-methodology - lead-quality-pattern-analysis
lead-quality-pattern-analysis - lead-quality-recommendation-prioritization
lead-quality-recommendation-prioritization - markdown-to-sheets-presenter
markdown-to-sheets-presenter - mcc-hack-audit
mcc-hack-audit - mutation-safety
mutation-safety - neg-conflict-finder
neg-conflict-finder - non-serving-keyword-scanner
non-serving-keyword-scanner - pmax-asset-automation
pmax-asset-automation - pmax-builder
pmax-builder - portfolio-health-prioritization
portfolio-health-prioritization - portfolio-pacing-rules
portfolio-pacing-rules - rsa-bulk-edit
rsa-bulk-edit - rsa-refresh
rsa-refresh - rsa-single-account
rsa-single-account - shared-budget-updater
shared-budget-updater - sqr-classifier
sqr-classifier - sqr-pipeline
sqr-pipeline - underspending-investigation
underspending-investigation - youtube-placement-audit
youtube-placement-audit
How it works
account-diagnostic
When your agent uses it
42-point Google Ads account inspection (44 with the local-service preset) — discrete GREEN/YELLOW/RED checks across 14 categories (conversion tracking, pacing, impression share, quality score, search-term waste, keyword health, creative, RSA assets, account settings, PMAX config, negative keywords, placement safety, extensions, video & Demand Gen automation), scored into one overall verdict with estimated monthly waste, then triaged per rules.md. Auto-invoke when user says 'run diagnostic', 'inspect account', '40-point inspection', 'diagnostic for [account]', 'audit [account]', or 'account health check'.
What it loads into context
Frontmatter
143 tokensAlways available to the agent
SKILL.md
2,082 tokensWhen the skill is activated
Reference documents
7,031 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Invocation Triggers
- How to Run
- The Checks
- Scoring
- Vertical Presets
- After the run — operator duties
- What this skill deliberately does NOT do
- Files in this skill
- Output
- Prerequisites
- Safety
Scripts executed separately
scripts/run_diagnostic.py
Files
README.mddoc4,677 bytesSKILL.mdcore8,806 bytesSKILL.mdcore8,806 bytesexamples.mddoc3,818 bytesreferences/check-rubric.mddoc11,474 bytesrules.mddoc8,546 bytesscripts/run_diagnostic.pyruns84,982 bytes
Read SKILL.md
# 42-Point Account Diagnostic
Like a mechanic's multi-point vehicle inspection, but for Google Ads
accounts. Every check lands on an explicit GREEN/YELLOW/RED verdict with a
finding, a dollar impact where one can be estimated, and a "do this" action
line — no narrative to interpret.
One operator owns the workflow end to end: run the inspection → present the
scored report → triage the findings (`rules.md`) → route each actionable
finding to its fix skill. The diagnostic itself never changes an account.
*Naming note: 42 checks on a standard run; the local-service preset adds two
for 44. "40-point inspection" survives as a trigger because the instrument
grew from its original 40 core checks.*View the complete source on GitHubad-copy-generation-framework
When your agent uses it
Comprehensive 23-element Google Ads RSA copywriting framework with distribution formulas, sentiment scoring, and the "Four Words to Value" rule. Auto-invoke when user says "generate RSA copy", "write ad copy", "RSA framework", "headlines and descriptions", or asks for ad copywriting principles. Pure protocol skill, no scripts required.
What it loads into context
Frontmatter
84 tokensAlways available to the agent
SKILL.md
1,220 tokensWhen the skill is activated
Reference documents
14,513 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Auto-Invoke When
- What This Skill Deliberately Does NOT Do
- Key Features
- Framework Components
- When to Load Other Skills
- Usage in Agents
- Files in This Skill
Files
README.mddoc1,669 bytesSKILL.mdcore5,324 bytesdistribution.mddoc13,619 bytesexamples.mddoc13,799 bytesframework.mddoc12,765 bytestechnical-specs.mddoc12,634 bytes
Read SKILL.md
# Ad Copy Generation Framework
Comprehensive Google Ads RSA copywriting framework with 23 elements, distribution formulas, and "Four Words to Value" rule for creating high-performing ad copy.
## Auto-Invoke When
- Generating RSA headlines or descriptions
- Writing ad copy for Google Ads
- Optimizing existing ad copy
- Reviewing ad copy quality
- Training on ad copywriting principles
## What This Skill Deliberately Does NOT Do
View the complete source on GitHubad-copy-verification-standard
When your agent uses it
Mandatory verification requirements for all ad copy creation (RSAs, extensions, callouts, structured snippets). Auto-invoke when generating ad copy. Enforces website-sourced claims only — no assumptions, no templates-as-content, no unverified placeholders. Core principle — Empty > Inaccurate.
What it loads into context
Frontmatter
74 tokensAlways available to the agent
SKILL.md
3,511 tokensWhen the skill is activated
Reference documents
1,269 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What This Skill Deliberately Does NOT Do
- Core Principle
- Universal Verification Rules
- Ad Copy Types - Specific Requirements
- Verification Workflow
- Quality Assurance Checklist
- Error Handling
- Examples by Ad Copy Type
- Integration with Agents
- Code Implementation Requirements
- Enforcement
- Success Criteria
- When to Load Other Skills
Files
README.mddoc4,982 bytesSKILL.mdcore15,329 bytesSKILL.mdcore15,329 bytesSKILL.mdcore15,329 bytesSKILL.mdcore15,329 bytesSKILL.mdcore15,329 bytesSKILL.mdcore15,329 bytesSKILL.mdcore15,329 bytesSKILL.mdcore15,329 bytesSKILL.mdcore15,329 bytesdiagrams/README.mddoc584 bytesdiagrams/run-logic.mmdasset1,173 bytesdiagrams/run-logic.svgasset124,076 bytesdiagrams/theme.jsonasset1,400 bytesdiagrams/workflow-hero.mmdasset797 bytesdiagrams/workflow-hero.svgasset29,003 bytes
Read SKILL.md
# Ad Copy Verification Standard
**Purpose:** Mandatory verification requirements for ALL ad copy creation (RSAs, extensions, callouts, etc.).
**Type:** Universal skill — auto-invoked for any ad copy generation task
**Status:** MANDATORY — All ad copy must follow this standard
---
## What This Skill Deliberately Does NOT Do
- **Generate the copy.** Structure, distribution formulas, and copywriting craft live in [`ad-copy-generation-framework`](../ad-copy-generation-framework/) — this standard only decides which claims are allowed in.
- **Scrape websites itself.** It requires scraped site content (Firecrawl, Jina Reader, or any scraper returning clean markdown — see Rule 1) but ships no scraper.View the complete source on GitHubadd-account-negative-keywords
When your agent uses it
Add account-level negative keywords (Admin → Account Settings → Negative Keywords) to Google Ads accounts using the 3-step SharedSet approach. Auto-invoke when user says "add account negatives", "add account-level negatives", "set up account negative keywords for [account(s)]", or "roll the negative-list baseline to [accounts]". Supports single-account and bulk-portfolio operations.
What it loads into context
Frontmatter
100 tokensAlways available to the agent
SKILL.md
2,600 tokensWhen the skill is activated
Reference documents
7,722 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Background — Why 3 Steps, Not 2
- Per-Account State Categorization
- The Two-Step Mutation Flow
- CLI Reference
- accounts.json Format
- Files in This Skill
- After a Run
- When to Load Other Skills
- Prerequisites
- Installation
- Known API Quirks
Scripts executed separately
scripts/add_account_negative_keywords.py
Files
README.mddoc3,578 bytesSKILL.mdcore11,153 bytesSKILL.mdcore11,153 bytesSKILL.mdcore11,153 bytesSKILL.mdcore11,153 bytesSKILL.mdcore11,153 bytesexamples.mddoc8,674 bytesreferences/mutation-contract.mddoc11,709 bytesrules.mddoc9,099 bytesscripts/add_account_negative_keywords.pyruns28,192 bytesscripts/sample_baseline_keywords.txtdoc1,536 bytes
Read SKILL.md
# Add Account-Level Negative Keywords
**Purpose:** Roll a curated baseline of account-level negative keywords (the ones in
Admin → Account Settings → Negative Keywords) across one or many Google Ads accounts,
using the confirmed 3-step SharedSet approach.
**Type:** MUTATION skill. This writes to live accounts. The
[`mutation-safety`](../mutation-safety/) two-step protocol is not a step in this
workflow — it *is* the workflow: dry-run preview → human reads the plan → approval code
generated → human gives the go → execution. Never chain code generation and execution
in a single action, and never skip the preview read.
**This skill deliberately does NOT:**
- Delete or detach anything — no keyword removals, no SharedSet deletion, no listView the complete source on GitHubads-checker
When your agent uses it
Audit Google Ads accounts for creative compliance (10 checks) with intelligence integration (issue-history comparison, chronic-issue detection, daily-briefing integration). Ships both scripts (audit + briefing reader). Auto-invoke when user says "run ads checker", "creative audit", "check ads for [portfolio]", "audit ads", or "ads checker for [account/portfolio]". Outputs to a Google Sheet with a severity breakdown. Read-only — no Google Ads mutations.
What it loads into context
Frontmatter
115 tokensAlways available to the agent
SKILL.md
3,074 tokensWhen the skill is activated
Reference documents
8,731 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What This Skill Wraps
- Prerequisites
- Step 1 — Determine Scope
- Step 2 — Run the Audit
- Step 3 — Intelligence Features (all in the script; preserve them)
- Step 4 — Triage the Results
- Step 5 — Summarize
- When a finding fires — where it routes
- What this skill deliberately does NOT do
- Error Handling
- Files in this skill
- Invocation Patterns
- License
Scripts executed separately
scripts/ads_checker_audit.pyscripts/read_latest_ads_checker.py
Files
README.mddoc8,621 bytesSKILL.mdcore12,553 bytesSKILL.mdcore12,553 bytesSKILL.mdcore12,553 bytesSKILL.mdcore12,553 bytesSKILL.mdcore12,553 bytesexamples.mddoc4,510 bytesreferences/check-rubric.mddoc12,199 bytesrules.mddoc10,596 bytesscripts/ads_checker_audit.pyruns101,774 bytesscripts/read_latest_ads_checker.pyruns9,716 bytes
Read SKILL.md
# Ads Checker
**Purpose:** Run creative-compliance audits across your Google Ads
portfolios, track issue history across runs, detect chronic problems, and
write prioritized findings to a Google Sheet.
**Type:** Read-only audit skill. It does not mutate Google Ads — it only
reports issues and writes results to an audit Google Sheet.
One operator owns the workflow end to end: determine scope → run the audit →
triage the results (`rules.md`) → route each actionable finding to its fix
skill. The audit itself never changes an account.
---View the complete source on GitHubbudget-guardian
When your agent uses it
Monitors a Google Ads MCC for monthly budget overruns and sends Slack alerts at 100% and 120% of monthly budget per account. Designed to catch hijacked accounts, runaway PMax campaigns, and pacing-sheet formula errors within 2 hours instead of 24+. Alert-only — never pauses campaigns. Runs on GitHub Actions on a 2-hour cron. Use this skill when the user asks to "set up budget guardian", "install spend alerts", monitor MCC spend, or build a tripwire against unauthorized PMax campaigns.
What it loads into context
Frontmatter
128 tokensAlways available to the agent
SKILL.md
1,682 tokensWhen the skill is activated
Reference documents
10,242 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Why this exists
- Architecture
- When Claude should invoke this skill
- How Claude helps the user deploy this
- When an alert fires — where it routes
- Files in this skill
- Configuration
- Tested against
- What this skill deliberately does NOT do
- Production twin & behavior parity
Scripts executed separately
workflows/__init__.pyworkflows/_shared/__init__.pyworkflows/_shared/google_ads_auth.pyworkflows/_shared/google_auth.pyworkflows/_shared/sheets_retry.pyworkflows/budget_guardian/__init__.pyworkflows/budget_guardian/ads_api.pyworkflows/budget_guardian/main.pyworkflows/budget_guardian/setup_tabs.pyworkflows/budget_guardian/sheets_io.pyworkflows/budget_guardian/slack.py
Files
.github/workflows/budget-guardian.ymlasset1,349 bytesREADME.mddoc16,089 bytesSKILL.mdcore7,300 bytesexamples.mddoc2,770 bytesreferences/alert-contract.mddoc9,960 bytesrequirements.txtdoc113 bytesrules.mddoc11,328 bytessheet-template.mddoc2,269 bytesworkflows/__init__.pyruns0 bytesworkflows/_shared/__init__.pyruns0 bytesworkflows/_shared/google_ads_auth.pyruns1,529 bytesworkflows/_shared/google_auth.pyruns977 bytesworkflows/_shared/sheets_retry.pyruns1,013 bytesworkflows/budget_guardian/__init__.pyruns0 bytesworkflows/budget_guardian/ads_api.pyruns1,947 bytesworkflows/budget_guardian/main.pyruns5,018 bytesworkflows/budget_guardian/setup_tabs.pyruns2,757 bytesworkflows/budget_guardian/sheets_io.pyruns5,437 bytesworkflows/budget_guardian/slack.pyruns3,654 bytes
Read SKILL.md
# Budget Guardian
A spend tripwire for your Google Ads MCC. Scans every enabled account in your MCC every 2 hours. If month-to-date spend crosses 100% or 120% of the monthly budget you set, it pings Slack. **Alert-only — never pauses campaigns.**
Pairs with [Shared Budget Updater](../shared-budget-updater/) — the execution arm: it pushes sheet-approved budgets; the Guardian is the tripwire watching what gets spent against them.
## Why this exists
Two threats with the same shape — a spend spike nobody noticed until the damage was done.
The first is fat-fingering: a wrong formula or stale value in a budget sheet quietly pushing the wrong number across multiple accounts. The second is the industry-wide trend of hijacked MCCs and malicious spend — unauthorized PMax campaigns at huge daily budgets, drained accounts, agency-level changes nobody approved.
Daily checks miss the first 23 hours of either one. A 2-hour cron with per-threshold dedupe gets detection to ~2 hours, with one alert per account per threshold per month so Slack doesn't get spammed.
View the complete source on GitHubbudget-recommendation-calculator
When your agent uses it
Calculates conservative budget recommendations for Google Ads accounts based on pacing variance, impression share analysis, and performance constraints. Auto-invoke when creating budget recommendations, investigating underspending, or determining optimal budget increases. Enforces 5-10% increase limits and performance safeguards.
What it loads into context
Frontmatter
69 tokensAlways available to the agent
SKILL.md
3,644 tokensWhen the skill is activated
Reference documents
912 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What This Skill Deliberately Does NOT Do
- Core Principles
- Budget Recommendation Decision Tree
- Budget Increase Calculation Methods
- Budget Recommendation Output Format
- Special Cases & Edge Cases
- Quality Checks Before Recommending
- When to Load Other Skills
Files
README.mddoc3,910 bytesSKILL.mdcore15,371 bytesSKILL.mdcore15,371 bytesSKILL.mdcore15,371 bytes
Read SKILL.md
# Budget Recommendation Calculator Skill
**Purpose:** Provides standardized methodology for calculating conservative, data-driven budget recommendations that balance pacing targets with performance goals.
**Type:** Domain knowledge skill (auto-invoked)
---
## What This Skill Deliberately Does NOT Do
- **Diagnose the root cause.** The decision tree assumes you already know whether budget is the constraint — that diagnosis is [`impression-share-diagnostics`](../impression-share-diagnostics/)' job (budget vs. quality vs. low demand vs. ramp-up).
- **Pull the data.** Pacing variance, IS metrics, and CPA/ROAS come in from your pacing source and the API — this skill does the go/no-go reasoning and the math, nothing upstream.
- **Write the change.** The recommendation ends at a number. Writing it to the account is a mutation, governed by [`mutation-safety`](../mutation-safety/)'s two-step approval.
- **Set your tolerances.** Standard ±8% vs. tight ±5% pacing tolerance is portfolio policy ([`portfolio-pacing-rules`](../portfolio-pacing-rules/)); this skill consumes the tolerance, it doesn't choose it.View the complete source on GitHubchange-history-checker
When your agent uses it
Query Google Ads account change history up to 90 days back using the `change_status` resource (vs the 30-day limit of `change_event`). Auto-invoke when user says "what changed in [account]", "change history for [account]", "what did I do in [month]", "audit account changes", or "review optimization history".
What it loads into context
Frontmatter
89 tokensAlways available to the agent
SKILL.md
1,420 tokensWhen the skill is activated
Reference documents
5,597 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Prerequisites
- When to Use
- Deliberately does NOT do
- Two resources, one script
- Shipped Script
- Usage
- After a Run (status leg)
- Files in this skill
- When to load sibling skills
Scripts executed separately
scripts/check_change_history.py
Files
README.mddoc2,729 bytesSKILL.mdcore5,794 bytesSKILL.mdcore5,794 bytesexamples.mddoc5,307 bytesreferences/history-windows.mddoc7,226 bytesrules.mddoc7,003 bytesscripts/check_change_history.pyruns6,937 bytes
Read SKILL.md
# Change History Checker
Owns one workflow: answer "what changed in this account?" from the API —
grouped what-changed-when counts up to 90 days back (the API's hard cap for
`change_status`), with an explicit escalation ladder for the questions the
counts can't answer (who did it, what the old values were, anything older).
The judgment layer — routine vs investigate, the attribution ladder, flag
decisions — is [`rules.md`](rules.md). The two-resource window semantics,
API-enforced query rules, and standalone patterns are
[`references/history-windows.md`](references/history-windows.md).
## Prerequisites
View the complete source on GitHubclient-communication-standards
When your agent uses it
Client-facing report formatting standards. Auto-invoke when creating client summaries, investigation reports, monthly reviews, performance analyses, or any communication for stakeholders. Applies mandatory Background → Analysis → Conclusions framework with required "What We Looked At" data source attribution for all findings.
What it loads into context
Frontmatter
70 tokensAlways available to the agent
SKILL.md
2,699 tokensWhen the skill is activated
Reference documents
940 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What This Skill Deliberately Does NOT Do
- Core Framework: Background → Analysis → Conclusions
- Section 1: Background
- Section 2: Analysis
- Section 3: Conclusions
- Why This Framework Works
- What NOT to Do
- Templates & Examples
- Format Variations by Report Type
- Data Transparency Best Practices
- Integration with Agents
- Quality Checklist
- When to Load Other Skills
- Related Documentation
Files
README.mddoc1,756 bytesSKILL.mdcore12,397 bytesSKILL.mdcore12,397 bytesSKILL.mdcore12,397 bytesSKILL.mdcore12,397 bytestemplates/client_summary_template.mddoc2,550 bytes
Read SKILL.md
# Client Communication Standards Skill
**Purpose:** Ensures all client-facing communications follow the "Background → Analysis → Conclusions" framework with proper data transparency.
**Type:** Communication standards skill (auto-invoked for client reports)
---
## What This Skill Deliberately Does NOT Do
- **Do the analysis.** The framework structures what you found — the investigation itself happens upstream (see [`investigation-methodology`](../investigation-methodology/)). If the analysis is thin, this framework exposes that; it can't fix it.
- **Verify the data.** "What We Looked At" makes every data source transparent; it doesn't audit whether the numbers are right. Attribution is not verification.
- **Apply to internal docs.** This is for client-facing deliverables only — technical implementation details deliberately stay out of the report (they're for internal notes).
- **Deliver the report.** Output is the formatted communication; sending, presenting, or scheduling it is yours.View the complete source on GitHubcompetitor-analysis-v2
When your agent uses it
Comprehensive competitive analysis combining website intelligence, 22-attribute ad copy framework, automated screenshots via Playwright, and verification rigor. Auto-invoke when user says "analyze competitors", "competitor report", "competitive intelligence", "market positioning analysis", or "client gift". Outputs Strategic Client Gift OR tactical Ads Angle Brief.
What it loads into context
Frontmatter
93 tokensAlways available to the agent
SKILL.md
2,799 tokensWhen the skill is activated
Reference documents
33,025 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use This Skill
- The 8-Phase Workflow
- Quality Checklist
- Files in This Skill
- After a Run
- When to Load Other Skills
- Example Usage
- Installation
- Version History
Scripts executed separately
scripts/screenshot.cjs
Files
README.mddoc3,173 bytesSKILL.mdcore11,779 bytesSKILL.mdcore11,779 bytesSKILL.mdcore11,779 bytesSKILL.mdcore11,779 bytesSKILL.mdcore11,779 bytesexamples.mddoc7,899 bytesprompts/analysis-framework.mddoc6,033 bytesprompts/angle-development.mddoc18,893 bytesprompts/client-verification.mddoc17,835 bytesprompts/gap-identification.mddoc9,585 bytesprompts/strategic-analysis.mddoc13,213 bytesprompts/tactical-scan.mddoc13,480 bytesprompts/website-extraction.mddoc8,953 bytesreferences/workflow-contract.mddoc8,208 bytesrules.mddoc8,692 bytessales/service-page-copy.mddoc6,395 bytesscripts/screenshot.cjsruns7,286 bytestemplates/ads-angle-brief.mddoc5,078 bytestemplates/client-gift.mddoc6,720 bytestemplates/template.cssasset12,457 bytes
Read SKILL.md
# Competitor Analysis v2
**Purpose:** An 8-phase competitive analysis of a client plus up to 5 competitors —
website intelligence, optional 22-attribute ad scoring, automated screenshots, gap
identification, and mandatory client verification — producing a strategic **Client
Gift** (10-15 page PDF), a tactical **Ads Angle Brief** (1 page), or both.
**Credentials Required:** None. The whole workflow runs on Playwright plus web fetches.
Competitor ad copy for the optional ad-scoring phase comes from a SERP tool or is
pasted in — no Google Ads API access needed.
**This skill deliberately does NOT:**
- See competitor spend, impression share, or auction data — public surfaces only;
decline asks that need themView the complete source on GitHubconversion-tracking-health
When your agent uses it
Audits conversion tracking health across Google Ads portfolios. Auto-invoke when user says 'conversion tracking audit', 'check conversion health', or 'audit conversions for [portfolio]'. Only analyzes accounts with spend in last 7 days. Identifies conversion actions that haven't fired or are stale.
What it loads into context
Frontmatter
76 tokensAlways available to the agent
SKILL.md
1,552 tokensWhen the skill is activated
Reference documents
6,067 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Prerequisites
- Workflow
- Pairing with scheduled monitoring
- Files in This Skill
- After a Run
- When to Load Something Else
Scripts executed separately
scripts/last_conversion_dates_by_action.pyscripts/portfolio_conversion_audit.py
Files
README.mddoc3,350 bytesSKILL.mdcore6,606 bytesSKILL.mdcore6,606 bytesSKILL.mdcore6,606 bytesSKILL.mdcore6,606 bytesexamples.mddoc6,501 bytesreferences/audit-contract.mddoc8,505 bytesrules.mddoc7,241 bytesscripts/last_conversion_dates_by_action.pyruns13,261 bytesscripts/portfolio_conversion_audit.pyruns15,024 bytes
Read SKILL.md
# Conversion Tracking Health Audit
**Purpose:** Find conversion actions that have gone quiet before someone
asks "why did conversions drop?" — a portfolio-wide scan of which primary
website conversion actions haven't fired recently, spend-gated so you only
audit accounts that are actively running.
**Type:** Read-only audit. Two shipped scripts: a portfolio scan and a
single-account deep-dive. Console-only — neither writes a file.
This skill deliberately does NOT:
- **Fix anything** — no tag edits, no action pauses, no re-promotion. It
finds the quiet actions; the fix runs through your own change process.View the complete source on GitHubdgen-automation-disable
When your agent uses it
Bulk-disable Demand Gen ad-level asset automation settings. Auto-invoke when user says "disable dgen automation", "fix dgen asset settings", "turn off dgen auto assets", "dgen automation fix", or "fix demand gen automation".
What it loads into context
Frontmatter
69 tokensAlways available to the agent
SKILL.md
2,193 tokensWhen the skill is activated
Reference documents
6,275 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Background (one paragraph)
- Two-Step Mutation Flow
- CLI Reference
- Prerequisites
- Installation
- Files in This Skill
- After a Run
- When to Load Something Else
Scripts executed separately
scripts/fix_dgen_ad_automation.py
Files
README.mddoc3,164 bytesSKILL.mdcore9,022 bytesSKILL.mdcore9,022 bytesSKILL.mdcore9,022 bytesSKILL.mdcore9,022 bytesSKILL.mdcore9,022 bytesSKILL.mdcore9,022 bytesexamples.mddoc6,889 bytesreferences/mutation-contract.mddoc8,072 bytesrules.mddoc8,884 bytesscripts/fix_dgen_ad_automation.pyruns25,121 bytes
Read SKILL.md
# DGen Ad-Level Automation Disable
**Purpose:** Programmatically set all Demand Gen ad-level asset automation
settings to `OPTED_OUT` across one or many accounts — the auto-generated
design versions, generated videos, and landing-page previews that trade
creative control for Google's guesses.
**Type:** Mutation skill — two-step approval required, always. The
[`mutation-safety`](../mutation-safety/) pattern (dry-run preview → human
reads → execute with the code from that preview) is implemented directly in
the shipped script.
This skill deliberately does NOT:
View the complete source on GitHubfair-housing-compliance
When your agent uses it
Fair Housing Act compliance requirements for property management advertising. Auto-invoke when creating campaigns, modifying targeting settings, setting up audiences, recommending changes to location/demographic targeting, or ANY discussion of campaign targeting for property management accounts. CRITICAL LEGAL REQUIREMENT - ensures all Google Ads accounts comply with federal housing discrimination laws.
What it loads into context
Frontmatter
80 tokensAlways available to the agent
SKILL.md
2,036 tokensWhen the skill is activated
Reference documents
582 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What This Skill Deliberately Does NOT Do
- CRITICAL LEGAL REQUIREMENT
- PROHIBITED Targeting/Signals
- COMPLIANT Targeting/Signals
- VERIFY BEFORE USE (Gray Areas)
- Key Principle: Target the Product, Not the People
- Campaign Setup Checklist
- Examples: Compliant vs. Non-Compliant
- When to Flag Violations
- When This Skill Auto-Loads
- When to Load Other Skills
- Related Documentation
- Important Notes
Files
README.mddoc2,706 bytesSKILL.mdcore9,724 bytesSKILL.mdcore9,724 bytes
Read SKILL.md
# Fair Housing Compliance Skill
**Purpose:** Ensures all property management advertising complies with Fair Housing Act regulations. Auto-invokes when any targeting or audience discussion occurs.
**Type:** Legal compliance skill (CRITICAL - auto-invoked)
**Scope:** ALL property management accounts
---
## What This Skill Deliberately Does NOT Do
- **Give legal advice.** It encodes Fair Housing Act rules as hard guardrails for ad-targeting work. It is not counsel — gray-area calls (novel audience types, ambiguous proxies) go to a compliance attorney, not an AI judgment; the skill's own rule for uncertainty is "default to NOT using it."
- **Audit accounts wholesale.** It gates targeting decisions as they happen and flags suspicious signals it encounters — but it ships no scanner. Sweeping an entire account for violations is a separate audit task that uses this skill's criteria.View the complete source on GitHubga4-campaign-cross-reference
When your agent uses it
Cross-referencing framework for comparing GA4 behavioral data with Google Ads campaign settings to identify discrepancies and configuration gaps. Auto-invoke when cross-analyzing GA4 and Ads data, investigating discrepancies, or verifying campaign configuration. Uses "Hypothesis → Verification → Finding" methodology.
What it loads into context
Frontmatter
72 tokensAlways available to the agent
SKILL.md
3,831 tokensWhen the skill is activated
Reference documents
402 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What This Skill Deliberately Does NOT Do
- Core Principle: Hypothesis-Driven Verification
- Cross-Reference Framework
- Discrepancy Pattern Library
- Cross-Reference Checklist
- Documentation Templates
- Common Cross-Reference Mistakes to Avoid
- Integration with Investigation Workflow
- Real-World Example: Example PMAX Cross-Reference
- When to Use This Skill
- When to Load Other Skills
Scripts executed separately
../ga4-cross-analysis/scripts/query_campaign_settings.py
Files
README.mddoc1,876 bytesSKILL.mdcore17,528 bytesSKILL.mdcore17,528 bytes../ga4-cross-analysis/scripts/query_campaign_settings.pyruns10,835 bytes
Read SKILL.md
# GA4 Campaign Cross-Reference Skill
**Purpose:** Provides standardized methodology for cross-referencing GA4 behavioral data with Google Ads campaign settings to identify discrepancies, configuration gaps, and misalignments.
**Type:** Domain knowledge skill (auto-invoked)
---
## What This Skill Deliberately Does NOT Do
- **Collect the data.** It compares two datasets it's handed; gathering them is the prerequisite [`ga4-cross-analysis`](../ga4-cross-analysis/) step, which ships the campaign-settings query this skill reads.
- **Treat every discrepancy as a settings problem.** Its whole method refuses that — a GA4 anomaly (VPNs, mobile IP inaccuracy) gets ruled out, not "fixed."
- **Prioritize or build the action plan.** It confirms or rules out gaps; turning the confirmed ones into a sequenced plan is [`lead-quality-recommendation-prioritization`](../lead-quality-recommendation-prioritization/).
- **Apply the changes.** It documents findings; execution happens downstream under its own guardrails.View the complete source on GitHubga4-cross-analysis
When your agent uses it
Collect and structure GA4 + Google Ads data for cross-platform analysis. Reusable data collection engine for lead quality investigations, conversion analysis, and audience insights. Auto-invoke when user asks "what landing pages are converting from [campaign]", "show me GA4 data for [campaign]", "what user segments are converting", or wants to cross-reference GA4 with Google Ads.
What it loads into context
Frontmatter
93 tokensAlways available to the agent
SKILL.md
2,739 tokensWhen the skill is activated
Reference documents
5,982 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use This Skill
- Deliberately Does NOT Do
- Prerequisites
- Script Contract
- Required Inputs
- What This Skill Does
- How to Invoke This Skill
- Output Format Options
- Error Handling
- Files in This Skill
- After a Run
- When to Load Other Skills
Scripts executed separately
scripts/query_campaign_settings.py
Files
README.mddoc4,119 bytesSKILL.mdcore11,551 bytesSKILL.mdcore11,551 bytesSKILL.mdcore11,551 bytesSKILL.mdcore11,551 bytesSKILL.mdcore11,551 bytesSKILL.mdcore11,551 bytesSKILL.mdcore11,551 bytesSKILL.mdcore11,551 bytesexamples.mddoc7,023 bytesreferences/collection-contract.mddoc9,621 bytesrules.mddoc5,994 bytesscripts/query_campaign_settings.pyruns10,835 bytes
Read SKILL.md
# GA4 Cross-Analysis Skill
**Purpose:** Collect and structure GA4 + Google Ads data for cross-platform analysis. Reusable data collection engine for lead quality investigations, conversion analysis, and audience insights.
**Type:** Data collection skill (no autonomous decision-making). Primarily a **protocol** — it defines what to collect from each platform and the structured JSON contract to return it in. One collection script ships with this skill; the rest you implement against the Script Contract below.
---
## When to Use This Skill
Use this skill when you need:
- GA4 conversion data cross-referenced with Google Ads campaigns
- User segment analysis (geo, device, landing pages, timing)
- Campaign settings verification before making recommendationsView the complete source on GitHubga4-lead-quality-investigation
When your agent uses it
Investigate Google Ads lead quality issues by cross-analyzing GA4 behavioral data with Google Ads campaign settings. Auto-invoke when user says "investigate [account] lead quality", "GA4 analysis for [campaign]", "why are [account] leads low quality", or mentions no-shows, missing phone numbers, or bot traffic. Applies 5 red-flag frameworks, hypothesis-driven cross-reference verification, and 3-tier prioritized recommendations. Read-only — no mutations.
What it loads into context
Frontmatter
125 tokensAlways available to the agent
SKILL.md
4,598 tokensWhen the skill is activated
Reference documents
2,790 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What This Skill Deliberately Does NOT Do
- Inputs
- Auto-Load Domain Knowledge Skills
- Investigation Protocol
- Adaptive Investigation
- Worked Example (Synthetic)
- Tools Used
- Script Contract
- Output Format
- Success Criteria
- Important Notes
- Invocation Patterns
- When to Load Other Skills
Scripts executed separately
../ga4-cross-analysis/scripts/query_campaign_settings.py
Files
../ga4-cross-analysis/scripts/query_campaign_settings.pyruns10,835 bytesREADME.mddoc12,562 bytesSKILL.mdcore20,659 bytesSKILL.mdcore20,659 bytesSKILL.mdcore20,659 bytes
Read SKILL.md
# GA4 Lead Quality Investigation
**Purpose:** Investigate why a Google Ads campaign is generating low-quality leads (no-shows, missing contact info, bot traffic, geographic mismatches) by cross-analyzing GA4 behavioral data with Google Ads campaign settings and producing prioritized recommendations.
**Type:** Read-only investigation skill. Reads GA4 + Google Ads data and writes an analysis document; never writes to Google Ads.
---
## What This Skill Deliberately Does NOT Do
- **Mutate anything.** It is read-only — it writes an analysis document and never touches Google Ads.
- **Own the methods.** The 5 frameworks, formulas, and templates live in the companion skills it auto-loads (see "Auto-Load Domain Knowledge Skills"); this file sequences them into the 7-step protocol.
- **Ship the collector scripts.** `query_campaign_settings.py` ships as a reference implementation in the sibling [`ga4-cross-analysis`](../ga4-cross-analysis/) (`../ga4-cross-analysis/scripts/query_campaign_settings.py`); the GA4 query scripts are environment-specific and yours to implement (see "Script Contract").
- **Execute the fixes.** It produces prioritized recommendations; applying them is downstream and mutation-gated.View the complete source on GitHubgaql-query-patterns
When your agent uses it
Reusable GAQL query templates for Google Ads API. Auto-invoke when writing Google Ads queries, analyzing campaign data, querying performance metrics, or building custom reports.
What it loads into context
Frontmatter
43 tokensAlways available to the agent
SKILL.md
2,408 tokensWhen the skill is activated
Reference documents
468 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What This Skill Deliberately Does NOT Do
- Campaign Queries
- Impression Share
- Search Terms
- Keywords
- Ads
- Conversions
- Geographic Performance
- Device Performance
- Account-Level Summary
- Date Range Reference
- Key Field Notes
- When to Load Other Skills
Files
README.mddoc2,129 bytesSKILL.mdcore10,373 bytes
Read SKILL.md
# GAQL Query Patterns
Ready-to-use GAQL (Google Ads Query Language) query templates for common PPC analysis tasks.
## What This Skill Deliberately Does NOT Do
- **Run the queries.** These are copy-paste templates, not a runner — paste them into your own API client, Google Ads Scripts, or [`google-ads-query`](../google-ads-query/) to actually execute and export.
- **Mutate anything.** Every template is a read-only `SELECT`; nothing here changes an account.
- **Cover change-history queries.** Pulling what changed and when needs a finite date window and a `LIMIT`, and lives in [`change-history-checker`](../change-history-checker/) — a windowless change query won't run.
- **Diagnose the results.** The "Use for" and "Interpreting results" notes point you at the analysis; the actual root-causing lives in the diagnostic skills (e.g. [`impression-share-diagnostics`](../impression-share-diagnostics/) for the impression-share query).
---
## Campaign QueriesView the complete source on GitHubgeo-conflict-analyzer
When your agent uses it
Analyze search queries for geographic targeting conflicts in GEO campaigns. Uses OpenAI GPT-4o to determine if queries should PASS (no conflict - safe to add as negative) or FAIL (conflict detected - do NOT negative). Auto-invoke when user mentions "geo conflict check", "analyze geo conflicts", or after running off-brand analysis.
What it loads into context
Frontmatter
79 tokensAlways available to the agent
SKILL.md
1,823 tokensWhen the skill is activated
Reference documents
8,508 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What It Does
- What this skill deliberately does NOT do
- Configuration
- Usage
- Input Format
- Output Format
- PASS/FAIL Logic
- Prerequisites
- Dependencies
- Files
- After a Run
- When to Load What
Scripts executed separately
scripts/analyze.py
Files
README.mddoc3,953 bytesSKILL.mdcore7,580 bytesSKILL.mdcore7,580 bytesSKILL.mdcore7,580 bytesSKILL.mdcore7,580 bytesSKILL.mdcore7,580 bytesexamples.mddoc4,596 bytesprompt.mddoc13,210 bytesreferences/analysis-contract.mddoc5,829 bytesrules.mddoc6,159 bytesscripts/analyze.pyruns10,065 bytes
Read SKILL.md
# GEO Conflict Analyzer
The last safety gate before a negative-keyword upload: checks each
candidate query against the geos an account actively targets, so you
never negative your own live traffic. Verdicts are PASS (no conflict —
geo-safe to negative) or FAIL (conflict — do NOT negative). How to read
the verdicts is [rules.md](rules.md); exact script mechanics are
[`references/analysis-contract.md`](references/analysis-contract.md);
the classification ruleset itself is [prompt.md](prompt.md).
---
## What It Does
View the complete source on GitHubgoogle-ads-api-setup
When your agent uses it
One-time setup guide and scripts for getting Google Ads API access working. Auto-invoke when user says "set up Google Ads API", "generate credentials", "create google-ads.yaml", "OAuth setup", "test API connection", or hits authentication errors like "invalid_grant", "redirect_uri_mismatch", "The developer token is not approved", or a refresh token that keeps expiring every week. Prerequisite for every skill that queries or modifies Google Ads.
What it loads into context
Frontmatter
117 tokensAlways available to the agent
SKILL.md
1,496 tokensWhen the skill is activated
Reference documents
4,441 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Invoke
- What This Skill Does
- Files in This Skill
- How to Run
- Common Failure Modes
- Security Notes
- Related Skills
- Installation
Scripts executed separately
generate_credentials.pytest_connection.py
Files
README.mddoc18,621 bytesSKILL.mdcore6,545 bytesSKILL.mdcore6,545 bytesSKILL.mdcore6,545 bytesSKILL.mdcore6,545 bytesSKILL.mdcore6,545 bytesdiagrams/README.mddoc586 bytesdiagrams/setup-flow.mmdasset1,527 bytesdiagrams/setup-flow.svgasset134,771 bytesdiagrams/theme.jsonasset1,400 bytesdiagrams/workflow-hero.mmdasset1,121 bytesdiagrams/workflow-hero.svgasset34,316 bytesgenerate_credentials.pyruns4,418 bytesgoogle-ads.example.yamlasset625 bytestest_connection.pyruns4,876 bytes
Read SKILL.md
# Google Ads API Setup
**Purpose:** Get your Google Ads API connection working from scratch. This is the prerequisite for every other skill that queries or modifies Google Ads accounts.
**Type:** Setup / onboarding skill (one-time — run once per machine)
**Time required:** ~30 minutes
---
## When to Invoke
Auto-invoke when user says:
- "Set up Google Ads API"View the complete source on GitHubgoogle-ads-query
When your agent uses it
Query Google Ads data and save to CSV. AUTO-ACTIVATE for: search terms, campaigns, keywords, ad groups, conversions, budgets, assets, geo performance. Also triggered by account names or "get/pull/show me" + Google Ads resource.
What it loads into context
Frontmatter
73 tokensAlways available to the agent
SKILL.md
1,822 tokensWhen the skill is activated
Reference documents
6,025 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Purpose
- Deliberately does NOT do
- Command Format
- Prerequisites
- Process
- Error Handling
- After a Query (status leg)
- Files in this skill
- When to load sibling skills
Scripts executed separately
scripts/query.py
Files
README.mddoc3,739 bytesSKILL.mdcore7,378 bytesSKILL.mdcore7,378 bytesSKILL.mdcore7,378 bytesaccounts.example.jsonasset949 bytesexamples.mddoc4,371 bytesreferences/ad-groups.gaqlasset522 bytesreferences/assets.gaqlasset539 bytesreferences/budgets.gaqlasset437 bytesreferences/campaigns.gaqlasset653 bytesreferences/conversions.gaqlasset478 bytesreferences/geo.gaqlasset489 bytesreferences/keywords.gaqlasset733 bytesreferences/query-contract.mddoc8,105 bytesreferences/resources.mddoc1,725 bytesreferences/search-terms.gaqlasset433 bytesrules.mddoc6,759 bytesscripts/query.pyruns10,852 bytes
Read SKILL.md
# Google Ads Query Skill
Owns one workflow: turn a natural-language data request into a template-driven
GAQL pull whose results land in a CSV file — returning only the file path and
row count to the conversation. Read-only — SELECT queries, never mutations.
## Purpose
This skill implements the **CSV-first pattern** for context-efficient analysis:
1. Query API data
2. Save to CSV file (data stays outside context)
3. Return only file path + row count
4. Analyze the CSV as a separate step, only when asked (read the file then, not before)
View the complete source on GitHubgoogle-ads-samples
When your agent uses it
Reference library of official Google Ads API code samples. Auto-invoke when building NEW Google Ads scripts, agents, or functionality (campaigns, mutations, reporting, account management). Helps find relevant examples in /examples/ folder before writing custom code. Improves efficiency by starting from proven patterns rather than guessing API implementation.
What it loads into context
Frontmatter
84 tokensAlways available to the agent
SKILL.md
2,730 tokensWhen the skill is activated
Reference documents
420 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What This Skill Deliberately Does NOT Do
- Setup (One-Time)
- When to Auto-Invoke This Skill
- Available Example Categories
- Instructions
- Example Workflow
- Benefits of Using This Skill
- Quick Reference: Example Index
- When NOT to Use This Skill
- When to Load Other Skills
- Success Criteria
- Related Documentation
Files
README.mddoc1,920 bytesSKILL.mdcore12,494 bytesSKILL.mdcore12,494 bytesSKILL.mdcore12,494 bytesSKILL.mdcore12,494 bytesSKILL.mdcore12,494 bytesSKILL.mdcore12,494 bytesSKILL.mdcore12,494 bytes
Read SKILL.md
# Google Ads Code Samples Reference Skill
**Purpose:** Automatically reference official Google Ads API examples when building new functionality.
**Type:** Reference/efficiency skill (auto-invokes when implementing new Google Ads features)
**Status:** Production - Use before writing new Google Ads code
---
## What This Skill Deliberately Does NOT Do
- **Run the samples.** It finds, explains, and adapts proven patterns (see the Instructions steps); executing the resulting code is yours to do.
- **Write GAQL for you.** Simple reporting queries belong to [`gaql-query-patterns`](../gaql-query-patterns/), not here.View the complete source on GitHubimpression-share-diagnostics
When your agent uses it
Impression share analysis and root cause diagnosis for Google Ads Search campaigns. Auto-invoke when investigating underspending, analyzing auction competitiveness, or diagnosing budget vs. quality issues. Interprets Search IS, Budget Lost IS, and Rank Lost IS metrics in smart bidding context.
What it loads into context
Frontmatter
68 tokensAlways available to the agent
SKILL.md
4,217 tokensWhen the skill is activated
Reference documents
750 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What This Skill Deliberately Does NOT Do
- Core Impression Share Metrics
- Smart Bidding Context (CRITICAL)
- Root Cause Diagnosis Decision Tree
- Impression Share Context for Different Campaign Types
- How to Interpret Rank Lost IS in Context
- Budget vs. Quality Trade-offs
- Integration with Underspending Investigation
- Quick Reference: IS Patterns Cheat Sheet
- When to Use This Skill
- Using Impression Share as Demand Ceiling (Budget Viability Analysis)
- When to Load Other Skills
Files
README.mddoc3,309 bytesSKILL.mdcore18,252 bytesSKILL.mdcore18,252 bytesSKILL.mdcore18,252 bytes
Read SKILL.md
# Impression Share Diagnostics Skill
**Purpose:** Provides expert analysis of impression share metrics to diagnose root causes of underspending and auction performance issues in Google Ads Search campaigns.
**Type:** Domain knowledge skill (auto-invoked)
---
## What This Skill Deliberately Does NOT Do
- **Calculate the budget change.** Diagnosis ends at "budget is (or isn't) the constraint" — the sizing math (5-10% caps, adjustment factors, daily translation) lives in [`budget-recommendation-calculator`](../budget-recommendation-calculator/).
- **Diagnose PMax with the decision tree.** Performance Max has no impression share metrics — the scenarios apply to Search campaigns (plus the bid-cap check for Display/Video remarketing). PMax gets budget-utilization and asset diagnostics instead (see the campaign-type section).
- **Treat Rank Lost IS as a target.** The skill reads it as evidence for the constraint diagnosis, never as a number to optimize down — chasing it is the misconception this skill exists to correct.
- **Pull the metrics.** The required API fields are listed under Data Sources Required; the query templates live in [`gaql-query-patterns`](../gaql-query-patterns/).View the complete source on GitHubinvestigation-methodology
When your agent uses it
Structured hypothesis-driven investigation framework for diagnosing Google Ads performance issues. Auto-invoke when user says "investigate," "why is [account] performing poorly," "dig into," or asks to diagnose a performance issue.
What it loads into context
Frontmatter
51 tokensAlways available to the agent
SKILL.md
2,106 tokensWhen the skill is activated
Reference documents
996 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What This Skill Deliberately Does NOT Do
- Step 1: Define the Problem Statement
- Step 2: Generate Hypotheses BEFORE Analysis
- Step 3: Gather Evidence One Layer at a Time
- Step 4: Present Findings
- Rules
- Worked Example (Synthetic Data)
- When to Load Other Skills
Files
README.mddoc3,693 bytesSKILL.mdcore9,334 bytesdiagrams/README.mddoc584 bytesdiagrams/run-logic.mmdasset1,219 bytesdiagrams/run-logic.svgasset166,774 bytesdiagrams/theme.jsonasset1,400 bytesdiagrams/workflow-hero.mmdasset986 bytesdiagrams/workflow-hero.svgasset30,327 bytes
Read SKILL.md
# Investigation Methodology
Structured framework for diagnosing Google Ads performance issues. Follow this process for every investigation — no exceptions.
## What This Skill Deliberately Does NOT Do
- **Replace domain judgment.** Step 4's recommendation must be specific, but the domain rules that make it safe live in their own skills — a budget fix still goes through [`budget-recommendation-calculator`](../budget-recommendation-calculator/)'s conservative caps; a live-account change still goes through [`mutation-safety`](../mutation-safety/)'s approval gate.
- **Pull data for you.** The framework sequences WHICH evidence to gather at each layer; it works with the API, exports, or screenshots — whatever access exists.
- **Format the client deliverable.** Findings presented to a client go through [`client-communication-standards`](../client-communication-standards/) (Background → Analysis → Conclusions); Step 4 here is the internal analytical output that feeds it.
- **Guarantee an answer.** Inconclusive is a valid verdict — the Rules require saying so over inventing a cause.
## Step 1: Define the Problem Statement
Start with the specific question. Do not generalize.View the complete source on GitHublead-quality-pattern-analysis
When your agent uses it
Red flag detection frameworks for lead quality analysis across GA4 behavioral data. Auto-invoke when analyzing lead quality, identifying bot traffic, investigating no-shows/missing contact info, or reviewing conversion patterns. Provides 5 analysis frameworks (landing pages, geo, devices, time, user behavior) with severity classification.
What it loads into context
Frontmatter
77 tokensAlways available to the agent
SKILL.md
4,413 tokensWhen the skill is activated
Reference documents
916 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What This Skill Deliberately Does NOT Do
- Quick Reference: Red Flag Decision Tree
- Framework 1: Landing Page Distribution Analysis
- Framework 2: Geographic Distribution Analysis
- Framework 3: Device & Browser Pattern Analysis
- Framework 4: Time Pattern Analysis
- Framework 5: User Behavior Analysis
- Red Flag Summary Table
- Integration with Investigation Workflow
- Real-World Example: PMax Lead Quality Analysis
- When to Use This Skill
- When to Load Other Skills
Files
README.mddoc4,093 bytesSKILL.mdcore18,324 bytes
Read SKILL.md
# Lead Quality Pattern Analysis Skill
**Purpose:** Provides standardized red flag detection frameworks for identifying lead quality issues through GA4 behavioral data analysis.
**Type:** Domain knowledge skill (auto-invoked)
---
## What This Skill Deliberately Does NOT Do
- **Collect the data.** It runs on GA4 behavioral data already gathered (Step 1 hands it [`ga4-cross-analysis`](../ga4-cross-analysis/) output); it pulls nothing itself.
- **Verify flags against campaign settings.** It detects patterns in GA4 behavior; confirming whether a flag is a real config gap or a data artifact is [`ga4-campaign-cross-reference`](../ga4-campaign-cross-reference/)'s hypothesis → verification job.
- **Build the prioritized plan.** It counts and severity-classifies red flags; turning them into a sequenced action plan is [`lead-quality-recommendation-prioritization`](../lead-quality-recommendation-prioritization/).
- **Apply the fixes.** Adding URL or placement exclusions runs through [`mutation-safety`](../mutation-safety/)'s two-step approval, not here.View the complete source on GitHublead-quality-recommendation-prioritization
When your agent uses it
Recommendation prioritization framework with implementation timelines for lead quality investigations. Auto-invoke when generating recommendations, prioritizing actions, or creating implementation plans. Provides 3-tier priority system (Immediate/Medium/Long-term) with structured recommendation templates.
What it loads into context
Frontmatter
67 tokensAlways available to the agent
SKILL.md
4,111 tokensWhen the skill is activated
Reference documents
413 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What This Skill Deliberately Does NOT Do
- Core Principle: Actionable, Verified, Prioritized
- Three-Tier Priority System
- Recommendation Structure Template
- Recommendation Examples by Tier
- "What Was Ruled Out" Framework
- Implementation Timeline Template
- Success Metrics & Monitoring Template
- Prioritization Decision Tree
- Quality Checks Before Recommending
- Integration with Investigation Workflow
- Real-World Example: Example PMAX Prioritization
- When to Use This Skill
- When to Load Other Skills
Files
README.mddoc1,914 bytesSKILL.mdcore18,486 bytes
Read SKILL.md
# Lead Quality Recommendation Prioritization Skill
**Purpose:** Provides standardized methodology for prioritizing and structuring lead quality recommendations with clear implementation timelines and success metrics.
**Type:** Domain knowledge skill (auto-invoked)
---
## What This Skill Deliberately Does NOT Do
- **Detect the issues.** Its inputs are red flags from [`lead-quality-pattern-analysis`](../lead-quality-pattern-analysis/) and verified gaps from [`ga4-campaign-cross-reference`](../ga4-campaign-cross-reference/); it prioritizes, it doesn't find.
- **Recommend the unverified.** Its Core Principle is Verified-first — an unconfirmed hypothesis is documented in "What Was Ruled Out," never shipped as an action.
- **Execute the changes.** It structures the plan and timeline; applying the changes is downstream and mutation-gated.
- **Format the client deliverable.** The final report formatting is [`client-communication-standards`](../client-communication-standards/).View the complete source on GitHubmarkdown-to-sheets-presenter
When your agent uses it
Transforms markdown reports into professionally formatted Google Sheets for client presentation. Auto-invoke when user wants to make a report presentable, share analysis with clients, convert markdown to Sheets, or export competitive analysis. Triggers include "make this presentable", "create a Google Sheet", "export to sheets", "format for client".
What it loads into context
Frontmatter
104 tokensAlways available to the agent
SKILL.md
1,975 tokensWhen the skill is activated
Reference documents
5,351 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What this skill deliberately does NOT do
- Prerequisites
- Workflow
- Output Format
- Error Handling
- Files
- After a Run
- When to Load What
Scripts executed separately
scripts/create_spreadsheet.py
Files
README.mddoc3,378 bytesSETUP.mddoc2,130 bytesSKILL.mdcore8,487 bytesSKILL.mdcore8,487 bytesSKILL.mdcore8,487 bytesSKILL.mdcore8,487 bytesexamples.mddoc4,605 bytesreferences/presentation-contract.mddoc5,524 bytesrules.mddoc6,658 bytesscripts/create_spreadsheet.pyruns6,986 bytestemplates/professional-blue-theme.jsonasset2,113 bytes
Read SKILL.md
# Markdown to Google Sheets Presenter
Turn a markdown report (competitive analysis, ad recon, performance
review) into a client-ready Google Sheet: multi-tab layout, themed
formatting, conditional colors. The shipped script bootstraps the
spreadsheet; everything the client actually sees is composed by the agent
per [`references/presentation-contract.md`](references/presentation-contract.md)'s
division of labor. Judgment calls — when to present vs hand over a CSV,
theme handling, tab structure — live in [rules.md](rules.md).
## What this skill deliberately does NOT do
- **Never edits report content.** This is a formatting pass: numbers, ad
copy, and quotes land verbatim, ad copy never truncates (rules,View the complete source on GitHubmcc-hack-audit
When your agent uses it
Portfolio-wide scan of every manager (MCC) that has access to accounts in your Google Ads tree. Built after an MCC link-fraud incident where hostile external MCCs were found linked to client accounts via compromised admin credentials. Classifies each manager link as INTERNAL (in your tree), HOSTILE (known threat), or EXTERNAL (potential exposure — no judgment). Outputs CSV by default with optional Google Sheets upload. Auto-invoke when user says 'mcc hack audit', 'audit mcc links', 'scan for external managers', 'check manager links', 'run mcc link scan', 'find external mccs', or asks who has access to their Google Ads accounts.
What it loads into context
Frontmatter
158 tokensAlways available to the agent
SKILL.md
1,849 tokensWhen the skill is activated
Reference documents
6,300 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What It Scans
- Classification Model — No Judgment
- Deliberately does NOT do
- Prerequisites
- How to Run
- After a Run (status leg)
- Files in this skill
- When to load sibling skills
Scripts executed separately
scripts/mcc_hack_audit.py
Files
README.mddoc4,741 bytesSKILL.mdcore7,726 bytesSKILL.mdcore7,726 bytesexamples.mddoc6,188 bytesreferences/scan-contract.mddoc7,576 bytesrules.mddoc7,933 bytesscripts/mcc_hack_audit.pyruns14,100 bytes
Read SKILL.md
# MCC Hack Audit
Owns one workflow: walk your entire Google Ads tree and map every manager
(MCC) with a link into it — then hand the operator a triage-ready answer to
**"which MCCs currently have access to which of my accounts, and which are
outside my own tree?"** Built after a real-world MCC link-fraud incident
where hostile external MCCs gained access to client accounts via compromised
client-side admin credentials.
The triage judgment — which links matter, when a finding becomes an incident,
what "trusted" costs — is [`rules.md`](rules.md). The exact
walk/classification/output mechanics and the hard-won API limitations are
[`references/scan-contract.md`](references/scan-contract.md).
View the complete source on GitHubmutation-safety
When your agent uses it
MANDATORY safety system for ALL Google Ads mutations AND destructive Google Sheets writes. Auto-invoke whenever ANY agent, skill, or script attempts to modify Google Ads accounts or overwrite Google Sheets data. Enforces two-step approval to prevent accidental changes.
What it loads into context
Frontmatter
63 tokensAlways available to the agent
SKILL.md
1,784 tokensWhen the skill is activated
Reference documents
1,107 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What This Skill Deliberately Does NOT Do
- Core Rules
- What Counts as a Mutation
- Dry-Run Output Format
- Revert Knowledge
- Common Mistakes This Prevents
- When to Load Other Skills
Files
README.mddoc4,181 bytesSKILL.mdcore8,020 bytesdiagrams/README.mddoc584 bytesdiagrams/run-logic.mmdasset1,177 bytesdiagrams/run-logic.svgasset210,030 bytesdiagrams/theme.jsonasset1,400 bytesdiagrams/workflow-hero.mmdasset862 bytesdiagrams/workflow-hero.svgasset30,303 bytes
Read SKILL.md
# Mutation Safety
**Purpose:** Enforce two-step approval for ALL mutations to Google Ads accounts AND destructive Google Sheets writes.
**Type:** Safety enforcement skill (MANDATORY — auto-invokes for all mutations)
---
## What This Skill Deliberately Does NOT Do
- **Choose the mutation.** Producing skills decide WHAT to change; this protocol governs how any change gets approved and executed. Clearing the two-step gate is control, not endorsement — an approved mutation can still be a bad idea.
- **Check content or compliance.** Whether copy is verified ([`ad-copy-verification-standard`](../ad-copy-verification-standard/)) or targeting is lawful ([`fair-housing-compliance`](../fair-housing-compliance/)) is decided upstream; this skill only guarantees a human saw the exact change first.
- **Gate reads.** Queries, reports, and audits run freely — the "NOT Mutations" list below is explicit about what needs no approval.
- **Undo for you.** Revert Knowledge documents HOW to reverse each mutation type, but some operations (removed conversion actions) are permanent — which is why the dry-run must flag irreversibility BEFORE execution, not after.View the complete source on GitHubneg-conflict-finder
When your agent uses it
Find negative keyword conflicts across an MCC. Auto-invoke when user asks "find negative keyword conflicts", "audit negatives across my MCC", "which negatives are blocking my keywords", or wants to identify conflicts between positives and negatives at any level (ad group, campaign, shared list, MCC shared list, account-level).
What it loads into context
Frontmatter
73 tokensAlways available to the agent
SKILL.md
3,647 tokensWhen the skill is activated
Reference documents
1,390 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- Deliberately Does NOT Do
- What It Does
- How the Script Decides "Blocked"
- Reading the Sheet — Triage Order
- Shared List vs Campaign Level — Choosing the Fix
- Setup
- Run the Script
- Worked Read
- How to Resolve Conflicts
- Limitations
- What NOT to Do
- When to Load Other Skills
Scripts executed separately
scripts/mcc-neg-keyword-conflict.js
Files
README.mddoc6,258 bytesSKILL.mdcore16,833 bytesscripts/mcc-neg-keyword-conflict.jsruns54,328 bytes
Read SKILL.md
# MCC Negative Keyword Conflict Finder
Identifies every place a negative keyword is blocking a positive keyword you bid on, across all accounts under an MCC, at every level Google supports — ad group, campaign, account-level shared lists, and MCC-level shared lists.
This is an **ADS-SCRIPT skill**: one Google Ads Script (`scripts/mcc-neg-keyword-conflict.js`), pasted into the MCC's Scripts editor and run there. There is no CLI, no local install, and no separate rules/reference files — the judgment layer for reading and resolving its output lives inline below.
## When to Use
- User asks to find or audit negative keyword conflicts
- User suspects old negatives are silently blocking active keywords
- User wants a portfolio-wide negative keyword health check
- User wants to know which positives are being blocked and where the negative lives
## Deliberately Does NOT DoView the complete source on GitHubnon-serving-keyword-scanner
When your agent uses it
Scans your accounts for enabled Search keywords with zero impressions over a window (default 180 days) and writes one review tab to a Google Sheet — every row then gets a Pause/Keep/Investigate verdict per rules.md. Report-only, never pauses. Auto-invoke when user says 'scan non-serving keywords', 'find dead keywords', 'keyword cleanup report', or 'non-serving keyword scan'.
What it loads into context
Frontmatter
103 tokensAlways available to the agent
SKILL.md
1,943 tokensWhen the skill is activated
Reference documents
6,064 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Invocation Triggers
- How to Run
- After the run — operator duties
- What this skill deliberately does NOT do
- Files in this skill
- Output
- Prerequisites
- Safety
Scripts executed separately
scripts/non_serving_keyword_scan.py
Files
README.mddoc5,317 bytesSKILL.mdcore8,147 bytesSKILL.mdcore8,147 bytesSKILL.mdcore8,147 bytesaccounts.example.mddoc731 bytesdiagrams/README.mddoc584 bytesdiagrams/run-logic.mmdasset1,249 bytesdiagrams/run-logic.svgasset211,380 bytesdiagrams/theme.jsonasset1,400 bytesdiagrams/workflow-hero.mmdasset960 bytesdiagrams/workflow-hero.svgasset30,072 bytesexamples.mddoc4,415 bytesreferences/scan-contract.mddoc6,524 bytesrules.mddoc8,352 bytesscripts/non_serving_keyword_scan.pyruns16,047 bytes
Read SKILL.md
# Non-Serving Keyword Scanner
Finds the keywords nobody knows exist: enabled, eligible, and silent — zero
impressions across the whole scan window. Across a large portfolio these
accumulate into hundreds of rows of clutter and false coverage ("we're
covering that term" — except it never serves). One run scans every account
you point it at and produces a single review tab.
One operator owns the workflow end to end: run the scan → triage the tab
(`rules.md` — clusters before rows) → give every row a Pause / Keep /
Investigate verdict → route what needs routing. The scanner itself never
pauses anything; it is a hygiene instrument, not a savings instrument —
every flagged keyword spent $0.00 by definition.
View the complete source on GitHubpmax-asset-automation
When your agent uses it
Audit and fix Performance Max campaign asset automation settings. Opts out of Google's auto-generated headlines, descriptions, videos, and image enhancements that often produce off-brand or hallucinated output. Auto-invoke when user says "audit PMAX asset automation", "check auto-created assets", "fix PMAX automatic assets", or "are PMAX campaigns opted out".
What it loads into context
Frontmatter
82 tokensAlways available to the agent
SKILL.md
1,812 tokensWhen the skill is activated
Reference documents
5,943 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Why This Exists
- What this skill deliberately does NOT do
- How to Check in the Google Ads UI (single campaign)
- How to Audit via the API
- How to Fix via the API (Mutation)
- Files
- After a Run
- When to Load What
- Installation
Scripts executed separately
scripts/audit_pmax_asset_automation.py
Files
README.mddoc2,886 bytesSKILL.mdcore7,626 bytesSKILL.mdcore7,626 bytesSKILL.mdcore7,626 bytesexamples.mddoc8,737 bytesreferences/audit-contract.mddoc7,300 bytesrules.mddoc7,098 bytesscripts/audit_pmax_asset_automation.pyruns9,090 bytes
Read SKILL.md
# PMax Asset Automation
Audit Performance Max campaigns for Google's five asset-automation settings
and drive them to the house standard: **all five OPTED_OUT**. The audit is
shipped code (`scripts/audit_pmax_asset_automation.py`); the fix is a
documented mutation pattern run under
[mutation-safety](../mutation-safety/). Judgment calls (which flags matter,
when ON is legitimate, triage order) live in [rules.md](rules.md); exact
script mechanics live in
[references/audit-contract.md](references/audit-contract.md).
## Why This Exists
PMax campaigns ship with five asset automations ON by default: GoogleView the complete source on GitHubpmax-builder
When your agent uses it
Build Performance Max campaigns and output Google Ads Editor-importable CSV (115 columns, UTF-16LE). Auto-invoke when user says "build pmax", "pmax build", "new pmax campaign", "pmax csv", or references a todo file with `pmax-build` in the name. Generates CSV from a campaign brief plus YouTube videos and ad copy.
What it loads into context
Frontmatter
94 tokensAlways available to the agent
SKILL.md
3,188 tokensWhen the skill is activated
Reference documents
7,137 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What this skill deliberately does NOT do
- Prerequisites
- Workflow
- CSV Format
- Vertical Note
- Files
- After a Run
- Manual Steps (Not in CSV)
- When to Load What
Scripts executed separately
scripts/build_pmax_csv.pyscripts/scrape_website_firecrawl.py
Files
README.mddoc4,223 bytesSKILL.mdcore12,731 bytesSKILL.mdcore12,731 bytesSKILL.mdcore12,731 bytesSKILL.mdcore12,731 bytesSKILL.mdcore12,731 bytesSKILL.mdcore12,731 bytesSKILL.mdcore12,731 bytesSKILL.mdcore12,731 bytesSKILL.mdcore12,731 bytesSKILL.mdcore12,731 bytesexamples.mddoc7,093 bytesreferences/build-contract.mddoc9,562 bytesrules.mddoc6,867 bytesscripts/build_pmax_csv.pyruns17,896 bytesscripts/scrape_website_firecrawl.pyruns7,938 bytestemplates/audience_signals.jsonasset626 bytestemplates/campaign_settings.jsonasset1,109 bytestemplates/negative_locations.jsonasset17,995 bytestemplates/search_themes.jsonasset656 bytes
Read SKILL.md
# PMax Campaign Builder
Build Performance Max campaigns from a campaign brief and output a Google
Ads Editor-importable CSV. Judgment calls (copy-source selection, template
editing, the final-URL rule, pre-import checks) live in
[rules.md](rules.md); exact script mechanics live in
[references/build-contract.md](references/build-contract.md).
## What this skill deliberately does NOT do
- **Never touches a live account.** No API mutations, no uploads — the
product is a CSV file, and Google Ads Editor import is the deliberate
human review gate between this skill and anything serving.
- **Doesn't validate your ad copy.** No length checks, no minimum-countView the complete source on GitHubportfolio-health-prioritization
When your agent uses it
Account prioritization criteria for portfolio health monitoring and daily briefings. Auto-invoke when determining which accounts need investigation, prioritizing daily actions, running portfolio health checks, or deciding investigation order. Provides 5-tier priority system with portfolio-specific thresholds (Portfolio A ±5%, Portfolio B ±8%).
What it loads into context
Frontmatter
77 tokensAlways available to the agent
SKILL.md
4,008 tokensWhen the skill is activated
Reference documents
982 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What This Skill Deliberately Does NOT Do
- Quick Reference: Priority Tiers
- Portfolio-Specific Thresholds
- Prioritization Decision Tree
- Focus Rules (Investigation Order)
- Daily Briefing Workflow Integration
- Selection Algorithm for Daily Prioritization
- Real-World Example: Daily Prioritization
- When to Use This Skill
- When to Load Other Skills
Files
README.mddoc3,610 bytesSKILL.mdcore15,528 bytesSKILL.mdcore15,528 bytesdiagrams/README.mddoc584 bytesdiagrams/run-logic.mmdasset1,444 bytesdiagrams/run-logic.svgasset174,587 bytesdiagrams/theme.jsonasset1,400 bytesdiagrams/workflow-hero.mmdasset734 bytesdiagrams/workflow-hero.svgasset27,970 bytes
Read SKILL.md
# Portfolio Health Prioritization Skill
**Purpose:** Provides standardized criteria for prioritizing Google Ads accounts that need investigation or action in portfolio health monitoring workflows.
**Type:** Domain knowledge skill (auto-invoked)
---
## What This Skill Deliberately Does NOT Do
- **Investigate accounts.** It decides WHICH accounts get investigated and in what order — the digging itself belongs to investigation skills (e.g. [`underspending-investigation`](../underspending-investigation/) for pacing misses).
- **Run the health check.** It consumes the flagged-account list your own monitoring produces (script, sheet, or API sweep — "replace with your own equivalent" throughout) — it ships no scanner.
- **Set the thresholds.** The ±5%/±8% tolerances are portfolio policy from [`portfolio-pacing-rules`](../portfolio-pacing-rules/); this skill applies them to build the day's list, it doesn't choose them.
- **Fix anything.** Output is a prioritized list. Budget changes, quality work, and every other intervention happen downstream in their own skills, under their own guardrails.View the complete source on GitHubportfolio-pacing-rules
When your agent uses it
Portfolio-specific pacing thresholds, budget tolerances, and brand caps. Auto-invoke when analyzing pacing variance, checking if accounts are on pace, investigating underspending/overspending, or discussing portfolio-specific rules (Portfolio A ±5%, Portfolio B ±8%, Portfolio C). Also loads when user mentions specific portfolios by name.
What it loads into context
Frontmatter
80 tokensAlways available to the agent
SKILL.md
2,311 tokensWhen the skill is activated
Reference documents
413 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What This Skill Deliberately Does NOT Do
- Quick Reference: Pacing Thresholds by Portfolio
- Universal Pacing Rules (All Portfolios)
- Portfolio Constraints
- Performance Targets by Portfolio
- When to Use This Skill
- Budget Management Context (Smart Bidding)
- Pacing Calculation (Reference)
- When to Load Other Skills
Files
README.mddoc1,898 bytesSKILL.mdcore9,593 bytes
Read SKILL.md
# Portfolio Pacing Rules Skill
**Purpose:** Provides portfolio-specific pacing thresholds, budget tolerances, brand caps, and performance targets that auto-load when analyzing account performance.
**Type:** Domain knowledge skill (auto-invoked)
---
## What This Skill Deliberately Does NOT Do
- **Pull the data.** It defines the thresholds; the pacing numbers come from your own tracking sheet and the Google Ads API (see Data Sources Referenced).
- **Calculate pacing.** Variance is auto-calculated in your Pacing Dashboard — this skill sets and interprets the tolerance bands, it doesn't recompute the number.
- **Size the budget change.** It holds the conservative 5-10% ceiling; the actual increase math is [`budget-recommendation-calculator`](../budget-recommendation-calculator/), which consumes the tolerance defined here.
- **Select or investigate accounts.** [`portfolio-health-prioritization`](../portfolio-health-prioritization/) picks which accounts to act on and [`underspending-investigation`](../underspending-investigation/) diagnoses them; this skill provides the thresholds both rely on.View the complete source on GitHubrsa-bulk-edit
When your agent uses it
Find and replace text across RSA ads at scale, outputting to Google Sheet in Google Ads Editor format for review before manual import. Auto-invoke when user says "RSA bulk edit", "find and replace in RSA ads", "edit RSA ads at scale", or "bulk RSA changes". Supports single account, multiple CIDs, dry-run preview, and case-sensitive matching.
What it loads into context
Frontmatter
93 tokensAlways available to the agent
SKILL.md
1,786 tokensWhen the skill is activated
Reference documents
4,856 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Auto-Invocation Triggers
- Prerequisites
- Usage
- Arguments
- Post-Script Workflow
- What this skill deliberately does NOT do
- Files in this skill
- When to load a sibling skill
- Examples
- Safety
Scripts executed separately
scripts/rsa_bulk_edit.py
Files
README.mddoc3,457 bytesSKILL.mdcore7,084 bytesSKILL.mdcore7,084 bytesSKILL.mdcore7,084 bytesSKILL.mdcore7,084 bytesSKILL.mdcore7,084 bytesSKILL.mdcore7,084 bytesSKILL.mdcore7,084 bytesexamples.mddoc4,710 bytesreferences/edit-contract.mddoc5,461 bytesrules.mddoc6,474 bytesscripts/rsa_bulk_edit.pyruns9,110 bytes
Read SKILL.md
# RSA Bulk Edit Skill
Find-and-replace **literal text** across RSA ads in one or more accounts,
outputting a Google Ads Editor-ready review sheet. One operator owns the
workflow end to end: scope the swap → dry-run → sheet → the review
checklist in [`rules.md`](rules.md) (length audit, casing scan, collateral
read) → per-account Editor paste → post.
The tool is deliberately dumb: it moves text you already decided on. If the
change needs judgment about meaning or new copy, it's not bulk work —
`rules.md` has the boundary table.
## Auto-Invocation Triggers
View the complete source on GitHubrsa-refresh
When your agent uses it
Refresh RSA ad copy by scraping the business website, identifying LOW-performing assets, and generating replacement headlines and descriptions using AI. Auto-invoke when user says 'refresh RSAs for [account]', 'update RSA assets', 'rewrite RSAs', or 'replace low-performing RSA assets'. Uses Firecrawl for scraping and Claude for copy generation.
What it loads into context
Frontmatter
74 tokensAlways available to the agent
SKILL.md
2,484 tokensWhen the skill is activated
Reference documents
10,847 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Workflow
- After the run — operator duties
- What this skill deliberately does NOT do
- Files in this skill
- When to load a sibling skill
- Prerequisites
- Optional: Pre-Refresh Baseline
- Vertical Note
- Optional Enhancements
- Safety
Scripts executed separately
scripts/rsa_baseline_snapshot.pyscripts/rsa_refresh_generator.py
Files
README.mddoc4,585 bytesSKILL.mdcore10,477 bytesSKILL.mdcore10,477 bytesSKILL.mdcore10,477 bytesSKILL.mdcore10,477 bytesexamples.mddoc5,637 bytesreferences/description-voice-lifting.mddoc5,097 bytesreferences/hallucination-filter.mddoc3,920 bytesreferences/pm-headline-structure.mddoc4,745 bytesreferences/refresh-contract.mddoc12,746 bytesrules.mddoc8,447 bytesscripts/rsa_baseline_snapshot.pyruns22,737 bytesscripts/rsa_refresh_generator.pyruns61,404 bytes
Read SKILL.md
# RSA Refresh Skill
Refreshes Responsive Search Ad copy for **one account** by replacing
low-performing assets with new headlines and descriptions verified against
the actual business website. One operator (or agent) owns the workflow end
to end: prepare context → make the refresh-vs-rebuild call
([`rules.md`](rules.md)) → generate copy under the reference standards →
merge to a review sheet → review → import via Google Ads Editor.
The core rule at every step: **Empty > Inaccurate** — no slot ever carries
a claim the website doesn't verify.
## Workflow
View the complete source on GitHubrsa-single-account
When your agent uses it
Generate a full Responsive Search Ad set for ONE account — 15 headlines + 4 descriptions per active ad group — from website-verified content plus live SERP competitive analysis and a website→Google-Business-Profile review fallback. Ships all seven workflow scripts. Auto-invoke when user says "create RSAs for [account]", "generate RSAs for [account]", or "build RSA copy for [account]". Outputs an import-ready Google Sheet. Read-only on Google Ads (no mutations).
What it loads into context
Frontmatter
121 tokensAlways available to the agent
SKILL.md
3,332 tokensWhen the skill is activated
Reference documents
9,654 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What This Skill Wraps
- What This Skill Deliberately Does NOT Do
- Prerequisites
- Workflow
- Output Configuration
- After a Run
- Files in This Skill
- When to Load Sibling Skills
- License
Scripts executed separately
scripts/analyze_competitors_for_rsa.pyscripts/check_active_accounts.pyscripts/get_account_website_url.pyscripts/get_gmb_reviews.pyscripts/get_search_campaign_structure.pyscripts/scrape_website_firecrawl.pyscripts/write_rsa_to_sheet.py
Files
README.mddoc8,850 bytesSKILL.mdcore14,229 bytesSKILL.mdcore14,229 bytesSKILL.mdcore14,229 bytesSKILL.mdcore14,229 bytesexamples.mddoc6,846 bytesreferences/pipeline-contract.mddoc14,034 bytesrules.mddoc9,478 bytesscripts/analyze_competitors_for_rsa.pyruns17,355 bytesscripts/check_active_accounts.pyruns7,234 bytesscripts/get_account_website_url.pyruns5,096 bytesscripts/get_gmb_reviews.pyruns10,623 bytesscripts/get_search_campaign_structure.pyruns4,653 bytesscripts/scrape_website_firecrawl.pyruns14,361 bytesscripts/vertical_configs.jsonasset9,646 bytesscripts/write_rsa_to_sheet.pyruns8,460 bytes
Read SKILL.md
# RSA Single-Account Generator
**Purpose:** Produce a complete, import-ready RSA set for a single account — find its active Search ad groups, scrape its website for verified claims, analyze competitors for differentiation, pull reviews, and generate 15 headlines + 4 descriptions per ad group. Output lands in a Google Sheet ready to copy/paste into Google Ads Editor.
**Type:** Read-only generation skill. It does not mutate Google Ads — it writes ad copy to a review Sheet; you import via Editor.
**Which RSA skill?** This one builds a **full set from scratch**. If the
account already has RSAs with performance labels and the job is replacing
the LOW slots while keeping proven copy, load
[`rsa-refresh`](../rsa-refresh/) instead. If the job is a uniform literal
text swap across existing ads (rebrand, spelling, customizer retirement) —
no new copy at all — load [`rsa-bulk-edit`](../rsa-bulk-edit/).
---View the complete source on GitHubshared-budget-updater
When your agent uses it
Sheet-driven Google Ads shared budget automation. Approve a budget change by adding a row (CID, shared budget ID, amount) to a Google Sheet tab; a daily GitHub Actions cron pushes it via campaignBudgets:mutate (amount only), marks the row done, and sends one consolidated Slack alert for any failed rows. Failed rows retry next run; amounts of $0 or less never reach the API. Use this skill when the user asks to "set up shared budget updater", "push budget changes from a sheet", "bulk update shared budgets on a schedule", or wants a spreadsheet-approved budget pipeline.
What it loads into context
Frontmatter
145 tokensAlways available to the agent
SKILL.md
1,822 tokensWhen the skill is activated
Reference documents
9,064 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Why this exists
- Architecture
- When Claude should invoke this skill
- How Claude helps the user deploy this
- When a row fails — where it routes
- Files in this skill
- Configuration
- Tested against
- What this skill deliberately does NOT do
- Production twins & behavior parity
Scripts executed separately
workflows/__init__.pyworkflows/_shared/__init__.pyworkflows/_shared/google_ads_auth.pyworkflows/_shared/google_auth.pyworkflows/_shared/mutate_error_hints.pyworkflows/_shared/sheets_retry.pyworkflows/shared_budget_updater/__init__.pyworkflows/shared_budget_updater/ads_api.pyworkflows/shared_budget_updater/main.pyworkflows/shared_budget_updater/sheets_io.pyworkflows/shared_budget_updater/slack.py
Files
.github/workflows/shared-budget-updater.ymlasset1,873 bytesREADME.mddoc11,826 bytesSKILL.mdcore7,850 bytesdiagrams/README.mddoc584 bytesdiagrams/run-logic.mmdasset1,196 bytesdiagrams/run-logic.svgasset213,233 bytesdiagrams/theme.jsonasset1,377 bytesdiagrams/workflow-hero.mmdasset1,050 bytesdiagrams/workflow-hero.svgasset31,433 bytesexamples.mddoc2,251 bytesreferences/update-contract.mddoc11,625 bytesrequirements.txtdoc113 bytesrules.mddoc8,719 bytessheet-template.mddoc1,900 bytesworkflows/__init__.pyruns0 bytesworkflows/_shared/__init__.pyruns0 bytesworkflows/_shared/google_ads_auth.pyruns1,529 bytesworkflows/_shared/google_auth.pyruns977 bytesworkflows/_shared/mutate_error_hints.pyruns1,039 bytesworkflows/_shared/sheets_retry.pyruns1,013 bytesworkflows/shared_budget_updater/__init__.pyruns0 bytesworkflows/shared_budget_updater/ads_api.pyruns5,410 bytesworkflows/shared_budget_updater/main.pyruns5,476 bytesworkflows/shared_budget_updater/sheets_io.pyruns2,041 bytesworkflows/shared_budget_updater/slack.pyruns2,745 bytes
Read SKILL.md
# Shared Budget Updater
A sheet-driven budget pusher for Google Ads. You (or your pacing process)
drop approved changes into a Google Sheet tab — customer ID, shared budget ID,
new amount. A daily GitHub Actions cron pushes each row to Google Ads and
marks it done. **This tool CHANGES live budgets** — the sheet is the approval
gate, so control who can edit the sheet.
## Why this exists
Budget pacing produces a daily list of "set budget X to $Y" decisions. Doing
them by hand in the Ads UI is slow and error-prone at portfolio scale; doing
them with ad-hoc scripts scatters mutation code everywhere. This gives the
decision list one narrow, auditable exit: a sheet row in, oneView the complete source on GitHubsqr-classifier
When your agent uses it
Classify search terms by intent. Auto-invoke when user provides search terms to classify, asks for search term analysis, or wants to identify negative keyword candidates.
What it loads into context
Frontmatter
41 tokensAlways available to the agent
SKILL.md
1,523 tokensWhen the skill is activated
Reference documents
738 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What This Skill Deliberately Does NOT Do
- When to Use
- Classification Categories
- Classification Rules
- Output Format
- Batch Processing
- Worked Example
- What NOT to Do
- When to Load Other Skills
Files
README.mddoc3,351 bytesSKILL.mdcore6,859 bytes
Read SKILL.md
# SQR Classifier
Classify search terms into intent categories for Google Ads accounts.
## What This Skill Deliberately Does NOT Do
- **Pull the search terms.** It classifies the terms you hand it (a paste, a CSV, or a report someone else ran) — pulling the search-term report itself is [`google-ads-query`](../google-ads-query/) or [`gaql-query-patterns`](../gaql-query-patterns/) territory.
- **Upload or apply negatives.** It labels intent and never auto-generates a negative list without your review; it pushes nothing to an account — the upload lives in [`sqr-pipeline`](../sqr-pipeline/) or [`add-account-negative-keywords`](../add-account-negative-keywords/).
- **Pattern-match by regex.** Every term gets judgment, not a rule engine — the same query is High Intent for one business and Off-Brand for another, so a mechanical matcher would misclassify.
- **Classify without context.** It refuses to categorize until it knows what the business does and where it operates; the business type and location come first.
## When to Use
- User provides a list of search terms to classifyView the complete source on GitHubsqr-pipeline
When your agent uses it
End-to-end search query report (SQR) negative-keyword pipeline — pull search terms across your MCC, prep classification batches, run 3 independent classification passes for consensus, (optionally) check geo conflicts, write reviewable agree tabs, then upload approved PHRASE negatives to shared lists with two-step mutation safety. Includes a remove branch to un-negate mistakes. Auto-invoke when the user says "run SQR pipeline", "classify search queries", "pull search terms", "upload negatives", "sqr uploader", "remove negative", or "un-negate keyword".
What it loads into context
Frontmatter
141 tokensAlways available to the agent
SKILL.md
2,872 tokensWhen the skill is activated
Reference documents
5,725 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Triggers
- Step chain
- Step 0 — Pull
- Step 1 — Prep
- Step 2 — Classify (3 independent runs)
- Step 3 — Geo conflict (optional)
- Step 4 — Consensus
- Step 5 — Review gate (STOP)
- Step 6 — Upload (MUTATION)
- Step 7 — Remove (maintenance)
- Files in this skill
- Prerequisites
- What this skill deliberately does NOT do
Scripts executed separately
scripts/mcc_search_query_report.pyscripts/prep_geo_batches.pyscripts/sqr_compare.pyscripts/sqr_ngram_analysis.pyscripts/sqr_prep.pyscripts/sqr_remove_negatives.pyscripts/sqr_upload_negatives.py
Files
README.mddoc5,086 bytesSKILL.mdcore11,358 bytesSKILL.mdcore11,358 bytesSKILL.mdcore11,358 bytesSKILL.mdcore11,358 bytesSKILL.mdcore11,358 bytesSKILL.mdcore11,358 bytesSKILL.mdcore11,358 bytesreferences/classify-prompt.mddoc5,914 bytesreferences/geo-prompt.mddoc5,390 bytesreferences/offbrand-keywords.txtdoc418 bytesscripts/mcc_search_query_report.pyruns15,099 bytesscripts/prep_geo_batches.pyruns7,117 bytesscripts/sqr_compare.pyruns17,956 bytesscripts/sqr_ngram_analysis.pyruns9,345 bytesscripts/sqr_prep.pyruns13,672 bytesscripts/sqr_remove_negatives.pyruns12,042 bytesscripts/sqr_upload_negatives.pyruns15,813 bytessheet-template.mddoc5,833 bytes
Read SKILL.md
# SQR Pipeline — Negative Keyword Operator
One operator owns the search-query-report negative-keyword workflow end to end:
pull → prep → 3-run classify → (optional geo) → consensus → human review → upload,
with a maintenance branch to remove a negative that was added by mistake.
The classification step is **LLM-in-the-loop** — Claude reads each batch and
classifies it three independent times. That is the whole point: three independent
opinions per query, with consensus (3-of-3 unanimous / 2-of-3 majority) filtering
out one-off misclassifications before anything touches a live account.
This is a single generic vertical. There is no profile switching and no
account-specific branching — point it at *your* MCC, *your* Google Sheet, and
*your* competitor list (`references/offbrand-keywords.txt`) and it runs.View the complete source on GitHubunderspending-investigation
When your agent uses it
Investigate Google Ads accounts with significant underspending (pacing variance beyond your portfolio's tolerance). Auto-invoke when user says "investigate [account] underspending", "[account] underspending", "why is [account] underspending", or "diagnose underspend for [account]". Runs a universal investigation script, applies six diagnostic frameworks, and synthesizes a root-cause diagnosis with a budget recommendation (or explicit no-action call). Read-only — no mutations.
What it loads into context
Frontmatter
120 tokensAlways available to the agent
SKILL.md
2,543 tokensWhen the skill is activated
Reference documents
7,872 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Inputs
- Load the Frameworks First
- Prerequisites
- Investigation Protocol
- Output Format
- Success Criteria
- Invocation Patterns
- Files in This Skill
- After a Run
- When to Load Something Else
Scripts executed separately
scripts/investigate_underspend.py
Files
README.mddoc9,469 bytesSKILL.mdcore11,674 bytesSKILL.mdcore11,674 bytesSKILL.mdcore11,674 bytesexamples.mddoc6,701 bytesreferences/investigation-contract.mddoc8,465 bytesrules.mddoc8,346 bytesscripts/investigate_underspend.pyruns25,632 bytes
Read SKILL.md
# Underspending Investigation
**Purpose:** Investigate why a Google Ads account is underspending and
determine the root cause with actionable, data-backed recommendations — or
an explicit, equally-rigorous no-action call.
**Type:** Read-only investigation skill. Reads campaign, impression share,
and pacing data; never writes to Google Ads.
This skill deliberately does NOT:
- **Mutate anything** — no budget changes, no settings edits. The product is
a diagnosis and a recommendation; execution happens in your own change
process, human-approved.View the complete source on GitHubyoutube-placement-audit
When your agent uses it
Audit Google Ads accounts for bad YouTube placements (kids content, adult, gaming, non-English, spam) across PMAX, Demand Gen, and Display campaigns. Flags violations, writes to Google Sheets, then extracts channels for bulk negation.
What it loads into context
Frontmatter
58 tokensAlways available to the agent
SKILL.md
2,163 tokensWhen the skill is activated
Reference documents
6,712 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Why This Exists
- What this skill deliberately does NOT do
- What Gets Flagged
- Setup
- Usage
- Output
- PMAX API Limitation
- The Channel Aggregation Payoff
- Customization
- Runtime
- Files
- After a Run
- When to Load What
Scripts executed separately
scripts/youtube_channel_extractor.pyscripts/youtube_placement_audit.py
Files
README.mddoc4,462 bytesSKILL.mdcore8,907 bytesSKILL.mdcore8,907 bytesSKILL.mdcore8,907 bytesSKILL.mdcore8,907 bytesSKILL.mdcore8,907 bytesexamples.mddoc6,624 bytesreferences/audit-contract.mddoc8,903 bytesrules.mddoc7,330 bytesscripts/youtube_channel_extractor.pyruns13,613 bytesscripts/youtube_placement_audit.pyruns17,086 bytes
Read SKILL.md
# YouTube Placement Brand Safety Audit
Scans all accounts under your MCC for YouTube placements and flags brand
safety violations, then aggregates flagged videos by channel so you can
negate at the channel level instead of one video at a time. The flags are
machine leads; the negate/keep calls live in [rules.md](rules.md), and
exact script mechanics live in
[`references/audit-contract.md`](references/audit-contract.md).
---
## Why This Exists
PMAX and Demand Gen campaigns serve ads on YouTube placements you neverView the complete source on GitHubSkills included
- account-diagnostic
- ad-copy-generation-framework
- ad-copy-verification-standard
- add-account-negative-keywords
- ads-checker
- budget-guardian
- budget-recommendation-calculator
- change-history-checker
- client-communication-standards
- competitor-analysis-v2
- conversion-tracking-health
- dgen-automation-disable
- fair-housing-compliance
- ga4-campaign-cross-reference
- ga4-cross-analysis
- ga4-lead-quality-investigation
- gaql-query-patterns
- geo-conflict-analyzer
- google-ads-api-setup
- google-ads-query
- google-ads-samples
- impression-share-diagnostics
- investigation-methodology
- lead-quality-pattern-analysis
- lead-quality-recommendation-prioritization
- markdown-to-sheets-presenter
- mcc-hack-audit
- mutation-safety
- neg-conflict-finder
- non-serving-keyword-scanner
- pmax-asset-automation
- pmax-builder
- portfolio-health-prioritization
- portfolio-pacing-rules
- rsa-bulk-edit
- rsa-refresh
- rsa-single-account
- shared-budget-updater
- sqr-classifier
- sqr-pipeline
- underspending-investigation
- youtube-placement-audit
Repository facts
- License
- MIT
- Created
- Apr 7, 2026
- Last pushed
- Aug 25, 2026
- Forks
- 11
- Open issues
- 1
- Project activity
- Slowing
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 5, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 120 notes
account-diagnostic/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedad-copy-verification-standard/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedad-copy-verification-standard/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedad-copy-verification-standard/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedad-copy-verification-standard/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedad-copy-verification-standard/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedad-copy-verification-standard/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedad-copy-verification-standard/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedad-copy-verification-standard/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedad-copy-verification-standard/diagrams/run-logic.svg:1Analysis incomplete: physical or joined line exceeds character limitad-copy-verification-standard/diagrams/workflow-hero.svg:1Analysis incomplete: physical or joined line exceeds character limitadd-account-negative-keywords/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedadd-account-negative-keywords/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedadd-account-negative-keywords/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedadd-account-negative-keywords/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedads-checker/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedads-checker/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedads-checker/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedads-checker/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedbudget-recommendation-calculator/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- 21 broad permissionsin 21 files: account-diagnostic/SKILL.md:1 add-account-negative-keywords/SKILL.md:1 ads-checker/SKILL.md:1 and 18 more
- 2 dangerous shell commandsin 2 files: budget-guardian/.github/workflows/budget-guardian.yml:43 shared-budget-updater/.github/workflows/shared-budget-updater.yml:43
- 768 network referencesin 118 files: pmax-builder/README.md:33 rsa-refresh/README.md:26 rsa-single-account/README.md:26 and 115 more
- No hidden or obfuscated text
- 12 instruction override signalsin 3 files: youtube-placement-audit/scripts/youtube_placement_audit.py:373 youtube-placement-audit/examples.md:21 youtube-placement-audit/scripts/youtube_channel_extractor.py:306
- 65 executable scriptsin 63 files: ga4-cross-analysis/scripts/query_campaign_settings.py:1 account-diagnostic/scripts/run_diagnostic.py:1 add-account-negative-keywords/scripts/add_account_negative_keywords.py:1 and 60 more
- 176 references to secretsin 56 files: rsa-single-account/scripts/scrape_website_firecrawl.py:16 rsa-refresh/scripts/rsa_refresh_generator.py:30 rsa-single-account/scripts/get_gmb_reviews.py:18 and 53 more
- No requests to vote in Hot
Show all 1,044 signals by file
account-diagnostic/README.md
- Network accessline 26
git clone https://github.com/fourteenwm/ppc-ai-skills.git - Network accessline 96
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 98
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
account-diagnostic/SKILL.md
- Broad permissionsline 1
Bash
account-diagnostic/scripts/run_diagnostic.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 1726
with the Sheets API enabled, download its JSON key to that path, and share the target sheet with the service account's client_email as an editor. See: https://docs.gspread.org/en/latest/oauth2.html - Network accessline 1727
share the target sheet with the service account's client_email as an editor. See: https://docs.gspread.org/en/latest/oauth2.html """ - Network accessline 1728
editor. See: https://docs.gspread.org/en/latest/oauth2.html - Network accessline 1784
requests.append({ - Network accessline 1799
requests.append({ - Network accessline 1812
requests.append({ - Network accessline 1826
row_idx = i + 3 # offset for banner + headers bg = color_map.get(c.status, WHITE) requests.append({ - Network accessline 1827
bg = color_map.get(c.status, WHITE) requests.append({ 'repeatCell': { - Network accessline 1828
requests.append({ - Network accessline 1841
requests.append({ - Network accessline 1853
requests.append({
ad-copy-generation-framework/README.md
- Network accessline 24
mkdir -p .claude/skills/ad-copy-generation-framework curl -o .claude/skills/ad-copy-generation-framework/SKILL.md \ - Network accessline 25
curl -o .claude/skills/ad-copy-generation-framework/SKILL.md \ - Network accessline 26
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ad-copy-generation-framework/SKILL.md - Network accessline 37
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 39
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
ad-copy-verification-standard/README.md
- Network accessline 41
The `.mmd` sources for both diagrams live in `diagrams/` — they're [Mermaid](https://mermaid.js.org/) diagram-as-code, rendered with the included - Network accessline 42
[Mermaid](https://mermaid.js.org/) diagram-as-code, rendered with the included - Network accessline 62
mkdir -p .claude/skills/ad-copy-verification-standard curl -o .claude/skills/ad-copy-verification-standard/SKILL.md \ - Network accessline 63
curl -o .claude/skills/ad-copy-verification-standard/SKILL.md \ - Network accessline 64
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ad-copy-verification-standard/SKILL.md - Network accessline 94
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. This standard exists because I got tired of manually deleting AI-hallucinated claims from live ads. - Network accessline 96
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
ad-copy-verification-standard/SKILL.md
- Network accessline 498
Built by [Kurt Henninger](https://fourteenwebmedia.com). More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
ad-copy-verification-standard/diagrams/README.md
ad-copy-verification-standard/diagrams/run-logic.svg
- Network accessline 1
<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="flowchart" style="max-width: 1512.92px; background-color: rgb(10, 10, 15);" viewBox="0 0 1512.9217529296875 965.875" role="gr
ad-copy-verification-standard/diagrams/workflow-hero.svg
- Network accessline 1
<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="max-width: 838px; background-color: rgb(10, 10, 15);" viewBox="-50 -10 838 665" role="graphics-document document" aria-rolede
add-account-negative-keywords/README.md
- Network accessline 29
for f in SKILL.md README.md rules.md examples.md references/mutation-contract.md \ scripts/add_account_negative_keywords.py scripts/sample_baseline_keywords.txt; do curl -o ".claude/skills/add-account-negative-keywords/$f" \ - Network accessline 30
scripts/add_account_negative_keywords.py scripts/sample_baseline_keywords.txt; do curl -o ".claude/skills/add-account-negative-keywords/$f" \ "https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/add-account-negative-keywor - Network accessline 31
curl -o ".claude/skills/add-account-negative-keywords/$f" \ - Network accessline 32
"https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/add-account-negative-keywords/$f" - Network accessline 60
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 62
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
add-account-negative-keywords/SKILL.md
- Broad permissionsline 1
Bash - Network accessline 192
sample; curate per `rules.md`, replace with your own) 5. **For `--log-sheet-id`:** the refresh token in `google-ads.yaml` must include the `https://www.googleapis.com/auth/spreadsheets` scope - Network accessline 194
`https://www.googleapis.com/auth/spreadsheets` scope - Network accessline 201
for f in SKILL.md README.md rules.md examples.md references/mutation-contract.md \ scripts/add_account_negative_keywords.py scripts/sample_baseline_keywords.txt; do curl -o ".claude/skills/add-account-negative-keywords/$f" \ - Network accessline 202
scripts/add_account_negative_keywords.py scripts/sample_baseline_keywords.txt; do curl -o ".claude/skills/add-account-negative-keywords/$f" \ "https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/add-account-negative-keywor - Network accessline 203
curl -o ".claude/skills/add-account-negative-keywords/$f" \ - Network accessline 204
"https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/add-account-negative-keywords/$f"
add-account-negative-keywords/scripts/add_account_negative_keywords.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 383
[Credential-related source omitted] - Network accessline 384
[Credential-related source omitted] - Network accessline 385
token_uri='https://oauth2.googleapis.com/token', - Network accessline 386
[Credential-related source omitted] - Network accessline 387
[Credential-related source omitted] - Access to secretsline 387
[Credential-related source omitted] - Network accessline 388
scopes=['https://www.googleapis.com/auth/spreadsheets'], - Network accessline 741
print(f" Local log: {log_dir / 'account_negs_mutations.jsonl'}") if args.log_sheet_id: print(f" Sheet log: https://docs.google.com/spreadsheets/d/{args.log_sheet_id}") - Network accessline 742
if args.log_sheet_id: print(f" Sheet log: https://docs.google.com/spreadsheets/d/{args.log_sheet_id}") print("=" * 80) - Network accessline 743
print(f" Sheet log: https://docs.google.com/spreadsheets/d/{args.log_sheet_id}")
ads-checker/README.md
- Network accessline 26
mkdir -p .claude/skills/ads-checker/scripts .claude/skills/ads-checker/references curl -o .claude/skills/ads-checker/SKILL.md \ - Network accessline 27
curl -o .claude/skills/ads-checker/SKILL.md \ - Network accessline 28
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ads-checker/SKILL.md curl -o .claude/skills/ads-checker/README.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ads-checker/README.md - Network accessline 29
curl -o .claude/skills/ads-checker/README.md \ - Network accessline 30
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ads-checker/README.md curl -o .claude/skills/ads-checker/rules.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ads-checker/rules.md - Network accessline 31
curl -o .claude/skills/ads-checker/rules.md \ - Network accessline 32
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ads-checker/rules.md curl -o .claude/skills/ads-checker/examples.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ads-checker/examples.md - Network accessline 33
curl -o .claude/skills/ads-checker/examples.md \ - Network accessline 34
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ads-checker/examples.md curl -o .claude/skills/ads-checker/references/check-rubric.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ads-checker/references - Network accessline 35
curl -o .claude/skills/ads-checker/references/check-rubric.md \ - Network accessline 36
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ads-checker/references/check-rubric.md curl -o .claude/skills/ads-checker/scripts/ads_checker_audit.py \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ads-c - Network accessline 37
curl -o .claude/skills/ads-checker/scripts/ads_checker_audit.py \ - Network accessline 38
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ads-checker/scripts/ads_checker_audit.py curl -o .claude/skills/ads-checker/scripts/read_latest_ads_checker.py \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/ma - Network accessline 39
curl -o .claude/skills/ads-checker/scripts/read_latest_ads_checker.py \ - Network accessline 40
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ads-checker/scripts/read_latest_ads_checker.py - Network accessline 138
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 140
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
ads-checker/SKILL.md
- Broad permissionsline 1
Bash
ads-checker/scripts/ads_checker_audit.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 388
[Credential-related source omitted] - Network accessline 389
[Credential-related source omitted] - Network accessline 390
token_uri="https://oauth2.googleapis.com/token", - Network accessline 392
[Credential-related source omitted] - Access to secretsline 392
[Credential-related source omitted] - Network accessline 393
scopes=[ "https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/drive.readonly", - Network accessline 394
"https://www.googleapis.com/auth/spreadsheets", - Network accessline 395
"https://www.googleapis.com/auth/drive.readonly", - Network accessline 621
def check_url(url): try: resp = requests.head(url, timeout=5, allow_redirects=True) - Network accessline 622
try: resp = requests.head(url, timeout=5, allow_redirects=True) if resp.status_code >= 400: - Network accessline 623
resp = requests.head(url, timeout=5, allow_redirects=True)
ads-checker/scripts/read_latest_ads_checker.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 64
[Credential-related source omitted] - Network accessline 65
[Credential-related source omitted] - Network accessline 66
token_uri='https://oauth2.googleapis.com/token', - Network accessline 67
[Credential-related source omitted] - Network accessline 68
[Credential-related source omitted] - Access to secretsline 68
[Credential-related source omitted] - Network accessline 69
scopes=['https://www.googleapis.com/auth/spreadsheets']
budget-guardian/.github/workflows/budget-guardian.yml
- Dangerous shell operationline 43
run: rm -f /tmp/sheets-token.json /tmp/google-ads.yaml
budget-guardian/README.md
- Network accessline 43
- Apply for a developer token on your MCC ([instructions](https://developers.google.com/google-ads/api/docs/get-started/dev-token)) - Access to secretsline 51
[Credential-related source omitted] - Network accessline 66
2. Enable the Google Sheets API 3. Create an OAuth client (Desktop type) 4. Run the [Google OAuth playground](https://developers.google.com/oauthplayground/) with scope `https://www.googleapis.com/auth/spreadsheets` - Network accessline 67
3. Create an OAuth client (Desktop type) 4. Run the [Google OAuth playground](https://developers.google.com/oauthplayground/) with scope `https://www.googleapis.com/auth/spreadsheets` 5. Exchange the auth code for a refresh token and save t - Network accessline 68
4. Run the [Google OAuth playground](https://developers.google.com/oauthplayground/) with scope `https://www.googleapis.com/auth/spreadsheets` - Network accessline 75
[Credential-related source omitted] - Network accessline 76
[Credential-related source omitted] - Network accessline 77
"token_uri": "https://oauth2.googleapis.com/token", - Network accessline 78
[Credential-related source omitted] - Network accessline 79
[Credential-related source omitted] - Access to secretsline 79
[Credential-related source omitted] - Network accessline 80
"scopes": ["https://www.googleapis.com/auth/spreadsheets"] - Network accessline 103
Grab the sheet ID from the URL: `https://docs.google.com/spreadsheets/d/<THIS_IS_THE_ID>/edit` - Network accessline 111
1. Go to `https://slack.com/get-started` → **Create a Workspace** - Network accessline 119
1. Go to `https://api.slack.com/apps` → **Create New App** → **From scratch** - Network accessline 121
3. In the left sidebar: **Incoming Webhooks** → toggle **Activate Incoming Webhooks** to On 4. Scroll down → click **Add New Webhook to Workspace** → pick the alerts channel → **Allow** 5. Copy the webhook URL (starts with `https://hooks.sl - Network accessline 123
5. Copy the webhook URL (starts with `https://hooks.slack.com/services/...`) — you'll paste this into a GitHub secret in Step 5 - Network accessline 128
curl -X POST -H 'Content-Type: application/json' \ - Network accessline 168
1. Go to `https://github.com` → **Sign up** - Network accessline 341
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 343
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
budget-guardian/SKILL.md
- Broad permissionsline 1
Bash
budget-guardian/workflows/__init__.py
- Executable scriptline 1
Executable file
budget-guardian/workflows/_shared/__init__.py
- Executable scriptline 1
Executable file
budget-guardian/workflows/_shared/google_ads_auth.py
- Executable scriptline 1
Executable file - Access to secretsline 10
[Credential-related source omitted] - Network accessline 21
TOKEN_URI = "https://oauth2.googleapis.com/token" - Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 46
[Credential-related source omitted] - Access to secretsline 52
[Credential-related source omitted]
budget-guardian/workflows/_shared/google_auth.py
budget-guardian/workflows/_shared/sheets_retry.py
- Executable scriptline 1
Executable file
budget-guardian/workflows/budget_guardian/__init__.py
- Executable scriptline 1
Executable file
budget-guardian/workflows/budget_guardian/ads_api.py
- Executable scriptline 1
Executable file - Network accessline 15
ADS_API_VERSION = "v23" ADS_BASE_URL = f"https://googleads.googleapis.com/{ADS_API_VERSION}" - Network accessline 16
ADS_BASE_URL = f"https://googleads.googleapis.com/{ADS_API_VERSION}" - Access to secretsline 19
[Credential-related source omitted] - Access to secretsline 21
[Credential-related source omitted] - Network accessline 30
url = f"{ADS_BASE_URL}/customers/{cid}/googleAds:search" body = {"query": query} resp = requests.post(url, json=body, headers=headers, timeout=60) - Network accessline 31
body = {"query": query} resp = requests.post(url, json=body, headers=headers, timeout=60) if resp.status_code != 200: - Network accessline 32
resp = requests.post(url, json=body, headers=headers, timeout=60) - Access to secretsline 44
[Credential-related source omitted] - Access to secretsline 50
[Credential-related source omitted]
budget-guardian/workflows/budget_guardian/main.py
budget-guardian/workflows/budget_guardian/setup_tabs.py
budget-guardian/workflows/budget_guardian/sheets_io.py
budget-guardian/workflows/budget_guardian/slack.py
budget-recommendation-calculator/README.md
- Network accessline 67
mkdir -p .claude/skills/budget-recommendation-calculator curl -o .claude/skills/budget-recommendation-calculator/SKILL.md \ - Network accessline 68
curl -o .claude/skills/budget-recommendation-calculator/SKILL.md \ - Network accessline 69
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/budget-recommendation-calculator/SKILL.md - Network accessline 101
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 103
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
budget-recommendation-calculator/SKILL.md
- Network accessline 450
Built by [Kurt Henninger](https://fourteenwebmedia.com). More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
change-history-checker/README.md
- Network accessline 37
mkdir -p .claude/skills/change-history-checker/scripts .claude/skills/change-history-checker/references for f in SKILL.md rules.md examples.md; do curl -o .claude/skills/change-history-checker/$f \ - Network accessline 38
for f in SKILL.md rules.md examples.md; do curl -o .claude/skills/change-history-checker/$f \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/change-history-checker/$f - Network accessline 39
curl -o .claude/skills/change-history-checker/$f \ - Network accessline 40
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/change-history-checker/$f done curl -o .claude/skills/change-history-checker/references/history-windows.md \ - Network accessline 41
done curl -o .claude/skills/change-history-checker/references/history-windows.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/change-history-checker/references/history-windows.md - Network accessline 42
curl -o .claude/skills/change-history-checker/references/history-windows.md \ - Network accessline 43
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/change-history-checker/references/history-windows.md curl -o .claude/skills/change-history-checker/scripts/check_change_history.py \ https://raw.githubusercontent.com/fourtee - Network accessline 44
curl -o .claude/skills/change-history-checker/scripts/check_change_history.py \ - Network accessline 45
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/change-history-checker/scripts/check_change_history.py - Network accessline 59
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 61
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
change-history-checker/SKILL.md
- Broad permissionsline 1
Bash
change-history-checker/scripts/check_change_history.py
- Executable scriptline 1
#!/usr/bin/env python3
client-communication-standards/README.md
- Network accessline 24
mkdir -p .claude/skills/client-communication-standards curl -o .claude/skills/client-communication-standards/SKILL.md \ - Network accessline 25
curl -o .claude/skills/client-communication-standards/SKILL.md \ - Network accessline 26
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/client-communication-standards/SKILL.md - Network accessline 37
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 39
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
competitor-analysis-v2/README.md
- Network accessline 37
templates/ads-angle-brief.md templates/template.css \ sales/service-page-copy.md; do curl -o ".claude/skills/competitor-analysis-v2/$f" \ - Network accessline 38
sales/service-page-copy.md; do curl -o ".claude/skills/competitor-analysis-v2/$f" \ "https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/competitor-analysis-v2/$f" - Network accessline 39
curl -o ".claude/skills/competitor-analysis-v2/$f" \ - Network accessline 40
"https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/competitor-analysis-v2/$f" - Network accessline 54
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 56
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
competitor-analysis-v2/SKILL.md
- Broad permissionsline 1
Bash - Network accessline 69
node .claude/skills/competitor-analysis-v2/scripts/screenshot.cjs \ https://client.com \ - Network accessline 70
https://client.com \ - Network accessline 71
https://competitor1.com https://competitor2.com https://competitor3.com \ - Network accessline 72
https://competitor4.com https://competitor5.com \ - Network accessline 234
templates/ads-angle-brief.md templates/template.css \ sales/service-page-copy.md; do curl -o ".claude/skills/competitor-analysis-v2/$f" \ - Network accessline 235
sales/service-page-copy.md; do curl -o ".claude/skills/competitor-analysis-v2/$f" \ "https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/competitor-analysis-v2/$f" - Network accessline 236
curl -o ".claude/skills/competitor-analysis-v2/$f" \ - Network accessline 237
"https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/competitor-analysis-v2/$f"
competitor-analysis-v2/examples.md
- Network accessline 32
node .claude/skills/competitor-analysis-v2/scripts/screenshot.cjs \ https://gearline.example.com https://redline.example.com https://summit.example.com \ - Network accessline 33
https://gearline.example.com https://redline.example.com https://summit.example.com \ - Network accessline 34
https://ironwood.example.com https://beacon.example.com https://milepost.example.com \ - Network accessline 42
[1] Navigating to: https://gearline.example.com - Network accessline 43
[1] Saved: deliverables/gearline/screenshots/1-gearline-example-com.png [2] Navigating to: https://redline.example.com [2] Saved: deliverables/gearline/screenshots/2-redline-example-com.png - Network accessline 44
[2] Navigating to: https://redline.example.com - Network accessline 45
[2] Saved: deliverables/gearline/screenshots/2-redline-example-com.png [3] Navigating to: https://summit.example.com [3] Saved: deliverables/gearline/screenshots/3-summit-example-com.png - Network accessline 46
[3] Navigating to: https://summit.example.com - Network accessline 47
[3] Saved: deliverables/gearline/screenshots/3-summit-example-com.png [4] Navigating to: https://ironwood.example.com [4] Error capturing https://ironwood.example.com: page.goto: Timeout 30000ms exceeded. - Network accessline 48
[4] Navigating to: https://ironwood.example.com - Network accessline 49
[4] Error capturing https://ironwood.example.com: page.goto: Timeout 30000ms exceeded. - Network accessline 50
[5] Navigating to: https://beacon.example.com - Network accessline 51
[5] Saved: deliverables/gearline/screenshots/5-beacon-example-com.png [6] Navigating to: https://milepost.example.com [6] Saved: deliverables/gearline/screenshots/6-milepost-example-com.png - Network accessline 52
[6] Navigating to: https://milepost.example.com - Network accessline 55
Retrying 1 failed URL(s) with bot evasion... [4] Navigating to: https://ironwood.example.com (retry with evasion) - Network accessline 56
[4] Navigating to: https://ironwood.example.com (retry with evasion)
competitor-analysis-v2/rules.md
- Network accessline 106
|---|---|---| | Screenshot run "succeeded" (exit 0) | Partial failure — exit 0 covers 3/6 | The `Screenshots captured: X/Y` line + `screenshots.json` | | 5 screenshots from a 6-URL command, no error | A schemeless URL silently dropped by th - Network accessline 107
| Screenshot run "succeeded" (exit 0) | Partial failure — exit 0 covers 3/6 | The `Screenshots captured: X/Y` line + `screenshots.json` | | 5 screenshots from a 6-URL command, no error | A schemeless URL silently dropped by the http-prefix - Network accessline 108
| 5 screenshots from a 6-URL command, no error | A schemeless URL silently dropped by the http-prefix filter | Every URL starts with `https://` |
competitor-analysis-v2/scripts/screenshot.cjs
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 144
console.error(' or: node screenshot.cjs --urls-file <file.txt> --output <folder>'); console.error('\nExample:'); console.error(' node screenshot.cjs https://client.com https://competitor1.com https://competitor2.com --out - Network accessline 145
console.error('\nExample:'); console.error(' node screenshot.cjs https://client.com https://competitor1.com https://competitor2.com --output /tmp/screenshots'); process.exit(1); - Network accessline 146
console.error(' node screenshot.cjs https://client.com https://competitor1.com https://competitor2.com --output /tmp/screenshots');
conversion-tracking-health/README.md
- Network accessline 24
mkdir -p .claude/skills/conversion-tracking-health/scripts .claude/skills/conversion-tracking-health/references for f in SKILL.md README.md rules.md examples.md; do curl -o .claude/skills/conversion-tracking-health/$f \ - Network accessline 25
for f in SKILL.md README.md rules.md examples.md; do curl -o .claude/skills/conversion-tracking-health/$f \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/conversion-tracking-health/$f - Network accessline 26
curl -o .claude/skills/conversion-tracking-health/$f \ - Network accessline 27
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/conversion-tracking-health/$f done curl -o .claude/skills/conversion-tracking-health/references/audit-contract.md \ - Network accessline 28
done curl -o .claude/skills/conversion-tracking-health/references/audit-contract.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/conversion-tracking-health/references/audit-contract.md - Network accessline 29
curl -o .claude/skills/conversion-tracking-health/references/audit-contract.md \ - Network accessline 30
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/conversion-tracking-health/references/audit-contract.md curl -o .claude/skills/conversion-tracking-health/scripts/portfolio_conversion_audit.py \ https://raw.githubuserconten - Network accessline 31
curl -o .claude/skills/conversion-tracking-health/scripts/portfolio_conversion_audit.py \ - Network accessline 32
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/conversion-tracking-health/scripts/portfolio_conversion_audit.py curl -o .claude/skills/conversion-tracking-health/scripts/last_conversion_dates_by_action.py \ https://raw.gi - Network accessline 33
curl -o .claude/skills/conversion-tracking-health/scripts/last_conversion_dates_by_action.py \ - Network accessline 34
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/conversion-tracking-health/scripts/last_conversion_dates_by_action.py - Network accessline 47
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 49
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
conversion-tracking-health/SKILL.md
- Broad permissionsline 1
Bash
conversion-tracking-health/scripts/last_conversion_dates_by_action.py
- Executable scriptline 1
Executable file
conversion-tracking-health/scripts/portfolio_conversion_audit.py
- Executable scriptline 1
#!/usr/bin/env python3
dgen-automation-disable/README.md
- Network accessline 25
mkdir -p .claude/skills/dgen-automation-disable/scripts .claude/skills/dgen-automation-disable/references for f in SKILL.md README.md rules.md examples.md; do curl -o .claude/skills/dgen-automation-disable/$f \ - Network accessline 26
for f in SKILL.md README.md rules.md examples.md; do curl -o .claude/skills/dgen-automation-disable/$f \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/dgen-automation-disable/$f - Network accessline 27
curl -o .claude/skills/dgen-automation-disable/$f \ - Network accessline 28
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/dgen-automation-disable/$f done curl -o .claude/skills/dgen-automation-disable/references/mutation-contract.md \ - Network accessline 29
done curl -o .claude/skills/dgen-automation-disable/references/mutation-contract.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/dgen-automation-disable/references/mutation-contract.md - Network accessline 30
curl -o .claude/skills/dgen-automation-disable/references/mutation-contract.md \ - Network accessline 31
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/dgen-automation-disable/references/mutation-contract.md curl -o .claude/skills/dgen-automation-disable/scripts/fix_dgen_ad_automation.py \ https://raw.githubusercontent.com/f - Network accessline 32
curl -o .claude/skills/dgen-automation-disable/scripts/fix_dgen_ad_automation.py \ - Network accessline 33
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/dgen-automation-disable/scripts/fix_dgen_ad_automation.py - Network accessline 47
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 49
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
dgen-automation-disable/SKILL.md
- Broad permissionsline 1
Bash - Network accessline 143
mkdir -p .claude/skills/dgen-automation-disable/scripts .claude/skills/dgen-automation-disable/references for f in SKILL.md README.md rules.md examples.md; do curl -o .claude/skills/dgen-automation-disable/$f \ - Network accessline 144
for f in SKILL.md README.md rules.md examples.md; do curl -o .claude/skills/dgen-automation-disable/$f \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/dgen-automation-disable/$f - Network accessline 145
curl -o .claude/skills/dgen-automation-disable/$f \ - Network accessline 146
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/dgen-automation-disable/$f done curl -o .claude/skills/dgen-automation-disable/references/mutation-contract.md \ - Network accessline 147
done curl -o .claude/skills/dgen-automation-disable/references/mutation-contract.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/dgen-automation-disable/references/mutation-contract.md - Network accessline 148
curl -o .claude/skills/dgen-automation-disable/references/mutation-contract.md \ - Network accessline 149
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/dgen-automation-disable/references/mutation-contract.md curl -o .claude/skills/dgen-automation-disable/scripts/fix_dgen_ad_automation.py \ https://raw.githubusercontent.com/f - Network accessline 150
curl -o .claude/skills/dgen-automation-disable/scripts/fix_dgen_ad_automation.py \ - Network accessline 151
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/dgen-automation-disable/scripts/fix_dgen_ad_automation.py
dgen-automation-disable/scripts/fix_dgen_ad_automation.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 173
[Credential-related source omitted] - Network accessline 174
[Credential-related source omitted] - Network accessline 175
token_uri='https://oauth2.googleapis.com/token', - Network accessline 176
[Credential-related source omitted] - Network accessline 177
[Credential-related source omitted] - Access to secretsline 177
[Credential-related source omitted] - Network accessline 178
scopes=['https://www.googleapis.com/auth/spreadsheets'], - Network accessline 644
print(f"\nLogged to: {mutation_logger.jsonl_log}") if args.log_sheet_id: print(f"Sheet log: https://docs.google.com/spreadsheets/d/{args.log_sheet_id}") - Network accessline 645
if args.log_sheet_id: print(f"Sheet log: https://docs.google.com/spreadsheets/d/{args.log_sheet_id}") print("=" * 80) - Network accessline 646
print(f"Sheet log: https://docs.google.com/spreadsheets/d/{args.log_sheet_id}")
fair-housing-compliance/README.md
- Network accessline 43
mkdir -p .claude/skills/fair-housing-compliance curl -o .claude/skills/fair-housing-compliance/SKILL.md \ - Network accessline 44
curl -o .claude/skills/fair-housing-compliance/SKILL.md \ - Network accessline 45
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/fair-housing-compliance/SKILL.md - Network accessline 75
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 77
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
ga4-campaign-cross-reference/README.md
- Network accessline 24
mkdir -p .claude/skills/ga4-campaign-cross-reference curl -o .claude/skills/ga4-campaign-cross-reference/SKILL.md \ - Network accessline 25
curl -o .claude/skills/ga4-campaign-cross-reference/SKILL.md \ - Network accessline 26
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ga4-campaign-cross-reference/SKILL.md - Network accessline 37
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 39
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
ga4-cross-analysis/README.md
- Network accessline 25
for f in SKILL.md README.md rules.md examples.md references/collection-contract.md \ scripts/query_campaign_settings.py; do curl -o ".claude/skills/ga4-cross-analysis/$f" \ - Network accessline 26
scripts/query_campaign_settings.py; do curl -o ".claude/skills/ga4-cross-analysis/$f" \ "https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ga4-cross-analysis/$f" - Network accessline 27
curl -o ".claude/skills/ga4-cross-analysis/$f" \ - Network accessline 28
"https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ga4-cross-analysis/$f" - Network accessline 61
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 63
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
ga4-cross-analysis/SKILL.md
- Broad permissionsline 1
Bash
ga4-cross-analysis/references/collection-contract.md
- Network accessline 109
2. Reuse the same OAuth client as the Google Ads API — but note that **scopes are fixed when a refresh token is minted; you cannot add a scope to an existing token.** Add `https://www.googleapis.com/auth/analytics.readonly` to the `SC - Network accessline 110
when a refresh token is minted; you cannot add a scope to an existing token.** Add `https://www.googleapis.com/auth/analytics.readonly` to the `SCOPES` list in the [google-ads-api-setup](../../google-ads-api-setup/) skill's `generate_ - Network accessline 111
`https://www.googleapis.com/auth/analytics.readonly` to the `SCOPES` list in the - Network accessline 126
GA4 Data API reference: https://developers.google.com/analytics/devguides/reporting/data/v1
ga4-cross-analysis/scripts/query_campaign_settings.py
ga4-lead-quality-investigation/README.md
- Network accessline 25
mkdir -p .claude/skills/ga4-lead-quality-investigation curl -o .claude/skills/ga4-lead-quality-investigation/SKILL.md \ - Network accessline 26
curl -o .claude/skills/ga4-lead-quality-investigation/SKILL.md \ - Network accessline 27
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ga4-lead-quality-investigation/SKILL.md curl -o .claude/skills/ga4-lead-quality-investigation/README.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ga4- - Network accessline 28
curl -o .claude/skills/ga4-lead-quality-investigation/README.md \ - Network accessline 29
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ga4-lead-quality-investigation/README.md - Network accessline 37
client-communication-standards; do mkdir -p .claude/skills/$skill curl -o .claude/skills/$skill/SKILL.md \ - Network accessline 38
mkdir -p .claude/skills/$skill curl -o .claude/skills/$skill/SKILL.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/$skill/SKILL.md - Network accessline 39
curl -o .claude/skills/$skill/SKILL.md \ - Network accessline 40
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/$skill/SKILL.md
ga4-lead-quality-investigation/SKILL.md
- Broad permissionsline 1
Bash
gaql-query-patterns/README.md
geo-conflict-analyzer/README.md
- Network accessline 35
mkdir -p .claude/skills/geo-conflict-analyzer/scripts .claude/skills/geo-conflict-analyzer/references for f in SKILL.md README.md prompt.md rules.md examples.md; do curl -o .claude/skills/geo-conflict-analyzer/$f \ - Network accessline 36
for f in SKILL.md README.md prompt.md rules.md examples.md; do curl -o .claude/skills/geo-conflict-analyzer/$f \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/geo-conflict-analyzer/$f - Network accessline 37
curl -o .claude/skills/geo-conflict-analyzer/$f \ - Network accessline 38
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/geo-conflict-analyzer/$f done curl -o .claude/skills/geo-conflict-analyzer/references/analysis-contract.md \ - Network accessline 39
done curl -o .claude/skills/geo-conflict-analyzer/references/analysis-contract.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/geo-conflict-analyzer/references/analysis-contract.md - Network accessline 40
curl -o .claude/skills/geo-conflict-analyzer/references/analysis-contract.md \ - Network accessline 41
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/geo-conflict-analyzer/references/analysis-contract.md curl -o .claude/skills/geo-conflict-analyzer/scripts/analyze.py \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-sk - Network accessline 42
curl -o .claude/skills/geo-conflict-analyzer/scripts/analyze.py \ - Network accessline 43
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/geo-conflict-analyzer/scripts/analyze.py - Access to secretsline 55
[Credential-related source omitted] - Network accessline 89
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 91
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
geo-conflict-analyzer/SKILL.md
geo-conflict-analyzer/references/analysis-contract.md
- Access to secretsline 93
[Credential-related source omitted]
geo-conflict-analyzer/scripts/analyze.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 15
[Credential-related source omitted] - Access to secretsline 47
[Credential-related source omitted] - Access to secretsline 49
[Credential-related source omitted] - Access to secretsline 50
[Credential-related source omitted] - Access to secretsline 52
[Credential-related source omitted] - Access to secretsline 54
[Credential-related source omitted] - Network accessline 67
creds = Credentials.from_authorized_user_file( str(token_file), scopes=["https://www.googleapis.com/auth/spreadsheets"] - Network accessline 68
str(token_file), scopes=["https://www.googleapis.com/auth/spreadsheets"] ) - Network accessline 69
scopes=["https://www.googleapis.com/auth/spreadsheets"]
google-ads-api-setup/README.md
- Network accessline 25
- Google Ads account with **MCC (Manager) access** - Google Cloud account (free: [console.cloud.google.com](https://console.cloud.google.com)) - Network accessline 26
- Google Cloud account (free: [console.cloud.google.com](https://console.cloud.google.com)) - Network accessline 34
- **Use the same Google account everywhere in this guide** — the one that has access to your MCC. Cloud Console, OAuth authorization, all of it. Mixing accounts is the #1 source of "permission denied" errors later. Not sure which account th - Access to secretsline 56
[Credential-related source omitted] - Network accessline 58
The `.mmd` sources for both diagrams live in `diagrams/` — they're [Mermaid](https://mermaid.js.org/) diagram-as-code, rendered with the included theme. - Network accessline 64
1. Go to [console.cloud.google.com](https://console.cloud.google.com) - Access to secretsline 135
[Credential-related source omitted] - Network accessline 147
1. Log into Google Ads at [ads.google.com](https://ads.google.com) - Network accessline 148
2. Navigate to your **MCC account** (the top-level manager account) 3. Click **Admin** (gear icon in the left nav) → **API Center**. (Shortcut: [ads.google.com/aw/apicenter](https://ads.google.com/aw/apicenter). On the older UI: wrench icon - Network accessline 149
3. Click **Admin** (gear icon in the left nav) → **API Center**. (Shortcut: [ads.google.com/aw/apicenter](https://ads.google.com/aw/apicenter). On the older UI: wrench icon "Tools & Settings" → **Setup → API Center**.) - Access to secretsline 177
[Credential-related source omitted] - Access to secretsline 208
[Credential-related source omitted] - Access to secretsline 210
[Credential-related source omitted] - Access to secretsline 224
[Credential-related source omitted] - Network accessline 226
**Where to find your MCC ID:** Log into [ads.google.com](https://ads.google.com) in MCC view — the top-right shows it as `123-456-7890`. Strip the dashes: `1234567890`. - Access to secretsline 264
[Credential-related source omitted] - Access to secretsline 298
[Credential-related source omitted] - Network accessline 299
- Add both to your `.gitignore` - Your refresh token grants full access to your Google Ads accounts — plus, with the scopes from Step 7, read/write access to your Google Sheets and read access to your Drive file listing. Treat it like a pas - Network accessline 301
- If you suspect a token is compromised, revoke it at [myaccount.google.com/permissions](https://myaccount.google.com/permissions) - Network accessline 313
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 315
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
google-ads-api-setup/SKILL.md
- Broad permissionsline 1
Bash - Access to secretsline 65
[Credential-related source omitted] - Access to secretsline 76
[Credential-related source omitted] - Access to secretsline 107
[Credential-related source omitted] - Network accessline 108
[Credential-related source omitted] - Access to secretsline 108
[Credential-related source omitted] - Network accessline 110
- Revoke compromised tokens at [myaccount.google.com/permissions](https://myaccount.google.com/permissions) - Network accessline 127
git clone https://github.com/fourteenwm/ppc-ai-skills.git
google-ads-api-setup/diagrams/README.md
google-ads-api-setup/diagrams/setup-flow.mmd
google-ads-api-setup/diagrams/setup-flow.svg
- Network accessline 1
<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="flowchart" style="max-width: 1651.46px; background-color: rgb(10, 10, 15);" viewBox="0 0 1651.458984375 1106.125" role="graph
google-ads-api-setup/diagrams/workflow-hero.mmd
- Access to secretsline 12
[Credential-related source omitted]
google-ads-api-setup/diagrams/workflow-hero.svg
- Network accessline 1
<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="max-width: 933.5px; background-color: rgb(10, 10, 15);" viewBox="-50 -10 933.5 988" role="graphics-document document" aria-ro
google-ads-api-setup/generate_credentials.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 7
[Credential-related source omitted] - Network accessline 31
SCOPES = [ "https://www.googleapis.com/auth/adwords", # Google Ads API - Network accessline 32
"https://www.googleapis.com/auth/adwords", # Google Ads API - Network accessline 33
"https://www.googleapis.com/auth/spreadsheets", # read/write report sheets - Network accessline 34
"https://www.googleapis.com/auth/drive.readonly", # locate sheets (gspread) - Access to secretsline 45
[Credential-related source omitted] - Access to secretsline 63
[Credential-related source omitted] - Access to secretsline 75
[Credential-related source omitted]
google-ads-api-setup/google-ads.example.yaml
google-ads-api-setup/test_connection.py
google-ads-query/README.md
- Network accessline 24
mkdir -p .claude/skills/google-ads-query/scripts .claude/skills/google-ads-query/references for f in SKILL.md rules.md examples.md accounts.example.json; do curl -o .claude/skills/google-ads-query/$f \ - Network accessline 25
for f in SKILL.md rules.md examples.md accounts.example.json; do curl -o .claude/skills/google-ads-query/$f \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/google-ads-query/$f - Network accessline 26
curl -o .claude/skills/google-ads-query/$f \ - Network accessline 27
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/google-ads-query/$f done curl -o .claude/skills/google-ads-query/scripts/query.py \ - Network accessline 28
done curl -o .claude/skills/google-ads-query/scripts/query.py \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/google-ads-query/scripts/query.py - Network accessline 29
curl -o .claude/skills/google-ads-query/scripts/query.py \ - Network accessline 30
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/google-ads-query/scripts/query.py for r in resources.md query-contract.md; do curl -o .claude/skills/google-ads-query/references/$r \ - Network accessline 31
for r in resources.md query-contract.md; do curl -o .claude/skills/google-ads-query/references/$r \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/google-ads-query/references/$r - Network accessline 32
curl -o .claude/skills/google-ads-query/references/$r \ - Network accessline 33
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/google-ads-query/references/$r - Network accessline 34
done for t in search-terms campaigns keywords ad-groups conversions budgets assets geo; do curl -o .claude/skills/google-ads-query/references/$t.gaql \ - Network accessline 35
for t in search-terms campaigns keywords ad-groups conversions budgets assets geo; do curl -o .claude/skills/google-ads-query/references/$t.gaql \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/google-ads-query/refere - Network accessline 36
curl -o .claude/skills/google-ads-query/references/$t.gaql \ - Network accessline 37
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/google-ads-query/references/$t.gaql - Network accessline 63
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 65
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
google-ads-query/SKILL.md
- Broad permissionsline 1
Bash
google-ads-query/scripts/query.py
- Executable scriptline 1
#!/usr/bin/env python3
google-ads-samples/README.md
- Network accessline 24
mkdir -p .claude/skills/google-ads-samples curl -o .claude/skills/google-ads-samples/SKILL.md \ - Network accessline 25
curl -o .claude/skills/google-ads-samples/SKILL.md \ - Network accessline 26
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/google-ads-samples/SKILL.md - Network accessline 37
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 39
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
google-ads-samples/SKILL.md
- Network accessline 31
git clone https://github.com/googleads/google-ads-python.git - Network accessline 336
- Links to official Google Ads API docs — see [developers.google.com/google-ads/api/docs](https://developers.google.com/google-ads/api/docs) - Network accessline 337
- [google-ads-python/examples/README.md](../../google-ads-python/examples/README.md) - Safety warnings and usage guide - GitHub: https://github.com/googleads/google-ads-python - Samples index: https://developers.google.com/google-ads/api/sa - Network accessline 338
- GitHub: https://github.com/googleads/google-ads-python - Network accessline 339
- Samples index: https://developers.google.com/google-ads/api/samples
impression-share-diagnostics/README.md
- Network accessline 38
mkdir -p .claude/skills/impression-share-diagnostics curl -o .claude/skills/impression-share-diagnostics/SKILL.md \ - Network accessline 39
curl -o .claude/skills/impression-share-diagnostics/SKILL.md \ - Network accessline 40
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/impression-share-diagnostics/SKILL.md - Network accessline 73
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 75
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
impression-share-diagnostics/SKILL.md
- Network accessline 477
Built by [Kurt Henninger](https://fourteenwebmedia.com). More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
investigation-methodology/README.md
- Network accessline 25
The `.mmd` sources for both diagrams live in `diagrams/` — they're [Mermaid](https://mermaid.js.org/) diagram-as-code, rendered with the included - Network accessline 26
[Mermaid](https://mermaid.js.org/) diagram-as-code, rendered with the included - Network accessline 66
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 68
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
investigation-methodology/diagrams/README.md
investigation-methodology/diagrams/run-logic.svg
- Network accessline 1
<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="flowchart" style="max-width: 1439.68px; background-color: rgb(10, 10, 15);" viewBox="0 0 1439.6796875 705.1875" role="graphic
investigation-methodology/diagrams/workflow-hero.svg
- Network accessline 1
<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="max-width: 849px; background-color: rgb(10, 10, 15);" viewBox="-50 -10 849 841" role="graphics-document document" aria-rolede
lead-quality-pattern-analysis/README.md
- Network accessline 59
mkdir -p .claude/skills/lead-quality-pattern-analysis curl -o .claude/skills/lead-quality-pattern-analysis/SKILL.md \ - Network accessline 60
curl -o .claude/skills/lead-quality-pattern-analysis/SKILL.md \ - Network accessline 61
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/lead-quality-pattern-analysis/SKILL.md - Network accessline 92
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 94
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
lead-quality-pattern-analysis/SKILL.md
- Network accessline 472
Built by [Kurt Henninger](https://fourteenwebmedia.com). More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
lead-quality-recommendation-prioritization/README.md
- Network accessline 25
mkdir -p .claude/skills/lead-quality-recommendation-prioritization curl -o .claude/skills/lead-quality-recommendation-prioritization/SKILL.md \ - Network accessline 26
curl -o .claude/skills/lead-quality-recommendation-prioritization/SKILL.md \ - Network accessline 27
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/lead-quality-recommendation-prioritization/SKILL.md - Network accessline 38
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 40
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
markdown-to-sheets-presenter/README.md
- Network accessline 29
mkdir -p .claude/skills/markdown-to-sheets-presenter/scripts .claude/skills/markdown-to-sheets-presenter/templates .claude/skills/markdown-to-sheets-presenter/references for f in SKILL.md README.md SETUP.md rules.md examples.md; do curl - - Network accessline 30
for f in SKILL.md README.md SETUP.md rules.md examples.md; do curl -o .claude/skills/markdown-to-sheets-presenter/$f \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/markdown-to-sheets-presenter/$f - Network accessline 31
curl -o .claude/skills/markdown-to-sheets-presenter/$f \ - Network accessline 32
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/markdown-to-sheets-presenter/$f done curl -o .claude/skills/markdown-to-sheets-presenter/references/presentation-contract.md \ - Network accessline 33
done curl -o .claude/skills/markdown-to-sheets-presenter/references/presentation-contract.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/markdown-to-sheets-presenter/references/presentation-contract.md - Network accessline 34
curl -o .claude/skills/markdown-to-sheets-presenter/references/presentation-contract.md \ - Network accessline 35
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/markdown-to-sheets-presenter/references/presentation-contract.md curl -o .claude/skills/markdown-to-sheets-presenter/scripts/create_spreadsheet.py \ https://raw.githubusercon - Network accessline 36
curl -o .claude/skills/markdown-to-sheets-presenter/scripts/create_spreadsheet.py \ - Network accessline 37
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/markdown-to-sheets-presenter/scripts/create_spreadsheet.py curl -o .claude/skills/markdown-to-sheets-presenter/templates/professional-blue-theme.json \ https://raw.githubuser - Network accessline 38
curl -o .claude/skills/markdown-to-sheets-presenter/templates/professional-blue-theme.json \ - Network accessline 39
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/markdown-to-sheets-presenter/templates/professional-blue-theme.json - Network accessline 52
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 54
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
markdown-to-sheets-presenter/SKILL.md
- Broad permissionsline 1
Bash
markdown-to-sheets-presenter/examples.md
- Network accessline 29
"id": "<spreadsheet-id>", "name": "Gearline Auto Group - Competitive Analysis - 2026-07-31", "webViewLink": "https://docs.google.com/spreadsheets/d/<spreadsheet-id>/edit" - Network accessline 30
"name": "Gearline Auto Group - Competitive Analysis - 2026-07-31", "webViewLink": "https://docs.google.com/spreadsheets/d/<spreadsheet-id>/edit" } - Network accessline 31
"webViewLink": "https://docs.google.com/spreadsheets/d/<spreadsheet-id>/edit" - Network accessline 34
Sheet URL: https://docs.google.com/spreadsheets/d/<spreadsheet-id>/edit
markdown-to-sheets-presenter/references/presentation-contract.md
- Access to secretsline 68
[Credential-related source omitted]
markdown-to-sheets-presenter/scripts/create_spreadsheet.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 60
[Credential-related source omitted] - Network accessline 61
[Credential-related source omitted] - Network accessline 62
token_uri="https://oauth2.googleapis.com/token", - Network accessline 63
[Credential-related source omitted] - Network accessline 64
[Credential-related source omitted] - Access to secretsline 64
[Credential-related source omitted] - Network accessline 65
scopes=["https://www.googleapis.com/auth/spreadsheets"],
mcc-hack-audit/README.md
- Network accessline 27
mkdir -p .claude/skills/mcc-hack-audit/scripts .claude/skills/mcc-hack-audit/references for f in SKILL.md rules.md examples.md; do curl -o .claude/skills/mcc-hack-audit/$f \ - Network accessline 28
for f in SKILL.md rules.md examples.md; do curl -o .claude/skills/mcc-hack-audit/$f \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/mcc-hack-audit/$f - Network accessline 29
curl -o .claude/skills/mcc-hack-audit/$f \ - Network accessline 30
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/mcc-hack-audit/$f done curl -o .claude/skills/mcc-hack-audit/references/scan-contract.md \ - Network accessline 31
done curl -o .claude/skills/mcc-hack-audit/references/scan-contract.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/mcc-hack-audit/references/scan-contract.md - Network accessline 32
curl -o .claude/skills/mcc-hack-audit/references/scan-contract.md \ - Network accessline 33
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/mcc-hack-audit/references/scan-contract.md curl -o .claude/skills/mcc-hack-audit/scripts/mcc_hack_audit.py \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/m - Network accessline 34
curl -o .claude/skills/mcc-hack-audit/scripts/mcc_hack_audit.py \ - Network accessline 35
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/mcc-hack-audit/scripts/mcc_hack_audit.py - Network accessline 83
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 85
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
mcc-hack-audit/SKILL.md
- Broad permissionsline 1
Bash
mcc-hack-audit/scripts/mcc_hack_audit.py
mutation-safety/README.md
- Network accessline 45
The `.mmd` sources for both diagrams live in `diagrams/` — they're [Mermaid](https://mermaid.js.org/) diagram-as-code, rendered with the included - Network accessline 46
[Mermaid](https://mermaid.js.org/) diagram-as-code, rendered with the included - Network accessline 91
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 93
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
mutation-safety/diagrams/README.md
mutation-safety/diagrams/run-logic.svg
- Network accessline 1
<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="flowchart" style="max-width: 1503.07px; background-color: rgb(10, 10, 15);" viewBox="0 0 1503.0653076171875 862.265625" role=
mutation-safety/diagrams/workflow-hero.svg
- Network accessline 1
<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="max-width: 914px; background-color: rgb(10, 10, 15);" viewBox="-50 -10 914 764" role="graphics-document document" aria-rolede
neg-conflict-finder/README.md
- Network accessline 86
This script is a derivative of Google's official Negative Keyword Conflict reference script (see Apache 2.0 license header in the source). Modifications by [Kurt Henninger](https://fourteenwebmedia.com): - Network accessline 114
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 116
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
neg-conflict-finder/scripts/mcc-neg-keyword-conflict.js
- Executable scriptline 1
Executable file - Network accessline 4
* * Derivative work by Kurt Henninger / Fourteen Web Media * https://fourteenwebmedia.com · https://github.com/fourteenwm/ppc-ai-skills - Network accessline 5
* Derivative work by Kurt Henninger / Fourteen Web Media * https://fourteenwebmedia.com · https://github.com/fourteenwm/ppc-ai-skills * - Network accessline 6
* https://fourteenwebmedia.com · https://github.com/fourteenwm/ppc-ai-skills - Network accessline 25
// You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 - Network accessline 26
// // https://www.apache.org/licenses/LICENSE-2.0 // - Network accessline 27
// https://www.apache.org/licenses/LICENSE-2.0
non-serving-keyword-scanner/README.md
- Network accessline 25
The `.mmd` sources for both diagrams live in `diagrams/` — they're [Mermaid](https://mermaid.js.org/) diagram-as-code, rendered with the included - Network accessline 26
[Mermaid](https://mermaid.js.org/) diagram-as-code, rendered with the included - Network accessline 34
mkdir -p .claude/skills/non-serving-keyword-scanner/scripts .claude/skills/non-serving-keyword-scanner/references curl -o .claude/skills/non-serving-keyword-scanner/SKILL.md \ - Network accessline 35
curl -o .claude/skills/non-serving-keyword-scanner/SKILL.md \ - Network accessline 36
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/non-serving-keyword-scanner/SKILL.md curl -o .claude/skills/non-serving-keyword-scanner/scripts/non_serving_keyword_scan.py \ https://raw.githubusercontent.com/fourteenwm/ppc - Network accessline 37
curl -o .claude/skills/non-serving-keyword-scanner/scripts/non_serving_keyword_scan.py \ - Network accessline 38
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/non-serving-keyword-scanner/scripts/non_serving_keyword_scan.py curl -o .claude/skills/non-serving-keyword-scanner/accounts.example.md \ https://raw.githubusercontent.com/fou - Network accessline 39
curl -o .claude/skills/non-serving-keyword-scanner/accounts.example.md \ - Network accessline 40
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/non-serving-keyword-scanner/accounts.example.md curl -o .claude/skills/non-serving-keyword-scanner/rules.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ - Network accessline 41
curl -o .claude/skills/non-serving-keyword-scanner/rules.md \ - Network accessline 42
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/non-serving-keyword-scanner/rules.md curl -o .claude/skills/non-serving-keyword-scanner/examples.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/non-serv - Network accessline 43
curl -o .claude/skills/non-serving-keyword-scanner/examples.md \ - Network accessline 44
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/non-serving-keyword-scanner/examples.md curl -o .claude/skills/non-serving-keyword-scanner/references/scan-contract.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-s - Network accessline 45
curl -o .claude/skills/non-serving-keyword-scanner/references/scan-contract.md \ - Network accessline 46
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/non-serving-keyword-scanner/references/scan-contract.md - Network accessline 68
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 70
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
non-serving-keyword-scanner/SKILL.md
- Broad permissionsline 1
Bash
non-serving-keyword-scanner/diagrams/README.md
non-serving-keyword-scanner/diagrams/run-logic.svg
- Network accessline 1
<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="flowchart" style="max-width: 1586.05px; background-color: rgb(10, 10, 15);" viewBox="0 0 1586.050048828125 762.484375" role="
non-serving-keyword-scanner/diagrams/workflow-hero.svg
- Network accessline 1
<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="max-width: 1196px; background-color: rgb(10, 10, 15);" viewBox="-50 -10 1196 701" role="graphics-document document" aria-role
non-serving-keyword-scanner/scripts/non_serving_keyword_scan.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 162
Requires the refresh token in google-ads.yaml to include these scopes: - https://www.googleapis.com/auth/spreadsheets - Network accessline 163
- https://www.googleapis.com/auth/spreadsheets - Network accessline 164
- https://www.googleapis.com/auth/drive.readonly - Network accessline 170
[Credential-related source omitted] - Network accessline 171
[Credential-related source omitted] - Network accessline 172
token_uri="https://oauth2.googleapis.com/token", - Network accessline 174
[Credential-related source omitted] - Access to secretsline 174
[Credential-related source omitted] - Network accessline 175
scopes=[ "https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/drive.readonly", - Network accessline 176
"https://www.googleapis.com/auth/spreadsheets", - Network accessline 177
"https://www.googleapis.com/auth/drive.readonly", - Network accessline 435
raise print(f"\nResults written to:") print(f"https://docs.google.com/spreadsheets/d/{args.sheet_id}/edit") - Network accessline 436
print(f"\nResults written to:") print(f"https://docs.google.com/spreadsheets/d/{args.sheet_id}/edit") else: - Network accessline 437
print(f"https://docs.google.com/spreadsheets/d/{args.sheet_id}/edit")
pmax-asset-automation/README.md
- Network accessline 27
mkdir -p .claude/skills/pmax-asset-automation/scripts .claude/skills/pmax-asset-automation/references for f in SKILL.md README.md rules.md examples.md; do curl -o .claude/skills/pmax-asset-automation/$f \ - Network accessline 28
for f in SKILL.md README.md rules.md examples.md; do curl -o .claude/skills/pmax-asset-automation/$f \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/pmax-asset-automation/$f - Network accessline 29
curl -o .claude/skills/pmax-asset-automation/$f \ - Network accessline 30
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/pmax-asset-automation/$f done curl -o .claude/skills/pmax-asset-automation/references/audit-contract.md \ - Network accessline 31
done curl -o .claude/skills/pmax-asset-automation/references/audit-contract.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/pmax-asset-automation/references/audit-contract.md - Network accessline 32
curl -o .claude/skills/pmax-asset-automation/references/audit-contract.md \ - Network accessline 33
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/pmax-asset-automation/references/audit-contract.md curl -o .claude/skills/pmax-asset-automation/scripts/audit_pmax_asset_automation.py \ https://raw.githubusercontent.com/fou - Network accessline 34
curl -o .claude/skills/pmax-asset-automation/scripts/audit_pmax_asset_automation.py \ - Network accessline 35
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/pmax-asset-automation/scripts/audit_pmax_asset_automation.py - Network accessline 49
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 51
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
pmax-asset-automation/SKILL.md
- Network accessline 134
mkdir -p .claude/skills/pmax-asset-automation/scripts .claude/skills/pmax-asset-automation/references for f in SKILL.md README.md rules.md examples.md; do curl -o .claude/skills/pmax-asset-automation/$f \ - Network accessline 135
for f in SKILL.md README.md rules.md examples.md; do curl -o .claude/skills/pmax-asset-automation/$f \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/pmax-asset-automation/$f - Network accessline 136
curl -o .claude/skills/pmax-asset-automation/$f \ - Network accessline 137
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/pmax-asset-automation/$f done curl -o .claude/skills/pmax-asset-automation/references/audit-contract.md \ - Network accessline 138
done curl -o .claude/skills/pmax-asset-automation/references/audit-contract.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/pmax-asset-automation/references/audit-contract.md - Network accessline 139
curl -o .claude/skills/pmax-asset-automation/references/audit-contract.md \ - Network accessline 140
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/pmax-asset-automation/references/audit-contract.md curl -o .claude/skills/pmax-asset-automation/scripts/audit_pmax_asset_automation.py \ https://raw.githubusercontent.com/fou - Network accessline 141
curl -o .claude/skills/pmax-asset-automation/scripts/audit_pmax_asset_automation.py \ - Network accessline 142
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/pmax-asset-automation/scripts/audit_pmax_asset_automation.py
pmax-asset-automation/scripts/audit_pmax_asset_automation.py
- Executable scriptline 1
Executable file
pmax-builder/README.md
- Network accessline 33
mkdir -p .claude/skills/pmax-builder/scripts .claude/skills/pmax-builder/templates .claude/skills/pmax-builder/references for f in SKILL.md README.md rules.md examples.md; do curl -o .claude/skills/pmax-builder/$f \ - Network accessline 34
for f in SKILL.md README.md rules.md examples.md; do curl -o .claude/skills/pmax-builder/$f \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/pmax-builder/$f - Network accessline 35
curl -o .claude/skills/pmax-builder/$f \ - Network accessline 36
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/pmax-builder/$f done curl -o .claude/skills/pmax-builder/references/build-contract.md \ - Network accessline 37
done curl -o .claude/skills/pmax-builder/references/build-contract.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/pmax-builder/references/build-contract.md - Network accessline 38
curl -o .claude/skills/pmax-builder/references/build-contract.md \ - Network accessline 39
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/pmax-builder/references/build-contract.md curl -o .claude/skills/pmax-builder/scripts/build_pmax_csv.py \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/pmax - Network accessline 40
curl -o .claude/skills/pmax-builder/scripts/build_pmax_csv.py \ - Network accessline 41
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/pmax-builder/scripts/build_pmax_csv.py curl -o .claude/skills/pmax-builder/scripts/scrape_website_firecrawl.py \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/ma - Network accessline 42
curl -o .claude/skills/pmax-builder/scripts/scrape_website_firecrawl.py \ - Network accessline 43
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/pmax-builder/scripts/scrape_website_firecrawl.py curl -o .claude/skills/pmax-builder/templates/campaign_settings.json \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-sk - Network accessline 44
curl -o .claude/skills/pmax-builder/templates/campaign_settings.json \ - Network accessline 45
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/pmax-builder/templates/campaign_settings.json curl -o .claude/skills/pmax-builder/templates/search_themes.json \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/ma - Network accessline 46
curl -o .claude/skills/pmax-builder/templates/search_themes.json \ - Network accessline 47
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/pmax-builder/templates/search_themes.json curl -o .claude/skills/pmax-builder/templates/audience_signals.json \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/mai - Network accessline 48
curl -o .claude/skills/pmax-builder/templates/audience_signals.json \ - Network accessline 49
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/pmax-builder/templates/audience_signals.json curl -o .claude/skills/pmax-builder/templates/negative_locations.json \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skill - Network accessline 50
curl -o .claude/skills/pmax-builder/templates/negative_locations.json \ - Network accessline 51
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/pmax-builder/templates/negative_locations.json - Network accessline 65
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 67
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
pmax-builder/SKILL.md
- Broad permissionsline 1
Bash - Network accessline 170
https://youtu.be/a8Nr45dNL50 -> a8Nr45dNL50 - Network accessline 171
https://youtu.be/GFIOY7vdf4k -> GFIOY7vdf4k - Network accessline 200
python3 .claude/skills/pmax-builder/scripts/build_pmax_csv.py --campaign-name "Pmax: Acme Plumbing" --asset-group-name "General" --business-name "Acme Plumbing" --final-url "https://www.acmeplumbing.com/" - Network accessline 202
--asset-group-name "General" \ --business-name "Acme Plumbing" \ --final-url "https://www.acmeplumbing.com/" \ - Network accessline 203
--business-name "Acme Plumbing" \ --final-url "https://www.acmeplumbing.com/" \ --city "Dallas" --state "TX" \ - Network accessline 204
--final-url "https://www.acmeplumbing.com/" \
pmax-builder/examples.md
- Network accessline 24
One root, and it isn't the guessed one — `lindenmoor.com` would have built the campaign against a domain Search has never used. `--final-url` will be `https://www.lindenmoorflats.com/`. - Network accessline 26
`https://www.lindenmoorflats.com/`. - Network accessline 31
python3 .claude/skills/pmax-builder/scripts/build_pmax_csv.py --campaign-name "Pmax: Lindenmoor Flats" --business-name "Lindenmoor Flats" --final-url "https://www.lindenmoorflats.com/" - Network accessline 33
--business-name "Lindenmoor Flats" \ --final-url "https://www.lindenmoorflats.com/" \ - Network accessline 34
--final-url "https://www.lindenmoorflats.com/" \ - Network accessline 62
Asset Group: General Business: Lindenmoor Flats URL: https://www.lindenmoorflats.com/ - Network accessline 63
Business: Lindenmoor Flats URL: https://www.lindenmoorflats.com/ Location: Columbus, OH (40mi radius) - Network accessline 64
URL: https://www.lindenmoorflats.com/ - Network accessline 117
python3 .claude/skills/pmax-builder/scripts/build_pmax_csv.py --campaign-name "Pmax: Gearline Auto Repair" --business-name "Gearline Auto Repair" --final-url "https://www.gearlineauto.com/" - Network accessline 119
--business-name "Gearline Auto Repair" \ --final-url "https://www.gearlineauto.com/" \ - Network accessline 120
--final-url "https://www.gearlineauto.com/" \ - Network accessline 125
--long-headlines "Full Service Auto Repair Shop in Mesa|..." \ --descriptions "Family owned auto repair.|..." \ --video-ids "https://youtube.com/shorts/Xy7zAbCdEfg|aB3dEfGhIjk" \ - Network accessline 126
--descriptions "Family owned auto repair.|..." \ --video-ids "https://youtube.com/shorts/Xy7zAbCdEfg|aB3dEfGhIjk" \ --remarketing-segments "Gearline Auto Repair;All visitors (AdWords);All Users of 12345 | Gearline - BLP" \ - Network accessline 127
--video-ids "https://youtube.com/shorts/Xy7zAbCdEfg|aB3dEfGhIjk" \ - Network accessline 152
`/shorts/` URL matches nothing and passes through **verbatim**. The rule-4 spot-check of the asset-group row finds the entire string `https://youtube.com/shorts/Xy7zAbCdEfg` sitting in the Video ID 1 column. - Network accessline 153
spot-check of the asset-group row finds the entire string `https://youtube.com/shorts/Xy7zAbCdEfg` sitting in the Video ID 1 column. Re-run with the bare 11-character ID (`Xy7zAbCdEfg`) — the console looks - Network accessline 154
`https://youtube.com/shorts/Xy7zAbCdEfg` sitting in the Video ID 1 column.
pmax-builder/scripts/build_pmax_csv.py
- Executable scriptline 1
Executable file - Network accessline 11
python build_pmax_csv.py --campaign-name "Pmax: Acme Plumbing" --business-name "Acme Plumbing" --final-url "https://www.acmeplumbing.com/" - Network accessline 12
--campaign-name "Pmax: Acme Plumbing" \ --business-name "Acme Plumbing" \ --final-url "https://www.acmeplumbing.com/" \ - Network accessline 13
--business-name "Acme Plumbing" \ --final-url "https://www.acmeplumbing.com/" \ --city "Dallas" --state "TX" \ - Network accessline 14
--final-url "https://www.acmeplumbing.com/" \ - Network accessline 23
python build_pmax_csv.py --campaign-name "Pmax: Acme Plumbing" --business-name "Acme Plumbing" --final-url "https://www.acmeplumbing.com/" - Network accessline 24
--campaign-name "Pmax: Acme Plumbing" \ --business-name "Acme Plumbing" \ --final-url "https://www.acmeplumbing.com/" \ - Network accessline 25
--business-name "Acme Plumbing" \ --final-url "https://www.acmeplumbing.com/" \ --city "Dallas" --state "TX" \ - Network accessline 26
--final-url "https://www.acmeplumbing.com/" \ - Network accessline 137
in google-ads.yaml must include these scopes — the google-ads-api-setup generator grants them by default: - https://www.googleapis.com/auth/spreadsheets - Network accessline 138
generator grants them by default: - https://www.googleapis.com/auth/spreadsheets - https://www.googleapis.com/auth/drive.readonly - Network accessline 139
- https://www.googleapis.com/auth/spreadsheets - Network accessline 140
- https://www.googleapis.com/auth/drive.readonly - Network accessline 155
[Credential-related source omitted] - Network accessline 156
[Credential-related source omitted] - Network accessline 157
token_uri="https://oauth2.googleapis.com/token", - Network accessline 159
[Credential-related source omitted] - Access to secretsline 159
[Credential-related source omitted] - Network accessline 160
scopes=[ "https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/drive.readonly", - Network accessline 161
"https://www.googleapis.com/auth/spreadsheets", - Network accessline 162
"https://www.googleapis.com/auth/drive.readonly",
pmax-builder/scripts/scrape_website_firecrawl.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 8
Usage: python scrape_website_firecrawl.py --url https://example.com - Network accessline 9
python scrape_website_firecrawl.py --url https://example.com - Network accessline 10
python scrape_website_firecrawl.py --url https://example.com --output scrape.json - Network accessline 11
python scrape_website_firecrawl.py --url https://example.com \ - Access to secretsline 15
[Credential-related source omitted] - Access to secretsline 46
[Credential-related source omitted] - Access to secretsline 54
[Credential-related source omitted] - Access to secretsline 55
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted] - Access to secretsline 58
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted]
portfolio-health-prioritization/README.md
- Network accessline 25
The `.mmd` sources for both diagrams live in `diagrams/` — they're [Mermaid](https://mermaid.js.org/) diagram-as-code, rendered with the included - Network accessline 26
[Mermaid](https://mermaid.js.org/) diagram-as-code, rendered with the included - Network accessline 34
mkdir -p .claude/skills/portfolio-health-prioritization curl -o .claude/skills/portfolio-health-prioritization/SKILL.md \ - Network accessline 35
curl -o .claude/skills/portfolio-health-prioritization/SKILL.md \ - Network accessline 36
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/portfolio-health-prioritization/SKILL.md - Network accessline 47
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 49
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
portfolio-health-prioritization/diagrams/README.md
portfolio-health-prioritization/diagrams/run-logic.svg
- Network accessline 1
<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="flowchart" style="max-width: 1969.32px; background-color: rgb(10, 10, 15);" viewBox="0 0 1969.3221435546875 1129.296875" role
portfolio-health-prioritization/diagrams/workflow-hero.svg
- Network accessline 1
<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="max-width: 815.5px; background-color: rgb(10, 10, 15);" viewBox="-51 -10 815.5 639" role="graphics-document document" aria-ro
portfolio-pacing-rules/README.md
- Network accessline 25
mkdir -p .claude/skills/portfolio-pacing-rules curl -o .claude/skills/portfolio-pacing-rules/SKILL.md \ - Network accessline 26
curl -o .claude/skills/portfolio-pacing-rules/SKILL.md \ - Network accessline 27
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/portfolio-pacing-rules/SKILL.md - Network accessline 38
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 40
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
rsa-bulk-edit/README.md
- Network accessline 25
mkdir -p .claude/skills/rsa-bulk-edit/scripts .claude/skills/rsa-bulk-edit/references curl -o .claude/skills/rsa-bulk-edit/SKILL.md \ - Network accessline 26
curl -o .claude/skills/rsa-bulk-edit/SKILL.md \ - Network accessline 27
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-bulk-edit/SKILL.md curl -o .claude/skills/rsa-bulk-edit/rules.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-bulk-edit/rules.md - Network accessline 28
curl -o .claude/skills/rsa-bulk-edit/rules.md \ - Network accessline 29
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-bulk-edit/rules.md curl -o .claude/skills/rsa-bulk-edit/examples.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-bulk-edit/examples.md - Network accessline 30
curl -o .claude/skills/rsa-bulk-edit/examples.md \ - Network accessline 31
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-bulk-edit/examples.md curl -o .claude/skills/rsa-bulk-edit/references/edit-contract.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-bulk-edit/ref - Network accessline 32
curl -o .claude/skills/rsa-bulk-edit/references/edit-contract.md \ - Network accessline 33
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-bulk-edit/references/edit-contract.md curl -o .claude/skills/rsa-bulk-edit/scripts/rsa_bulk_edit.py \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa- - Network accessline 34
curl -o .claude/skills/rsa-bulk-edit/scripts/rsa_bulk_edit.py \ - Network accessline 35
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-bulk-edit/scripts/rsa_bulk_edit.py - Network accessline 57
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 59
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
rsa-bulk-edit/SKILL.md
- Broad permissionsline 1
Bash
rsa-bulk-edit/scripts/rsa_bulk_edit.py
- Executable scriptline 1
Executable file - Network accessline 151
[Credential-related source omitted] - Network accessline 152
[Credential-related source omitted] - Network accessline 153
token_uri="https://oauth2.googleapis.com/token", - Network accessline 154
[Credential-related source omitted] - Network accessline 155
[Credential-related source omitted] - Access to secretsline 155
[Credential-related source omitted] - Network accessline 156
scopes=["https://www.googleapis.com/auth/spreadsheets"], - Network accessline 249
elif args.sheet_id: write_to_sheet(rows, args.sheet_id, args.tab_name) print(f"\nSheet updated: https://docs.google.com/spreadsheets/d/{args.sheet_id}") - Network accessline 250
write_to_sheet(rows, args.sheet_id, args.tab_name) print(f"\nSheet updated: https://docs.google.com/spreadsheets/d/{args.sheet_id}") else: - Network accessline 251
print(f"\nSheet updated: https://docs.google.com/spreadsheets/d/{args.sheet_id}")
rsa-refresh/README.md
- Network accessline 26
mkdir -p .claude/skills/rsa-refresh/scripts .claude/skills/rsa-refresh/references curl -o .claude/skills/rsa-refresh/SKILL.md \ - Network accessline 27
curl -o .claude/skills/rsa-refresh/SKILL.md \ - Network accessline 28
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-refresh/SKILL.md curl -o .claude/skills/rsa-refresh/rules.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-refresh/rules.md - Network accessline 29
curl -o .claude/skills/rsa-refresh/rules.md \ - Network accessline 30
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-refresh/rules.md curl -o .claude/skills/rsa-refresh/examples.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-refresh/examples.md - Network accessline 31
curl -o .claude/skills/rsa-refresh/examples.md \ - Network accessline 32
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-refresh/examples.md curl -o .claude/skills/rsa-refresh/scripts/rsa_refresh_generator.py \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-refresh/scri - Network accessline 33
curl -o .claude/skills/rsa-refresh/scripts/rsa_refresh_generator.py \ - Network accessline 34
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-refresh/scripts/rsa_refresh_generator.py curl -o .claude/skills/rsa-refresh/scripts/rsa_baseline_snapshot.py \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/ - Network accessline 35
curl -o .claude/skills/rsa-refresh/scripts/rsa_baseline_snapshot.py \ - Network accessline 36
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-refresh/scripts/rsa_baseline_snapshot.py curl -o .claude/skills/rsa-refresh/references/refresh-contract.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/ma - Network accessline 37
curl -o .claude/skills/rsa-refresh/references/refresh-contract.md \ - Network accessline 38
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-refresh/references/refresh-contract.md curl -o .claude/skills/rsa-refresh/references/pm-headline-structure.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills - Network accessline 39
curl -o .claude/skills/rsa-refresh/references/pm-headline-structure.md \ - Network accessline 40
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-refresh/references/pm-headline-structure.md curl -o .claude/skills/rsa-refresh/references/description-voice-lifting.md \ https://raw.githubusercontent.com/fourteenwm/ppc- - Network accessline 41
curl -o .claude/skills/rsa-refresh/references/description-voice-lifting.md \ - Network accessline 42
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-refresh/references/description-voice-lifting.md curl -o .claude/skills/rsa-refresh/references/hallucination-filter.md \ https://raw.githubusercontent.com/fourteenwm/ppc-a - Network accessline 43
curl -o .claude/skills/rsa-refresh/references/hallucination-filter.md \ - Network accessline 44
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-refresh/references/hallucination-filter.md - Access to secretsline 55
[Credential-related source omitted] - Network accessline 71
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 73
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
rsa-refresh/SKILL.md
- Access to secretsline 140
[Credential-related source omitted]
rsa-refresh/examples.md
- Network accessline 24
Querying asset performance labels... ... Scraping property website with Firecrawl: https://www.fernbrook-flats.example.com - Network accessline 25
... Scraping property website with Firecrawl: https://www.fernbrook-flats.example.com Firecrawl scraped 11482 characters - Network accessline 26
Scraping property website with Firecrawl: https://www.fernbrook-flats.example.com - Network accessline 74
WARNING: All scraping methods failed for https://apply.leasehub.example.com/larkfield-commons - headlines will be generic only
rsa-refresh/references/refresh-contract.md
rsa-refresh/scripts/rsa_baseline_snapshot.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 445
[Credential-related source omitted] - Network accessline 446
[Credential-related source omitted] - Network accessline 447
token_uri="https://oauth2.googleapis.com/token", - Network accessline 449
[Credential-related source omitted] - Access to secretsline 449
[Credential-related source omitted] - Network accessline 450
scopes=[ "https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/drive.readonly", - Network accessline 451
"https://www.googleapis.com/auth/spreadsheets", - Network accessline 452
"https://www.googleapis.com/auth/drive.readonly", - Access to secretsline 458
[Credential-related source omitted] - Access to secretsline 460
[Credential-related source omitted] - Access to secretsline 464
[Credential-related source omitted] - Network accessline 467
[Credential-related source omitted] - Access to secretsline 467
[Credential-related source omitted] - Network accessline 468
[Credential-related source omitted] - Network accessline 469
token_uri=token_data.get('token_uri', "https://oauth2.googleapis.com/token"), - Network accessline 470
[Credential-related source omitted] - Network accessline 471
[Credential-related source omitted] - Access to secretsline 471
[Credential-related source omitted] - Network accessline 472
scopes=token_data.get('scopes', ["https://www.googleapis.com/auth/spreadsheets"]), - Network accessline 556
url = f"https://docs.google.com/spreadsheets/d/{sheet_id}"
rsa-refresh/scripts/rsa_refresh_generator.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 54
[Credential-related source omitted] - Access to secretsline 71
[Credential-related source omitted] - Access to secretsline 88
[Credential-related source omitted] - Access to secretsline 382
[Credential-related source omitted] - Access to secretsline 383
[Credential-related source omitted] - Access to secretsline 387
[Credential-related source omitted] - Network accessline 446
response = requests.get(url, headers=headers, timeout=30) - Network accessline 898
[Credential-related source omitted] - Network accessline 899
[Credential-related source omitted] - Network accessline 900
token_uri="https://oauth2.googleapis.com/token", - Network accessline 902
[Credential-related source omitted] - Access to secretsline 902
[Credential-related source omitted] - Network accessline 903
scopes=[ "https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/drive.readonly", - Network accessline 904
"https://www.googleapis.com/auth/spreadsheets", - Network accessline 905
"https://www.googleapis.com/auth/drive.readonly", - Access to secretsline 911
[Credential-related source omitted] - Access to secretsline 913
[Credential-related source omitted] - Access to secretsline 917
[Credential-related source omitted] - Network accessline 920
[Credential-related source omitted] - Access to secretsline 920
[Credential-related source omitted] - Network accessline 921
[Credential-related source omitted] - Network accessline 922
token_uri=token_data.get('token_uri', "https://oauth2.googleapis.com/token"), - Network accessline 923
[Credential-related source omitted] - Network accessline 924
[Credential-related source omitted] - Access to secretsline 924
[Credential-related source omitted] - Network accessline 925
scopes=token_data.get('scopes', ["https://www.googleapis.com/auth/spreadsheets"]), - Network accessline 1059
return f"https://docs.google.com/spreadsheets/d/{sheet_id}"
rsa-single-account/README.md
- Network accessline 26
mkdir -p .claude/skills/rsa-single-account/scripts .claude/skills/rsa-single-account/references for f in SKILL.md README.md rules.md examples.md; do curl -o ".claude/skills/rsa-single-account/$f" \ - Network accessline 27
for f in SKILL.md README.md rules.md examples.md; do curl -o ".claude/skills/rsa-single-account/$f" \ "https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-single-account/$f" - Network accessline 28
curl -o ".claude/skills/rsa-single-account/$f" \ - Network accessline 29
"https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-single-account/$f" done curl -o .claude/skills/rsa-single-account/references/pipeline-contract.md \ - Network accessline 30
done curl -o .claude/skills/rsa-single-account/references/pipeline-contract.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-single-account/references/pipeline-contract.md - Network accessline 31
curl -o .claude/skills/rsa-single-account/references/pipeline-contract.md \ - Network accessline 32
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-single-account/references/pipeline-contract.md - Network accessline 35
scrape_website_firecrawl.py get_gmb_reviews.py write_rsa_to_sheet.py \ vertical_configs.json; do curl -o ".claude/skills/rsa-single-account/scripts/$f" \ - Network accessline 36
vertical_configs.json; do curl -o ".claude/skills/rsa-single-account/scripts/$f" \ "https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-single-account/scripts/$f" - Network accessline 37
curl -o ".claude/skills/rsa-single-account/scripts/$f" \ - Network accessline 38
"https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/rsa-single-account/scripts/$f" - Network accessline 41
# Step 7 invokes two companion skills (both in this repo) — install their operative files: mkdir -p .claude/skills/ad-copy-verification-standard .claude/skills/ad-copy-generation-framework curl -o .claude/skills/ad-copy-verification-standar - Network accessline 42
mkdir -p .claude/skills/ad-copy-verification-standard .claude/skills/ad-copy-generation-framework curl -o .claude/skills/ad-copy-verification-standard/SKILL.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ad-copy-veri - Network accessline 43
curl -o .claude/skills/ad-copy-verification-standard/SKILL.md \ - Network accessline 44
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ad-copy-verification-standard/SKILL.md for f in SKILL.md framework.md distribution.md technical-specs.md examples.md; do curl -o ".claude/skills/ad-copy-generation-framework/ - Network accessline 45
for f in SKILL.md framework.md distribution.md technical-specs.md examples.md; do curl -o ".claude/skills/ad-copy-generation-framework/$f" \ "https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ad-copy-generation-framework - Network accessline 46
curl -o ".claude/skills/ad-copy-generation-framework/$f" \ - Network accessline 47
"https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/ad-copy-generation-framework/$f" - Access to secretsline 67
[Credential-related source omitted] - Network accessline 131
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 133
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
rsa-single-account/SKILL.md
- Broad permissionsline 1
Bash - Access to secretsline 49
[Credential-related source omitted] - Access to secretsline 50
[Credential-related source omitted] - Access to secretsline 51
[Credential-related source omitted] - Access to secretsline 73
[Credential-related source omitted] - Access to secretsline 81
[Credential-related source omitted] - Access to secretsline 89
[Credential-related source omitted]
rsa-single-account/references/pipeline-contract.md
- Network accessline 57
**unique URL** (`url.split('/')[2]`), and the max prints as `{domain} ({count} ads)` — the label says "ads" but the number is unique URLs on that domain. `Primary website likely: https://{domain}` is a vote over at most 10 ads' URLs, - Network accessline 58
`{domain} ({count} ads)` — the label says "ads" but the number is unique URLs on that domain. `Primary website likely: https://{domain}` is a vote over at most 10 ads' URLs, paused campaigns included — verify it is really the client's site - Network accessline 59
domain. `Primary website likely: https://{domain}` is a vote over at most 10 ads' URLs, - Access to secretsline 110
[Credential-related source omitted]
rsa-single-account/rules.md
- Access to secretsline 41
[Credential-related source omitted]
rsa-single-account/scripts/analyze_competitors_for_rsa.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 25
[Credential-related source omitted] - Access to secretsline 48
[Credential-related source omitted] - Access to secretsline 55
[Credential-related source omitted] - Access to secretsline 56
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted] - Access to secretsline 58
[Credential-related source omitted] - Access to secretsline 61
[Credential-related source omitted] - Access to secretsline 148
[Credential-related source omitted] - Access to secretsline 149
[Credential-related source omitted] - Access to secretsline 159
[Credential-related source omitted]
rsa-single-account/scripts/check_active_accounts.py
- Executable scriptline 1
#!/usr/bin/env python3
rsa-single-account/scripts/get_account_website_url.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 149
most_common = max(domains.items(), key=lambda x: x[1]) print(f" {most_common[0]} ({most_common[1]} ads)") print(f" Primary website likely: https://{most_common[0]}") - Network accessline 150
print(f" {most_common[0]} ({most_common[1]} ads)") print(f" Primary website likely: https://{most_common[0]}") except Exception as e: - Network accessline 151
print(f" Primary website likely: https://{most_common[0]}")
rsa-single-account/scripts/get_gmb_reviews.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 18
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 46
[Credential-related source omitted] - Access to secretsline 47
[Credential-related source omitted] - Access to secretsline 48
[Credential-related source omitted] - Access to secretsline 49
[Credential-related source omitted] - Access to secretsline 52
[Credential-related source omitted] - Access to secretsline 68
[Credential-related source omitted] - Access to secretsline 70
[Credential-related source omitted] - Access to secretsline 71
[Credential-related source omitted] - Access to secretsline 85
[Credential-related source omitted]
rsa-single-account/scripts/get_search_campaign_structure.py
- Executable scriptline 1
#!/usr/bin/env python3
rsa-single-account/scripts/scrape_website_firecrawl.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 16
[Credential-related source omitted] - Access to secretsline 17
[Credential-related source omitted] - Access to secretsline 18
[Credential-related source omitted] - Access to secretsline 43
[Credential-related source omitted] - Access to secretsline 77
[Credential-related source omitted] - Access to secretsline 78
[Credential-related source omitted] - Access to secretsline 79
[Credential-related source omitted] - Access to secretsline 80
[Credential-related source omitted] - Access to secretsline 82
[Credential-related source omitted] - Access to secretsline 193
[Credential-related source omitted] - Access to secretsline 194
[Credential-related source omitted] - Access to secretsline 195
[Credential-related source omitted] - Access to secretsline 196
[Credential-related source omitted] - Access to secretsline 198
[Credential-related source omitted]
rsa-single-account/scripts/write_rsa_to_sheet.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 16
Usage: python write_rsa_to_sheet.py --sheet-id <YOUR_RSA_SHEET_ID> rsa_data.json python write_rsa_to_sheet.py --sheet-id "https://docs.google.com/spreadsheets/d/<ID>/edit" rsa_data.json - Network accessline 18
python write_rsa_to_sheet.py --sheet-id "https://docs.google.com/spreadsheets/d/<ID>/edit" rsa_data.json - Network accessline 57
SCOPES = ['https://www.googleapis.com/auth/spreadsheets'] - Access to secretsline 97
[Credential-related source omitted] - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 99
[Credential-related source omitted] - Network accessline 103
[Credential-related source omitted] - Network accessline 104
[Credential-related source omitted] - Network accessline 105
token_uri='https://oauth2.googleapis.com/token', - Access to secretsline 107
[Credential-related source omitted] - Network accessline 177
print(f"[SUCCESS] Successfully wrote to Google Sheet") return f"https://docs.google.com/spreadsheets/d/{sheet_id}/edit" - Network accessline 178
return f"https://docs.google.com/spreadsheets/d/{sheet_id}/edit"
shared-budget-updater/.github/workflows/shared-budget-updater.yml
- Dangerous shell operationline 43
run: rm -f /tmp/sheets-token.json /tmp/google-ads.yaml - Network accessline 46
if: failure() run: | curl -s -X POST "$SLACK_WEBHOOK_URL" \ - Network accessline 47
run: | curl -s -X POST "$SLACK_WEBHOOK_URL" \ -H 'Content-Type: application/json' \ - Network accessline 48
curl -s -X POST "$SLACK_WEBHOOK_URL" \
shared-budget-updater/README.md
- Network accessline 35
The `.mmd` sources for both diagrams live in `diagrams/` — they're [Mermaid](https://mermaid.js.org/) diagram-as-code, rendered with the included - Network accessline 36
[Mermaid](https://mermaid.js.org/) diagram-as-code, rendered with the included - Network accessline 53
- Apply for a developer token on your MCC ([instructions](https://developers.google.com/google-ads/api/docs/get-started/dev-token)) - Access to secretsline 62
[Credential-related source omitted] - Network accessline 79
2. Enable the Google Sheets API 3. Create an OAuth client (Desktop type) 4. Run the [Google OAuth playground](https://developers.google.com/oauthplayground/) - Network accessline 80
3. Create an OAuth client (Desktop type) 4. Run the [Google OAuth playground](https://developers.google.com/oauthplayground/) with scope `https://www.googleapis.com/auth/spreadsheets` - Network accessline 81
4. Run the [Google OAuth playground](https://developers.google.com/oauthplayground/) - Network accessline 82
with scope `https://www.googleapis.com/auth/spreadsheets` - Network accessline 89
[Credential-related source omitted] - Network accessline 90
[Credential-related source omitted] - Network accessline 91
"token_uri": "https://oauth2.googleapis.com/token", - Network accessline 92
[Credential-related source omitted] - Network accessline 93
[Credential-related source omitted] - Access to secretsline 93
[Credential-related source omitted] - Network accessline 94
"scopes": ["https://www.googleapis.com/auth/spreadsheets"] - Network accessline 111
Grab the sheet ID from the URL: `https://docs.google.com/spreadsheets/d/<THIS_IS_THE_ID>/edit` - Network accessline 112
`https://docs.google.com/spreadsheets/d/<THIS_IS_THE_ID>/edit` - Network accessline 119
1. Go to `https://api.slack.com/apps` → **Create New App** → **From scratch** - Network accessline 130
curl -X POST -H 'Content-Type: application/json' \ - Network accessline 268
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 270
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
shared-budget-updater/SKILL.md
- Broad permissionsline 1
Bash
shared-budget-updater/diagrams/README.md
shared-budget-updater/diagrams/run-logic.svg
- Network accessline 1
<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="flowchart" style="max-width: 1557.9px; background-color: rgb(10, 10, 15);" viewBox="0 0 1557.9033203125 840.703125" role="gra
shared-budget-updater/diagrams/workflow-hero.svg
- Network accessline 1
<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="max-width: 1683px; background-color: rgb(10, 10, 15);" viewBox="-50 -10 1683 749" role="graphics-document document" aria-role
shared-budget-updater/workflows/__init__.py
- Executable scriptline 1
Executable file
shared-budget-updater/workflows/_shared/__init__.py
- Executable scriptline 1
Executable file
shared-budget-updater/workflows/_shared/google_ads_auth.py
- Executable scriptline 1
Executable file - Access to secretsline 10
[Credential-related source omitted] - Network accessline 21
TOKEN_URI = "https://oauth2.googleapis.com/token" - Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 46
[Credential-related source omitted] - Access to secretsline 52
[Credential-related source omitted]
shared-budget-updater/workflows/_shared/google_auth.py
shared-budget-updater/workflows/_shared/mutate_error_hints.py
- Executable scriptline 1
Executable file
shared-budget-updater/workflows/_shared/sheets_retry.py
- Executable scriptline 1
Executable file
shared-budget-updater/workflows/shared_budget_updater/__init__.py
- Executable scriptline 1
Executable file
shared-budget-updater/workflows/shared_budget_updater/ads_api.py
- Executable scriptline 1
Executable file - Network accessline 10
ADS_API_VERSION = "v23" ADS_BASE_URL = f"https://googleads.googleapis.com/{ADS_API_VERSION}" - Network accessline 11
ADS_BASE_URL = f"https://googleads.googleapis.com/{ADS_API_VERSION}" - Access to secretsline 76
[Credential-related source omitted] - Access to secretsline 88
[Credential-related source omitted] - Network accessline 108
for attempt in range(1, MAX_RETRIES + 1): try: resp = requests.post(url, json=body, headers=headers, timeout=REQUEST_TIMEOUT) - Network accessline 109
try: resp = requests.post(url, json=body, headers=headers, timeout=REQUEST_TIMEOUT) last_resp = resp - Network accessline 110
resp = requests.post(url, json=body, headers=headers, timeout=REQUEST_TIMEOUT)
shared-budget-updater/workflows/shared_budget_updater/main.py
shared-budget-updater/workflows/shared_budget_updater/sheets_io.py
shared-budget-updater/workflows/shared_budget_updater/slack.py
sqr-classifier/README.md
sqr-pipeline/README.md
- Network accessline 62
MCC. See the [`google-ads-api-setup`](../google-ads-api-setup/) skill. 2. **Google Sheets access** — a `token.json` at your project root with the `https://www.googleapis.com/auth/spreadsheets` scope (the same OAuth flow can - Network accessline 63
2. **Google Sheets access** — a `token.json` at your project root with the `https://www.googleapis.com/auth/spreadsheets` scope (the same OAuth flow can mint it), or a `google-ads.yaml` refresh token that already includes that scope. - Network accessline 64
`https://www.googleapis.com/auth/spreadsheets` scope (the same OAuth flow can - Network accessline 77
mkdir -p .claude/skills/sqr-pipeline/scripts .claude/skills/sqr-pipeline/references BASE=https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/sqr-pipeline - Network accessline 78
BASE=https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/sqr-pipeline - Network accessline 80
for f in SKILL.md README.md sheet-template.md; do curl -o .claude/skills/sqr-pipeline/$f $BASE/$f - Network accessline 81
curl -o .claude/skills/sqr-pipeline/$f $BASE/$f - Network accessline 84
sqr_compare.py sqr_ngram_analysis.py sqr_upload_negatives.py \ sqr_remove_negatives.py; do curl -o .claude/skills/sqr-pipeline/scripts/$f $BASE/scripts/$f - Network accessline 85
sqr_remove_negatives.py; do curl -o .claude/skills/sqr-pipeline/scripts/$f $BASE/scripts/$f done - Network accessline 86
curl -o .claude/skills/sqr-pipeline/scripts/$f $BASE/scripts/$f - Network accessline 87
done for f in classify-prompt.md geo-prompt.md offbrand-keywords.txt; do curl -o .claude/skills/sqr-pipeline/references/$f $BASE/references/$f - Network accessline 88
for f in classify-prompt.md geo-prompt.md offbrand-keywords.txt; do curl -o .claude/skills/sqr-pipeline/references/$f $BASE/references/$f done - Network accessline 89
curl -o .claude/skills/sqr-pipeline/references/$f $BASE/references/$f - Network accessline 108
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 110
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
sqr-pipeline/SKILL.md
- Broad permissionsline 1
Bash
sqr-pipeline/scripts/mcc_search_query_report.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 66
[Credential-related source omitted] - Access to secretsline 66
[Credential-related source omitted] - Network accessline 67
[Credential-related source omitted] - Network accessline 68
token_uri=token_data.get('token_uri', "https://oauth2.googleapis.com/token"), - Network accessline 69
[Credential-related source omitted] - Network accessline 70
[Credential-related source omitted] - Access to secretsline 70
[Credential-related source omitted] - Network accessline 71
scopes=token_data.get('scopes', ["https://www.googleapis.com/auth/spreadsheets"]), - Network accessline 77
[Credential-related source omitted] - Network accessline 78
[Credential-related source omitted] - Network accessline 79
token_uri="https://oauth2.googleapis.com/token", - Network accessline 80
[Credential-related source omitted] - Network accessline 81
[Credential-related source omitted] - Access to secretsline 81
[Credential-related source omitted] - Network accessline 82
scopes=["https://www.googleapis.com/auth/spreadsheets"],
sqr-pipeline/scripts/prep_geo_batches.py
- Executable scriptline 1
#!/usr/bin/env python3
sqr-pipeline/scripts/sqr_compare.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 64
creds = Credentials.from_authorized_user_file( str(SHEETS_TOKEN_PATH), scopes=["https://www.googleapis.com/auth/spreadsheets"] - Network accessline 65
str(SHEETS_TOKEN_PATH), scopes=["https://www.googleapis.com/auth/spreadsheets"] ) - Network accessline 66
scopes=["https://www.googleapis.com/auth/spreadsheets"] - Network accessline 462
print(f" 2-3 Agree: {len(rows_23)} queries (majority NEGATE)") print(f" Total: {len(rows_33) + len(rows_23)} NEGATE candidates") print(f"\n Sheet: https://docs.google.com/spreadsheets/d/{args.sheet_id}") - Network accessline 463
print(f" Total: {len(rows_33) + len(rows_23)} NEGATE candidates") print(f"\n Sheet: https://docs.google.com/spreadsheets/d/{args.sheet_id}") print(f"\nNEXT STEPS:") - Network accessline 464
print(f"\n Sheet: https://docs.google.com/spreadsheets/d/{args.sheet_id}")
sqr-pipeline/scripts/sqr_ngram_analysis.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 58
) creds = Credentials.from_authorized_user_file( str(SHEETS_TOKEN_PATH), scopes=["https://www.googleapis.com/auth/spreadsheets"] - Network accessline 59
creds = Credentials.from_authorized_user_file( str(SHEETS_TOKEN_PATH), scopes=["https://www.googleapis.com/auth/spreadsheets"] ) - Network accessline 60
str(SHEETS_TOKEN_PATH), scopes=["https://www.googleapis.com/auth/spreadsheets"] - Network accessline 240
print(f" 3-NGram: {len(rows_3)} ngrams across {accts_3} accounts") print(f" Filter: {args.min_impressions}+ impressions") print(f"\n Sheet: https://docs.google.com/spreadsheets/d/{args.sheet_id}") - Network accessline 242
print(f"\n Sheet: https://docs.google.com/spreadsheets/d/{args.sheet_id}")
sqr-pipeline/scripts/sqr_prep.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 65
creds = Credentials.from_authorized_user_file( str(SHEETS_TOKEN_PATH), scopes=["https://www.googleapis.com/auth/spreadsheets"] - Network accessline 66
str(SHEETS_TOKEN_PATH), scopes=["https://www.googleapis.com/auth/spreadsheets"] ) - Network accessline 67
scopes=["https://www.googleapis.com/auth/spreadsheets"]
sqr-pipeline/scripts/sqr_remove_negatives.py
- Executable scriptline 1
#!/usr/bin/env python3
sqr-pipeline/scripts/sqr_upload_negatives.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 87
[Credential-related source omitted] - Access to secretsline 87
[Credential-related source omitted] - Network accessline 88
[Credential-related source omitted] - Network accessline 89
token_uri=token_data.get('token_uri', 'https://oauth2.googleapis.com/token'), - Network accessline 90
[Credential-related source omitted] - Network accessline 91
[Credential-related source omitted] - Access to secretsline 91
[Credential-related source omitted] - Network accessline 92
scopes=token_data.get('scopes', ['https://www.googleapis.com/auth/spreadsheets']), - Network accessline 99
[Credential-related source omitted] - Network accessline 100
[Credential-related source omitted] - Network accessline 101
token_uri='https://oauth2.googleapis.com/token', - Network accessline 102
[Credential-related source omitted] - Network accessline 103
[Credential-related source omitted] - Access to secretsline 103
[Credential-related source omitted] - Network accessline 104
scopes=['https://www.googleapis.com/auth/spreadsheets'],
sqr-pipeline/sheet-template.md
- Network accessline 3
The pipeline uses one Google Sheet with a few tabs. You build the sheet; the scripts read and write specific tabs by name. Grab the sheet ID from the URL (`https://docs.google.com/spreadsheets/d/<THIS_IS_THE_ID>/edit`) and pass it as - Network accessline 4
scripts read and write specific tabs by name. Grab the sheet ID from the URL (`https://docs.google.com/spreadsheets/d/<THIS_IS_THE_ID>/edit`) and pass it as `--sheet-id` to every script. - Network accessline 5
(`https://docs.google.com/spreadsheets/d/<THIS_IS_THE_ID>/edit`) and pass it as
underspending-investigation/README.md
- Network accessline 26
mkdir -p .claude/skills/underspending-investigation/scripts .claude/skills/underspending-investigation/references for f in SKILL.md README.md rules.md examples.md; do curl -o .claude/skills/underspending-investigation/$f \ - Network accessline 27
for f in SKILL.md README.md rules.md examples.md; do curl -o .claude/skills/underspending-investigation/$f \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/underspending-investigation/$f - Network accessline 28
curl -o .claude/skills/underspending-investigation/$f \ - Network accessline 29
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/underspending-investigation/$f done curl -o .claude/skills/underspending-investigation/references/investigation-contract.md \ - Network accessline 30
done curl -o .claude/skills/underspending-investigation/references/investigation-contract.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/underspending-investigation/references/investigation-contract.md - Network accessline 31
curl -o .claude/skills/underspending-investigation/references/investigation-contract.md \ - Network accessline 32
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/underspending-investigation/references/investigation-contract.md curl -o .claude/skills/underspending-investigation/scripts/investigate_underspend.py \ https://raw.githubuser - Network accessline 33
curl -o .claude/skills/underspending-investigation/scripts/investigate_underspend.py \ - Network accessline 34
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/underspending-investigation/scripts/investigate_underspend.py - Network accessline 40
for skill in portfolio-pacing-rules impression-share-diagnostics budget-recommendation-calculator; do mkdir -p .claude/skills/$skill curl -o .claude/skills/$skill/SKILL.md \ - Network accessline 41
mkdir -p .claude/skills/$skill curl -o .claude/skills/$skill/SKILL.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/$skill/SKILL.md - Network accessline 42
curl -o .claude/skills/$skill/SKILL.md \ - Network accessline 43
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/$skill/SKILL.md - Network accessline 50
mkdir -p .claude/skills/gaql-query-patterns curl -o .claude/skills/gaql-query-patterns/SKILL.md \ - Network accessline 51
curl -o .claude/skills/gaql-query-patterns/SKILL.md \ - Network accessline 52
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/gaql-query-patterns/SKILL.md
underspending-investigation/SKILL.md
- Broad permissionsline 1
Bash
underspending-investigation/scripts/investigate_underspend.py
- Executable scriptline 1
#!/usr/bin/env python3
youtube-placement-audit/README.md
- Network accessline 28
mkdir -p .claude/skills/youtube-placement-audit/scripts .claude/skills/youtube-placement-audit/references for f in SKILL.md README.md rules.md examples.md; do curl -o .claude/skills/youtube-placement-audit/$f \ - Network accessline 29
for f in SKILL.md README.md rules.md examples.md; do curl -o .claude/skills/youtube-placement-audit/$f \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/youtube-placement-audit/$f - Network accessline 30
curl -o .claude/skills/youtube-placement-audit/$f \ - Network accessline 31
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/youtube-placement-audit/$f done curl -o .claude/skills/youtube-placement-audit/references/audit-contract.md \ - Network accessline 32
done curl -o .claude/skills/youtube-placement-audit/references/audit-contract.md \ https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/youtube-placement-audit/references/audit-contract.md - Network accessline 33
curl -o .claude/skills/youtube-placement-audit/references/audit-contract.md \ - Network accessline 34
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/youtube-placement-audit/references/audit-contract.md curl -o .claude/skills/youtube-placement-audit/scripts/youtube_placement_audit.py \ https://raw.githubusercontent.com/fou - Network accessline 35
curl -o .claude/skills/youtube-placement-audit/scripts/youtube_placement_audit.py \ - Network accessline 36
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/youtube-placement-audit/scripts/youtube_placement_audit.py curl -o .claude/skills/youtube-placement-audit/scripts/youtube_channel_extractor.py \ https://raw.githubusercontent - Network accessline 37
curl -o .claude/skills/youtube-placement-audit/scripts/youtube_channel_extractor.py \ - Network accessline 38
https://raw.githubusercontent.com/fourteenwm/ppc-ai-skills/main/youtube-placement-audit/scripts/youtube_channel_extractor.py - Access to secretsline 55
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Network accessline 105
Built by [Kurt Henninger](https://fourteenwebmedia.com) — I manage over 110 Google Ads accounts with 85+ specialized skills. - Network accessline 107
More free skills: [github.com/fourteenwm/ppc-ai-skills](https://github.com/fourteenwm/ppc-ai-skills)
youtube-placement-audit/SKILL.md
youtube-placement-audit/examples.md
- Instruction override signalline 21
Date Range: Last 30 days Output: Sheet <SHEET_ID> Mode: FORCE (skip confirmation) - Instruction override signalline 22
Output: Sheet <SHEET_ID> Mode: FORCE (skip confirmation) ====================================================================== - Instruction override signalline 23
Mode: FORCE (skip confirmation) - Network accessline 67
Sheet: https://docs.google.com/spreadsheets/d/<SHEET_ID>
youtube-placement-audit/references/audit-contract.md
- Access to secretsline 122
[Credential-related source omitted]
youtube-placement-audit/scripts/youtube_channel_extractor.py
- Executable scriptline 1
Executable file - Access to secretsline 15
[Credential-related source omitted] - Access to secretsline 26
[Credential-related source omitted] - Access to secretsline 53
[Credential-related source omitted] - Access to secretsline 55
[Credential-related source omitted] - Access to secretsline 56
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Access to secretsline 65
[Credential-related source omitted] - Network accessline 77
[Credential-related source omitted] - Network accessline 78
[Credential-related source omitted] - Access to secretsline 78
[Credential-related source omitted] - Network accessline 79
token_uri='https://oauth2.googleapis.com/token', - Network accessline 80
scopes=['https://www.googleapis.com/auth/spreadsheets'] - Instruction override signalline 306
parser.add_argument("--keywords-only", action="store_true", help="Only process keyword tab") parser.add_argument("--test", action="store_true", help="Preview only") parser.add_argument("--force", action="store_true", help="Skip conf - Instruction override signalline 307
parser.add_argument("--test", action="store_true", help="Preview only") parser.add_argument("--force", action="store_true", help="Skip confirmation") parser.add_argument("--limit", type=int, help="Limit videos to process") - Instruction override signalline 308
parser.add_argument("--force", action="store_true", help="Skip confirmation") - Access to secretsline 318
[Credential-related source omitted] - Access to secretsline 319
[Credential-related source omitted] - Network accessline 368
print(f"\n{'='*60}") print("DONE") print(f"Sheet: https://docs.google.com/spreadsheets/d/{args.sheet}") - Network accessline 369
print("DONE") print(f"Sheet: https://docs.google.com/spreadsheets/d/{args.sheet}") print(f"{'='*60}") - Network accessline 370
print(f"Sheet: https://docs.google.com/spreadsheets/d/{args.sheet}")
youtube-placement-audit/scripts/youtube_placement_audit.py
- Executable scriptline 1
Executable file - Network accessline 148
[Credential-related source omitted] - Network accessline 149
[Credential-related source omitted] - Access to secretsline 149
[Credential-related source omitted] - Network accessline 150
token_uri='https://oauth2.googleapis.com/token', - Network accessline 151
scopes=['https://www.googleapis.com/auth/spreadsheets'] - Network accessline 343
write_tab("Bad - YouTube", to_rows(kw_sorted)) write_tab("Bad - YouTube - NEA", to_rows(nea_sorted)) print(f"\nSheet: https://docs.google.com/spreadsheets/d/{sheet_id}") - Network accessline 345
print(f"\nSheet: https://docs.google.com/spreadsheets/d/{sheet_id}") - Instruction override signalline 373
parser.add_argument("--creds", default="google-ads.yaml", help="Path to google-ads.yaml") parser.add_argument("--test", action="store_true", help="Preview only, no write") parser.add_argument("--force", action="store_true", help="Sk - Instruction override signalline 374
parser.add_argument("--test", action="store_true", help="Preview only, no write") parser.add_argument("--force", action="store_true", help="Skip confirmation prompt") parser.add_argument("--limit", type=int, help="Process only first - Instruction override signalline 375
parser.add_argument("--force", action="store_true", help="Skip confirmation prompt") - Instruction override signalline 392
print("Mode: TEST (preview only)") if args.force: print("Mode: FORCE (skip confirmation)") - Instruction override signalline 393
if args.force: print("Mode: FORCE (skip confirmation)") print("=" * 70) - Instruction override signalline 394
print("Mode: FORCE (skip confirmation)")
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Signal confidence: 500 facts
- Network access in code of documentationaccount-diagnostic/README.md:26Low confidence
- Network access in prose of documentationaccount-diagnostic/README.md:96Low confidence
- Network access in prose of documentationaccount-diagnostic/README.md:98Low confidence
- Broad permissions in the frontmatter of the SKILL.mdaccount-diagnostic/SKILL.md:1High confidence
- Executable script in code of a file that runsaccount-diagnostic/scripts/run_diagnostic.py:1High confidence
- Network access in prose of a file that runsaccount-diagnostic/scripts/run_diagnostic.py:1726Low confidence
- Network access in prose of a file that runsaccount-diagnostic/scripts/run_diagnostic.py:1727Low confidence
- Network access in prose of a file that runsaccount-diagnostic/scripts/run_diagnostic.py:1728Low confidence
- Network access in code of a file that runsaccount-diagnostic/scripts/run_diagnostic.py:1784High confidence
- Network access in code of a file that runsaccount-diagnostic/scripts/run_diagnostic.py:1799High confidence
- Network access in code of a file that runsaccount-diagnostic/scripts/run_diagnostic.py:1812High confidence
- Network access in code of a file that runsaccount-diagnostic/scripts/run_diagnostic.py:1826High confidence
- Network access in code of a file that runsaccount-diagnostic/scripts/run_diagnostic.py:1827High confidence
- Network access in code of a file that runsaccount-diagnostic/scripts/run_diagnostic.py:1828High confidence
- Network access in code of a file that runsaccount-diagnostic/scripts/run_diagnostic.py:1841High confidence
- Network access in code of a file that runsaccount-diagnostic/scripts/run_diagnostic.py:1853High confidence
- Network access in code of documentationad-copy-generation-framework/README.md:24Low confidence
- Network access in code of documentationad-copy-generation-framework/README.md:25Low confidence
- Network access in code of documentationad-copy-generation-framework/README.md:26Low confidence
- Network access in prose of documentationad-copy-generation-framework/README.md:37Low confidence
- Network access in prose of documentationad-copy-generation-framework/README.md:39Low confidence
- Network access in prose of documentationad-copy-verification-standard/README.md:41Low confidence
- Network access in prose of documentationad-copy-verification-standard/README.md:42Low confidence
- Network access in code of documentationad-copy-verification-standard/README.md:62Low confidence
- Network access in code of documentationad-copy-verification-standard/README.md:63Low confidence
- Network access in code of documentationad-copy-verification-standard/README.md:64Low confidence
- Network access in prose of documentationad-copy-verification-standard/README.md:94Low confidence
- Network access in prose of documentationad-copy-verification-standard/README.md:96Low confidence
- Network access in prose of the SKILL.mdad-copy-verification-standard/SKILL.md:498Low confidence
- Network access in prose of documentationad-copy-verification-standard/diagrams/README.md:3Low confidence
- Network access in prose of documentationad-copy-verification-standard/diagrams/README.md:4Low confidence
- Network access in code of documentationadd-account-negative-keywords/README.md:29Low confidence
- Network access in code of documentationadd-account-negative-keywords/README.md:30Low confidence
- Network access in code of documentationadd-account-negative-keywords/README.md:31Low confidence
- Network access in code of documentationadd-account-negative-keywords/README.md:32Low confidence
- Network access in prose of documentationadd-account-negative-keywords/README.md:60Low confidence
- Network access in prose of documentationadd-account-negative-keywords/README.md:62Low confidence
- Broad permissions in the frontmatter of the SKILL.mdadd-account-negative-keywords/SKILL.md:1High confidence
- Network access in prose of the SKILL.mdadd-account-negative-keywords/SKILL.md:192Low confidence
- Network access in prose of the SKILL.mdadd-account-negative-keywords/SKILL.md:194Low confidence
- Network access in code of the SKILL.mdadd-account-negative-keywords/SKILL.md:201High confidence
- Network access in code of the SKILL.mdadd-account-negative-keywords/SKILL.md:202High confidence
- Network access in code of the SKILL.mdadd-account-negative-keywords/SKILL.md:203High confidence
- Network access in code of the SKILL.mdadd-account-negative-keywords/SKILL.md:204High confidence
- Executable script in code of a file that runsadd-account-negative-keywords/scripts/add_account_negative_keywords.py:1High confidence
- Network access in code of a file that runsadd-account-negative-keywords/scripts/add_account_negative_keywords.py:383High confidence
- Network access in code of a file that runsadd-account-negative-keywords/scripts/add_account_negative_keywords.py:384High confidence
- Network access in code of a file that runsadd-account-negative-keywords/scripts/add_account_negative_keywords.py:385High confidence
- Network access in code of a file that runsadd-account-negative-keywords/scripts/add_account_negative_keywords.py:386High confidence
- Network access in code of a file that runsadd-account-negative-keywords/scripts/add_account_negative_keywords.py:387High confidence
and 450 more
Only the first 500 facts are listed.
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md account-diagnostic/SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md account-diagnostic/SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md account-diagnostic/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md account-diagnostic/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md account-diagnostic/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md account-diagnostic/SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.