Google Ads

Query, audit, and optimize Google Ads campaigns. Supports two modes: (1) API mode for bulk operations with google-ads Python SDK, (2) Browser automation mode for users without API …

Jonathan Rhyne

@jdrhyne

What This Skill Does

Queries, audits, and optimizes Google Ads campaigns via two modes: API mode using the google-ads Python SDK for bulk operations, and browser automation mode for users without API access by attaching a browser tab to ads.google.com.

Replaces manual Google Ads UI navigation and ad-hoc spreadsheet analysis by automating campaign performance checks, keyword pauses, and wasted spend identification.

When to Use It

  • Check campaign performance metrics like cost, conversions, and cost per conversion
  • Find keywords with zero conversions and high spend to pause or optimize
  • Pause underperforming campaigns or keywords directly from the interface
  • Audit conversion tracking setup across campaigns
  • Download campaign or keyword reports in CSV format for offline analysis
  • Identify wasted spend by filtering keywords with high cost and no conversions

Install

$ openclaw skills install @jdrhyne/google-ads

Google Ads Skill

Manage Google Ads accounts via API or browser automation.

Mode Selection

Check which mode to use:

  1. API Mode - If user has google-ads.yaml configured or GOOGLE_ADS_* env vars
  2. Browser Mode - If user says "I don't have API access" or just wants quick checks
# Check for API config
ls ~/.google-ads.yaml 2>/dev/null || ls google-ads.yaml 2>/dev/null

If no config found, ask: "Do you have Google Ads API credentials, or should I use browser automation?"


Browser Automation Mode (Universal)

Requirements: User logged into ads.google.com in browser

Setup

  1. User opens ads.google.com and logs in
  2. User clicks Clawdbot Browser Relay toolbar icon (badge ON)
  3. Use browser tool with profile="chrome"

Common Workflows

Get Campaign Performance

1. Navigate to: ads.google.com/aw/campaigns
2. Set date range (top right date picker)
3. Snapshot the campaigns table
4. Parse: Campaign, Status, Budget, Cost, Conversions, Cost/Conv

Find Zero-Conversion Keywords (Wasted Spend)

1. Navigate to: ads.google.com/aw/keywords
2. Click "Add filter" → Conversions → Less than → 1
3. Click "Add filter" → Cost → Greater than → [threshold, e.g., $500]
4. Sort by Cost descending
5. Snapshot table for analysis

Pause Keywords/Campaigns

1. Navigate to keywords or campaigns view
2. Check boxes for items to pause
3. Click "Edit" dropdown → "Pause"
4. Confirm action

Download Reports

1. Navigate to desired view (campaigns, keywords, etc.)
2. Click "Download" icon (top right of table)
3. Select format (CSV recommended)
4. File downloads to user's Downloads folder

For detailed browser selectors: See references/browser-workflows.md


API Mode (Power Users)

Requirements: Google Ads API developer token + OAuth credentials

Setup Check

# Verify google-ads SDK
python -c "from google.ads.googleads.client import GoogleAdsClient; print('OK')"

# Check config
cat ~/.google-ads.yaml

Common Operations

Query Campaign Performance

from google.ads.googleads.client import GoogleAdsClient

client = GoogleAdsClient.load_from_storage()
ga_service = client.get_service("GoogleAdsService")

query = """
    SELECT campaign.name, campaign.status,
           metrics.cost_micros, metrics.conversions,
           metrics.cost_per_conversion
    FROM campaign
    WHERE segments.date DURING LAST_30_DAYS
    ORDER BY metrics.cost_micros DESC
"""

response = ga_service.search(customer_id=CUSTOMER_ID, query=query)

Find Zero-Conversion Keywords

query = """
    SELECT ad_group_criterion.keyword.text,
           campaign.name, metrics.cost_micros
    FROM keyword_view
    WHERE metrics.conversions = 0
      AND metrics.cost_micros > 500000000
      AND segments.date DURING LAST_90_DAYS
    ORDER BY metrics.cost_micros DESC
"""

Pause Keywords

operations = []
for keyword_id in keywords_to_pause:
    operation = client.get_type("AdGroupCriterionOperation")
    operation.update.resource_name = f"customers/{customer_id}/adGroupCriteria/{ad_group_id}~{keyword_id}"
    operation.update.status = client.enums.AdGroupCriterionStatusEnum.PAUSED
    operations.append(operation)

service.mutate_ad_group_criteria(customer_id=customer_id, operations=operations)

For full API reference: See references/api-setup.md


Audit Checklist

Quick health check for any Google Ads account:

CheckBrowser PathWhat to Look For
Zero-conv keywordsKeywords → Filter: Conv<1, Cost>$500Wasted spend
Empty ad groupsAd Groups → Filter: Ads=0No creative running
Policy violationsCampaigns → Status columnYellow warning icons
Optimization ScoreOverview page (top right)Below 70% = action needed
Conversion trackingTools → ConversionsInactive/no recent data

Output Formats

When reporting findings, use tables:

## Campaign Performance (Last 30 Days)
| Campaign | Cost | Conv | CPA | Status |
|----------|------|------|-----|--------|
| Branded  | $5K  | 50   | $100| ✅ Good |
| SDK Web  | $10K | 2    | $5K | ❌ Pause |

## Recommended Actions
1. **PAUSE**: SDK Web campaign ($5K CPA)
2. **INCREASE**: Branded budget (strong performer)

Troubleshooting

Browser Mode Issues

  • Can't see data: Check user is on correct account (top right account selector)
  • Slow loading: Google Ads UI is heavy; wait for tables to fully load
  • Session expired: User needs to re-login to ads.google.com

API Mode Issues

  • Authentication failed: Refresh OAuth token, check google-ads.yaml
  • Developer token rejected: Ensure token is approved (not test mode)
  • Customer ID error: Use 10-digit ID without dashes

Top skills in this category

Playwright (Automation + MCP + Scraper)

@ivangdavila

Automates, tests, and debugs browsers with Playwright: locators, auto-waiting, traces, CI runs, and MCP browser control. Use when a test is flaky, times out, or fails only in CI or headless; when a locator matches multiple elements or the wrong one (strict mode violation); when clicks need force, waits become sleeps, or networkidle never settles; for storageState and login setup, request mocking and HAR replay, uploads and downloads, iframes and shadow DOM, popups and dialogs, screenshot diffs that change per machine, trace and report artifacts, sharding a slow suite, device and permission emulation, accessibility checks, driving a real browser through Playwright MCP, extracting data from JS-rendered pages, or porting a Cypress, Puppeteer, or Selenium suite to Playwright. Not for maintaining an existing Cypress or Puppeteer suite (cypress, puppeteer) or for work a plain HTTP request answers (http).

12839k

Agent Browser

@matrixy

Headless browser automation CLI optimized for AI agents with accessibility tree snapshots and ref-based element selection

453152k

Free Ride - Unlimited free AI

@shaivpidadi

Manages free AI models from OpenRouter for OpenClaw. Automatically ranks models by quality, configures fallbacks for rate-limit handling, and updates opencla...

48269k

Browser Use

@shawnpana

Automates browser interactions for web testing, form filling, screenshots, and data extraction. Use when the user needs to navigate websites, interact with w...

11475k

Playwright MCP

@spiceman161

Browser automation via Playwright MCP server. Navigate websites, click elements, fill forms, extract data, take screenshots, and perform full browser automation workflows.

15845k