{"id":"89840e09-0625-4a85-b6d5-3999913c8a45","shortId":"b3uvaA","kind":"skill","title":"google-ads","tagline":"Query, audit, and optimize Google Ads campaigns. Supports two modes: (1) API mode for bulk operations with the google-ads Python SDK, (2) attached-browser mode for users without API access. Use when asked to check ad performance, pause campaigns or keywords, find wasted spend, au","description":"# Google Ads Skill\n\nManage Google Ads accounts via API or an attached browser session.\n\n## Mode Selection\n\n**Check which mode to use:**\n\n1. **API Mode** - If user has `google-ads.yaml` configured or `GOOGLE_ADS_*` env vars\n2. **Browser Mode** - If user says \"I don't have API access\" or just wants quick checks\n\n```bash\n# Check for API config\nls ~/.google-ads.yaml 2>/dev/null || ls google-ads.yaml 2>/dev/null\n```\n\nIf no config found, ask: \"Do you have Google Ads API credentials, or should I use the attached browser session?\"\n\n---\n\n## Browser Mode (Universal)\n\n**Requirements:** User logged into ads.google.com in browser\n\n### Setup\n1. User opens ads.google.com and logs in\n2. User clicks Clawdbot Browser Relay toolbar icon (badge ON)\n3. Use `browser` tool with `profile=\"chrome\"`\n\n### Common Workflows\n\n#### Get Campaign Performance\n```\n1. Navigate to: ads.google.com/aw/campaigns\n2. Set date range (top right date picker)\n3. Snapshot the campaigns table\n4. Parse: Campaign, Status, Budget, Cost, Conversions, Cost/Conv\n```\n\n#### Find Zero-Conversion Keywords (Wasted Spend)\n```\n1. Navigate to: ads.google.com/aw/keywords\n2. Click \"Add filter\" → Conversions → Less than → 1\n3. Click \"Add filter\" → Cost → Greater than → [threshold, e.g., $500]\n4. Sort by Cost descending\n5. Snapshot table for analysis\n```\n\n#### Pause Keywords/Campaigns\n```\n1. Navigate to keywords or campaigns view\n2. Check boxes for items to pause\n3. Click \"Edit\" dropdown → \"Pause\"\n4. Confirm action\n```\n\n#### Download Reports\n```\n1. Navigate to desired view (campaigns, keywords, etc.)\n2. Click \"Download\" icon (top right of table)\n3. Select format (CSV recommended)\n4. File downloads to user's Downloads folder\n```\n\n**For detailed browser selectors:** Load `browser-workflows.md` from this skill's `references` folder.\n\n---\n\n## API Mode (Power Users)\n\n**Requirements:** Google Ads API developer token plus locally configured client credentials\n\n### Setup Check\n```bash\n# Verify google-ads SDK\npython -c \"from google.ads.googleads.client import GoogleAdsClient; print('OK')\"\n\n# Check config\ncat ~/.google-ads.yaml\n```\n\n### Common Operations\n\n#### Query Campaign Performance\n```python\nfrom google.ads.googleads.client import GoogleAdsClient\n\nclient = GoogleAdsClient.load_from_storage()\nga_service = client.get_service(\"GoogleAdsService\")\n\nquery = \"\"\"\n    SELECT campaign.name, campaign.status,\n           metrics.cost_micros, metrics.conversions,\n           metrics.cost_per_conversion\n    FROM campaign\n    WHERE segments.date DURING LAST_30_DAYS\n    ORDER BY metrics.cost_micros DESC\n\"\"\"\n\nresponse = ga_service.search(customer_id=CUSTOMER_ID, query=query)\n```\n\n#### Find Zero-Conversion Keywords\n```python\nquery = \"\"\"\n    SELECT ad_group_criterion.keyword.text,\n           campaign.name, metrics.cost_micros\n    FROM keyword_view\n    WHERE metrics.conversions = 0\n      AND metrics.cost_micros > 500000000\n      AND segments.date DURING LAST_90_DAYS\n    ORDER BY metrics.cost_micros DESC\n\"\"\"\n```\n\n#### Pause Keywords\n```python\noperations = []\nfor keyword_id in keywords_to_pause:\n    operation = client.get_type(\"AdGroupCriterionOperation\")\n    operation.update.resource_name = f\"customers/{customer_id}/adGroupCriteria/{ad_group_id}~{keyword_id}\"\n    operation.update.status = client.enums.AdGroupCriterionStatusEnum.PAUSED\n    operations.append(operation)\n\nservice.mutate_ad_group_criteria(customer_id=customer_id, operations=operations)\n```\n\n**For full API reference:** Load `api-setup.md` from this skill's `references` folder.\n\n---\n\n## Audit Checklist\n\nQuick health check for any Google Ads account:\n\n| Check | Browser Path | What to Look For |\n|-------|--------------|------------------|\n| Zero-conv keywords | Keywords → Filter: Conv<1, Cost>$500 | Wasted spend |\n| Empty ad groups | Ad Groups → Filter: Ads=0 | No creative running |\n| Policy violations | Campaigns → Status column | Yellow warning icons |\n| Optimization Score | Overview page (top right) | Below 70% = action needed |\n| Conversion tracking | Tools → Conversions | Inactive/no recent data |\n\n---\n\n## Output Formats\n\nWhen reporting findings, use tables:\n\n```markdown\n## Campaign Performance (Last 30 Days)\n| Campaign | Cost | Conv | CPA | Status |\n|----------|------|------|-----|--------|\n| Branded  | $5K  | 50   | $100| ✅ Good |\n| SDK Web  | $10K | 2    | $5K | ❌ Pause |\n\n## Recommended Actions\n1. **PAUSE**: SDK Web campaign ($5K CPA)\n2. **INCREASE**: Branded budget (strong performer)\n```\n\n---\n\n## Troubleshooting\n\n## Safety Boundaries\n\n- Do not pause campaigns, keywords, or budgets without explicit confirmation from the user.\n- Do not export or summarize account data beyond the account, date range, and entities the user requested.\n- Do not expose API credentials, downloaded reports, or account identifiers in chat output.\n- Do not use browser mode unless the user has attached the correct logged-in ads.google.com session.\n\n### Browser Mode Issues\n- **Can't see data**: Check user is on correct account (top right account selector)\n- **Slow loading**: Google Ads UI is heavy; wait for tables to fully load\n- **Session expired**: User needs to re-login to ads.google.com\n\n### API Mode Issues\n- **Authentication failed**: Refresh OAuth token, check `google-ads.yaml`\n- **Developer token rejected**: Ensure token is approved (not test mode)\n- **Customer ID error**: Use 10-digit ID without dashes\n\n## Security & Change-Control Addendum\n\n- Default mode is read-only audit/reporting.\n- Any mutating action (pause/enable/edit bids/budgets) requires explicit confirmation listing impacted entities first.\n- Browser mode must be user-attended for account-affecting actions.\n- Protect `~/.google-ads.yaml` permissions and never echo tokens/secrets in terminal output.","tags":["google","ads","agent","skills","jdrhyne","agent-skills","agentic-ai","ai-agents","automation","claude-code","clawdbot","codex"],"capabilities":["skill","source-jdrhyne","skill-google-ads","topic-agent-skills","topic-agentic-ai","topic-ai-agents","topic-automation","topic-claude-code","topic-clawdbot","topic-codex","topic-cursor","topic-developer-tools","topic-gemini-cli","topic-github-copilot","topic-llm-agents"],"categories":["agent-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/jdrhyne/agent-skills/google-ads","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add jdrhyne/agent-skills","source_repo":"https://github.com/jdrhyne/agent-skills","install_from":"skills.sh"}},"qualityScore":"0.565","qualityRationale":"deterministic score 0.56 from registry signals: · indexed on github topic:agent-skills · 230 github stars · SKILL.md body (5,721 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T00:54:19.125Z","embedding":null,"createdAt":"2026-04-18T22:04:58.385Z","updatedAt":"2026-04-22T00:54:19.125Z","lastSeenAt":"2026-04-22T00:54:19.125Z","tsv":"'/.google-ads.yaml':109,345,760 '/adgroupcriteria':450 '/aw/campaigns':181 '/aw/keywords':215 '/dev/null':111,115 '0':413,518 '1':14,73,147,176,210,223,246,270,506,578 '10':718 '100':568 '10k':572 '2':27,86,110,114,154,182,216,253,278,573,585 '3':164,190,224,260,286 '30':381,558 '4':195,234,265,291 '5':239 '50':567 '500':233,508 '500000000':417 '5k':566,574,583 '70':537 '90':422 'access':36,97 'account':58,491,612,616,632,666,669,756 'account-affect':755 'action':267,538,577,737,758 'ad':3,9,24,42,53,57,83,125,317,332,451,461,490,512,514,517,674 'ad_group_criterion.keyword.text':404 'add':218,226 'addendum':727 'adgroupcriterionoper':443 'ads.google.com':143,150,180,214,652,693 'ads.google.com/aw/campaigns':179 'ads.google.com/aw/keywords':213 'affect':757 'analysi':243 'api':15,35,60,74,96,106,126,311,318,472,627,694 'api-setup.md':475 'approv':710 'ask':39,120 'attach':29,63,133,646 'attached-brows':28 'attend':753 'au':51 'audit':5,482 'audit/reporting':734 'authent':697 'badg':162 'bash':103,328 'beyond':614 'bids/budgets':739 'boundari':593 'box':255 'brand':565,587 'browser':30,64,87,134,136,145,158,166,301,493,640,654,747 'browser-workflows.md':304 'budget':199,588,600 'bulk':18 'c':335 'campaign':10,45,174,193,197,251,275,349,376,524,555,560,582,597 'campaign.name':367,405 'campaign.status':368 'cat':344 'chang':725 'change-control':724 'chat':635 'check':41,68,102,104,254,327,342,486,492,661,702 'checklist':483 'chrome':170 'clawdbot':157 'click':156,217,225,261,279 'client':324,356 'client.enums.adgroupcriterionstatusenum.paused':457 'client.get':362,441 'column':526 'common':171,346 'config':107,118,343 'configur':80,323 'confirm':266,603,742 'control':726 'conv':501,505,562 'convers':201,206,220,374,399,540,543 'correct':648,665 'cost':200,228,237,507,561 'cost/conv':202 'cpa':563,584 'creativ':520 'credenti':127,325,628 'criteria':463 'csv':289 'custom':390,392,447,448,464,466,714 'dash':722 'data':546,613,660 'date':184,188,617 'day':382,423,559 'default':728 'desc':387,428 'descend':238 'desir':273 'detail':300 'develop':319,704 'digit':719 'download':268,280,293,297,629 'dropdown':263 'e.g':232 'echo':764 'edit':262 'empti':511 'ensur':707 'entiti':620,745 'env':84 'error':716 'etc':277 'expir':685 'explicit':602,741 'export':609 'expos':626 'f':446 'fail':698 'file':292 'filter':219,227,504,516 'find':48,203,396,551 'first':746 'folder':298,310,481 'format':288,548 'found':119 'full':471 'fulli':682 'ga':360 'ga_service.search':389 'get':173 'good':569 'googl':2,8,23,52,56,82,124,316,331,489,673 'google-ad':1,22,330 'google-ads.yaml':79,113,703 'google.ads.googleads.client':337,353 'googleadscli':339,355 'googleadsclient.load':357 'googleadsservic':364 'greater':229 'group':452,462,513,515 'health':485 'heavi':677 'icon':161,281,529 'id':391,393,435,449,453,455,465,467,715,720 'identifi':633 'impact':744 'import':338,354 'inactive/no':544 'increas':586 'issu':656,696 'item':257 'keyword':47,207,249,276,400,409,430,434,437,454,502,503,598 'keywords/campaigns':245 'last':380,421,557 'less':221 'list':743 'load':303,474,672,683 'local':322 'log':141,152,650 'logged-in':649 'login':691 'look':497 'ls':108,112 'manag':55 'markdown':554 'metrics.conversions':371,412 'metrics.cost':369,372,385,406,415,426 'micro':370,386,407,416,427 'mode':13,16,31,66,70,75,88,137,312,641,655,695,713,729,748 'must':749 'mutat':736 'name':445 'navig':177,211,247,271 'need':539,687 'never':763 'oauth':700 'ok':341 'open':149 'oper':19,347,432,440,459,468,469 'operation.update.resource':444 'operation.update.status':456 'operations.append':458 'optim':7,530 'order':383,424 'output':547,636,768 'overview':532 'page':533 'pars':196 'path':494 'paus':44,244,259,264,429,439,575,579,596 'pause/enable/edit':738 'per':373 'perform':43,175,350,556,590 'permiss':761 'picker':189 'plus':321 'polici':522 'power':313 'print':340 'profil':169 'protect':759 'python':25,334,351,401,431 'queri':4,348,365,394,395,402 'quick':101,484 'rang':185,618 're':690 're-login':689 'read':732 'read-on':731 'recent':545 'recommend':290,576 'refer':309,473,480 'refresh':699 'reject':706 'relay':159 'report':269,550,630 'request':623 'requir':139,315,740 'respons':388 'right':187,283,535,668 'run':521 'safeti':592 'say':91 'score':531 'sdk':26,333,570,580 'secur':723 'see':659 'segments.date':378,419 'select':67,287,366,403 'selector':302,670 'servic':361,363 'service.mutate':460 'session':65,135,653,684 'set':183 'setup':146,326 'skill':54,307,478 'skill-google-ads' 'slow':671 'snapshot':191,240 'sort':235 'source-jdrhyne' 'spend':50,209,510 'status':198,525,564 'storag':359 'strong':589 'summar':611 'support':11 'tabl':194,241,285,553,680 'termin':767 'test':712 'threshold':231 'token':320,701,705,708 'tokens/secrets':765 'tool':167,542 'toolbar':160 'top':186,282,534,667 'topic-agent-skills' 'topic-agentic-ai' 'topic-ai-agents' 'topic-automation' 'topic-claude-code' 'topic-clawdbot' 'topic-codex' 'topic-cursor' 'topic-developer-tools' 'topic-gemini-cli' 'topic-github-copilot' 'topic-llm-agents' 'track':541 'troubleshoot':591 'two':12 'type':442 'ui':675 'univers':138 'unless':642 'use':37,72,131,165,552,639,717 'user':33,77,90,140,148,155,295,314,606,622,644,662,686,752 'user-attend':751 'var':85 'verifi':329 'via':59 'view':252,274,410 'violat':523 'wait':678 'want':100 'warn':528 'wast':49,208,509 'web':571,581 'without':34,601,721 'workflow':172 'yellow':527 'zero':205,398,500 'zero-conv':499 'zero-convers':204,397","prices":[{"id":"c58164da-897f-4227-93f7-2d8975f355ea","listingId":"89840e09-0625-4a85-b6d5-3999913c8a45","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"jdrhyne","category":"agent-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T22:04:58.385Z"}],"sources":[{"listingId":"89840e09-0625-4a85-b6d5-3999913c8a45","source":"github","sourceId":"jdrhyne/agent-skills/google-ads","sourceUrl":"https://github.com/jdrhyne/agent-skills/tree/main/skills/google-ads","isPrimary":false,"firstSeenAt":"2026-04-18T22:04:58.385Z","lastSeenAt":"2026-04-22T00:54:19.125Z"}],"details":{"listingId":"89840e09-0625-4a85-b6d5-3999913c8a45","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"jdrhyne","slug":"google-ads","github":{"repo":"jdrhyne/agent-skills","stars":230,"topics":["agent-skills","agentic-ai","ai-agents","automation","claude-code","clawdbot","codex","cursor","developer-tools","gemini-cli","github-copilot","llm-agents","mcp","openclaw","prompt-engineering","prompts"],"license":null,"html_url":"https://github.com/jdrhyne/agent-skills","pushed_at":"2026-03-27T14:29:53Z","description":"A collection of AI agent skills for Clawdbot, Claude Code, Codex","skill_md_sha":"f2f5c619c6e1983a10171267b8e1452555eb8728","skill_md_path":"skills/google-ads/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/jdrhyne/agent-skills/tree/main/skills/google-ads"},"layout":"multi","source":"github","category":"agent-skills","frontmatter":{"name":"google-ads","description":"Query, audit, and optimize Google Ads campaigns. Supports two modes: (1) API mode for bulk operations with the google-ads Python SDK, (2) attached-browser mode for users without API access. Use when asked to check ad performance, pause campaigns or keywords, find wasted spend, audit conversion tracking, or optimize Google Ads accounts."},"skills_sh_url":"https://skills.sh/jdrhyne/agent-skills/google-ads"},"updatedAt":"2026-04-22T00:54:19.125Z"}}