Google Ads API Reporting & Optimization Tool
Internal tool used by Andrii Kolmykov to manage paid acquisition campaigns across client Google Ads accounts โ automating reporting, monitoring performance, and supporting day-to-day optimization decisions.
1. Tool Overview
I am a freelance PPC specialist and fractional Head of User Acquisition managing Google Ads campaigns for small and medium-sized businesses (SaaS, mobile apps, DTC e-commerce, B2B services). To deliver consistent, data-driven service across multiple client accounts, I use a custom-built tool that integrates directly with the Google Ads API.
The tool is operated only by me (single-operator) and is used exclusively to access client Google Ads accounts that have explicitly granted me access via OAuth โ either as a manager on their MCC or as a directly linked account.
2. What the tool does
- Performance reporting: Pulls campaign / ad group / ad-level metrics (impressions, clicks, spend, conversions, CPA, ROAS) via GAQL queries.
- Account auditing: Surfaces structural issues โ disapproved ads, learning-limited campaigns, missing conversion actions, low quality score keywords.
- Asset analysis: Inspects image and video creative usage across campaigns to support creative testing decisions.
- Optimization support: Provides decision-support data (bid trends, search term insights, audience performance) for manual optimizations performed in the Google Ads UI or via the API.
- Cross-account view: Aggregates KPIs across multiple client accounts I manage to support weekly strategic reviews.
3. Architecture
The tool is a Python application built on top of the official google-ads Python client library, exposed locally through a Model Context Protocol (MCP) server. It runs entirely on my local workstation โ there is no public-facing endpoint, no shared multi-tenant backend, and no third-party hosting of credentials.
- Python 3.11 +
google-adsclient library (Google Ads API v20) - OAuth 2.0 with refresh tokens stored locally in encrypted form
- FastMCP server (stdio transport) for local invocation
- No external database; query results are session-scoped only
4. API usage pattern
- Authentication: Standard OAuth 2.0 web flow. Each client account is linked by an MCC invitation or direct OAuth grant performed by the account owner. No password sharing.
- Calls: Predominantly
GoogleAdsService.SearchStream(GAQL reads). Limited use of mutate operations and only when explicitly initiated by the operator to apply optimizations. - Volume: Low โ designed for a manageable portfolio of client accounts (single-digit to low double-digit), not for high-frequency machine-driven trading.
- Rate limiting: Respects API quotas; queries are pulled on-demand during operator sessions rather than via continuous polling.
5. Security and access control
- The OAuth client and developer token are owned by me personally and never shared with third parties.
- Refresh tokens are stored locally on a single, encrypted workstation.
- Client account access is granted by the account owner through standard Google Ads access controls and can be revoked by them at any time.
- No client account data is persisted to disk beyond what the operator explicitly exports (e.g., a CSV report shared with the client).
- The tool is single-user โ only the operator (Andrii Kolmykov) has access to it.
6. Why API access is required
The Google Ads web UI is sufficient for individual account work but does not scale for cross-account reporting, structural audits, or repeatable analyses. Using the API for read-mostly workloads:
- Lets me deliver consistent weekly performance reports to clients without manual UI scraping.
- Surfaces account-health issues earlier than periodic manual reviews.
- Saves billable hours that otherwise go into exporting CSVs and pivoting them โ those hours can instead go into strategy and creative work for clients.
7. Campaign types supported
Search, Shopping, Performance Max, Display, App campaigns (UAC). The tool is read-mostly across all of these and supports mutations primarily on Search and Performance Max where ongoing optimization activity is highest.
8. Contact
For questions about this tool, the integration, or how I use the Google Ads API in client engagements, please reach out at akolmykov1@gmail.com.