update
May 7, 2026
By Teun
Running Google Ads from the terminal with custom AI skills
A growth marketer at Kilo says he moved Google Ads management into Kilo CLI using custom skills, scripts, and rules. The setup uses different AI models for planning and execution, with dry-runs, paused launches, and account-specific guardrails to reduce errors and speed up routine work.
A growth marketer at Kilo says he now runs much of Google Ads from the terminal instead of the Google Ads UI or Editor, using Kilo CLI and a set of custom skills he wrote himself. In a detailed writeup, he described how the setup handles campaign creation, tracking checks, weekly reporting, and Performance Max search-term audits.
He said the shift reflects how paid search has changed over 12 years. Manual bidding and day-to-day campaign work have given way to automation, but the remaining work is still full of repetitive edits, naming changes, and account maintenance that are easy to get wrong by hand.
At Kilo, he said he moved the whole operation into a CLI-based workflow a few months ago. The goal was not to make the work more glamorous, but to make it faster, more consistent, and less error-prone.
The marketer said the main benefit is that the agent can do in minutes what would take about an hour of clicking in Google Ads Editor, such as renaming ad groups or building a new campaign from a spec. He said the output is consistent by construction, which avoids mistakes like pinning the wrong headline, pasting the wrong URL, or forgetting sitelinks.
He also said the workflow helps the team launch ads quickly around new trends, especially in AI, where timing matters. According to his writeup, a few prompts can be enough to get a campaign live, while the final enablement still happens deliberately.
The system is built around three parts: a library skill for Google Ads scripts, a PMax search-term audit skill, and a weekly reporting skill. He said the scripts do the actual API work, while the skills document the patterns, rules, and account-specific quirks that the agent should follow.
The Google Ads scripts library acts as a reference for all existing automation. According to the post, every mutating script defaults to --dry-run, supports --execute, creates new campaigns paused, and can resume with REUSE_CAMPAIGN_ID if a run fails halfway through.
That matters because API work can break in the middle of large builds. He gave one example of a campaign with 751 ad groups where a restart from scratch would be impractical, so resumable scripts are part of the safety model.
He also described a tracking-template audit script that scans campaigns for mismatches between campaign names and tracking parameters. In one example, a renamed campaign left utm_campaign pointing to an old name, which would quietly send analytics data to the wrong label.
The Performance Max audit skill turns a messy search-terms export into a routing plan. He said the workflow parses a 3,000-row CSV, cross-references live Search keywords, flags cannibalisation, groups irrelevant terms, and decides whether a query should become a brand, competitor, category, or negative action.
One rule is explicit: every keyword added to a Search campaign must also become an exact negative in PMax. He said that prevents Performance Max from taking traffic meant for targeted Search campaigns at a higher cost.
The weekly-report skill automates Monday reporting by pulling data, formatting it, and leaving the commentary to the human. He said the script handles mechanical aggregation, while the team still writes the narrative around spend changes, CPA, and revenue.
He said the system also logs its own changes. Every update goes into CHANGELOG.md, tasks are updated in todo.md, and campaigns.md is regenerated from the API before each push so the repo reflects current account state.
According to the post, the result is a self-describing setup where the skills, scripts, and markdown files explain what is live, what changed, and what should happen next. He said the whole skill layer is only about 600 lines of markdown, but it is what makes the Python safe to generate from prompts.