google-ads
Use when checking or changing Google Ads from the terminal (campaign spend, clicks and conversions, pausing or enabling a campaign, changing a daily budget…
Skill by tirupati17
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/tirupati17-google-ads
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: backend, security, marketing, finance
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/google-ads
What's inside
- Skill name
google-ads- Description
- Use when checking or changing Google Ads from the terminal (campaign spend, clicks and conversions, pausing or enabling a campaign, changing a daily budget, running a GAQL query), when setting up Google Ads API access (developer token, OAuth refresh token, manager account id), when purchase conversions from a mobile app are missing or not reaching Ads, or when an Ads account is suspended for cloaking or another policy.
- License
- MIT
- Instructions
- 45 lines in SKILL.md · view on GitHub
Files (1)
- SKILL.md
SKILL.md (first lines)
# Google Ads: campaigns, budgets, conversions ## Credentials `cpm creds setup googleads` asks for each one; `cpm googleads auth` mints the refresh token. | Name | Where to get it | |---|---| | `GOOGLE_ADS_DEVELOPER_TOKEN` | Only a **manager (MCC) account** has one: Tools > API Center. Create a free manager account and link your ad account under it if you have none. A new token is at **Test** access and only works on test accounts; apply for **Basic** (enough for your own accounts) from the same page. Google has added further tiers over time: whatever the page shows, anything short of Basic/Standard fails on a real account with `DEVELOPER_TOKEN_NOT_APPROVED`. | | `GOOGLE_ADS_CUSTOMER_ID` | The 10-digit id top right in the Ads UI of the account to act on. Dashes optional. `cpm googleads accounts` lists what you can reach. | | `GOOGLE_ADS_LOGIN_CUSTOMER_ID` | Optional. The manager's id, **only** when your Google user reaches the account through that manager. Wrong or missing here gives `USER_PERMISSION_DENIED`. | | `GOOGLE_ADS_CLIENT_ID` / `_SECRET` | GCP console, any project you own: enable **Google Ads API**, configure the **OAuth consent screen** (External; add yourself under Test users), then Credentials > Create OAuth client ID > **Desktop app**. Not "Web application": the loopback redirect needs Desktop. | | `GOOGLE_ADS_REFRESH_TOKEN` | `cpm googleads auth`. Sign in as the Google user that has access to the Ads account (not necessarily the GCP owner). Saved, never printed. | ## Commands ```bash cpm googleads auth # browser sign-in, saves the refresh token cpm googleads accounts # reachable customer ids, names, manager flag cpm googleads campaigns --days 7 # status, budget, cost, clicks, conversions cpm googleads conversions --days 30 # conversion actions, imported or not, recent count cpm googleads query "SELECT campaign.name, metrics.clicks FROM campaign WHERE segments.date DURING LAST_7_DAYS" cpm googleads budget "<campaign name or id>" 25 # dry run; Google validates it (validateOnly) cpm googleads pause "<campaign>" --commit cpm googleads enable "<campaign>" --commit ``` Every write is a dry run until `--commit`, and the dry run already asks Google to validate it, so a green dry run proves the credentials can write. Money is in the account currency; the API speaks micros (1,000,000 per unit). `--customer` acts on another account. The API version is one constant in `toolkit/services/googleads/_ads.py`; if every call returns 404, it has been sunset: set `GOOGLE_ADS_API_VERSION=vNN`. ## Traps - **Account suspended for "Circumventing systems: cloaking" on a site that serves the same page to everyone.** A direct app download link (an `.apk`, or any install path that bypasses the store) next to the store badge on the landing page reads to the policy review as evading app-store policy. Remove every such link before appealing, and say so in the appeal. One appeal at a time: a second within about a week can be marked unfounded. Advertiser verification and "confirm your affiliation" tasks can block the appeal; finish them first. No API campaign work while suspended. - **"Download" conversion counting every screen visit.** A GA4 event built on `screen_view` / screen class fires each time the screen opens. Installs come from the Ads **app download** conversion (store-measured, no SDK) or `first_open`, once per device. - **Paying for purchases Ads never sees.** RevenueCat has **no direct Google Ads integration** (Meta has one, Google does not). The route is RevenueCat > Integrations > **Firebase** (server-side, GA4 Measurement Protocol; needs the Firebase app id and a Measurement Protocol API secret per platform) > GA4 > link GA4 to Ads > import `purchase` as a conversion. The app must set the Firebase app instance id on the RevenueCat customer (`$firebaseAppInstanceId`), or RevenueCat **drops every event silently**. The other route is an MMP (AppsFlyer, Adjust, ...), which on iOS brings ATT and a "tracks you" privacy answer. - **Imported conversion shows 0 while sales happen.** Check upstream in order: event in GA4 Realtime, GA4 linked to this Ads account, action status ENABLED and primary. `cpm googleads conversions` shows type, primary and the recent count side by side. - **Test purchases polluting the conversion Ads bids on.** Sandbox purchases are forwarded too. Keep analytics collection off in debug/simulator builds, and remember `setAnalyticsCollectionEnabled` on iOS persists across launches, so the off path must write `false` back. - **iOS app that declares "does not track" ships an IDFA reader.** The plain `FirebaseAnalytics` SPM product embeds an IDFA support framework; `FirebaseAnalyticsCore` does not and needs no code change. - **Refresh token dies after a week.** An OAuth consent screen left in **Testing** issues refresh tokens that expire in 7 days (`invalid_grant`). Set it to **In production** (an unverified-app warning for your own use is fine), then run `auth` again. No refresh token returned at all: revoke the app at myaccount.google.com/permissions and rerun (`auth` already forces `prompt=consent`). - **Budget change moved other campaigns.** A shared budget belongs to several campaigns; `budget` refuses it without `--shared-ok`.
From tirupati17/cpm, MIT.
More from tirupati17/cpm
- 0.565score
revenuecat
tirupati17
Use when checking subscription metrics (MRR, revenue, active subscriptions, trials), looking up why a specific user does or does not have Pro, granting…
SkillAFreshness: AClaude Code +9 - 0.565score
amplitude
tirupati17
Use when listing or checking Amplitude Experiment feature flags, turning a flag on or off (kill switch, rollout), shipping code that is gated behind a new…
SkillAFreshness: AClaude Code +9 - 0.565score
appstore-release
tirupati17
Use when shipping an iOS app to App Store review (archive, upload, attach the build, write What's New, submit), updating localized descriptions, keywords or…
SkillAFreshness: AClaude Code +9 - 0.565score
gcp
tirupati17
Use when a tool needs a Google Cloud service account (Google Play publishing, RevenueCat purchase validation, Firebase, any Google API), when checking which…
SkillAFreshness: AClaude Code +9 - 0.565score
onesignal
tirupati17
Use when sending a push notification to a specific user, a list of users, a segment or everyone; when checking how many devices can receive push or whether…
SkillAFreshness: AClaude Code +9 - 0.565score
play-release
tirupati17
Use when publishing an Android app to Google Play (upload an AAB to internal, alpha, beta or production, staged rollout), when changing the Play listing text…
SkillAFreshness: AClaude Code +9 - 0.560score
cpm-learn
tirupati17
Use right after finishing a task that took real effort against an external service or API (a store console, billing, ads, analytics, push, cloud) and that is…
SkillAFreshness: AClaude Code +9 - 0.560score
service-task
tirupati17
One sentence an agent can match against a request.
SkillAFreshness: AClaude Code +9
Signals
- Stars
- 0
- Forks
- 0
- Open issues
- 0
- Last commit (this folder)
- Sep 27, 2026 (1 month ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/tirupati17/cpm
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from tirupati17
- 0.565score
revenuecat
tirupati17
Use when checking subscription metrics (MRR, revenue, active subscriptions, trials), looking up why a specific user does or does not have Pro, granting…
SkillAFreshness: AClaude Code +9 - 0.565score
amplitude
tirupati17
Use when listing or checking Amplitude Experiment feature flags, turning a flag on or off (kill switch, rollout), shipping code that is gated behind a new…
SkillAFreshness: AClaude Code +9 - 0.565score
appstore-release
tirupati17
Use when shipping an iOS app to App Store review (archive, upload, attach the build, write What's New, submit), updating localized descriptions, keywords or…
SkillAFreshness: AClaude Code +9 - 0.565score
gcp
tirupati17
Use when a tool needs a Google Cloud service account (Google Play publishing, RevenueCat purchase validation, Firebase, any Google API), when checking which…
SkillAFreshness: AClaude Code +9 - 0.565score
onesignal
tirupati17
Use when sending a push notification to a specific user, a list of users, a segment or everyone; when checking how many devices can receive push or whether…
SkillAFreshness: AClaude Code +9 - 0.565score
play-release
tirupati17
Use when publishing an Android app to Google Play (upload an AAB to internal, alpha, beta or production, staged rollout), when changing the Play listing text…
SkillAFreshness: AClaude Code +9
Cite this page
google-ads skill. Agent Mart. https://agentmart.dev/skills/tirupati17-google-ads (last updated 2026-10-24)