Case study · Google Ads automation

Programmatic Google Ads — Dr. Ayberk Akcay

Websites, SEO and a custom engine on the Google Ads API for a healthcare practice. The engine builds campaigns, ad groups, keywords and ads from templates and rules: 2,000+ ads across 1,000+ ad groups, in an account that spends over $1M a year on Google Ads.

  • Client Dr. Ayberk Akcay
  • Sector Healthcare
  • Scope Websites, SEO, Google Ads automation
  • Owner
  • Period 2024–2026

At a Glance

Built
Websites, technical SEO and an automation engine on the Google Ads API
Scale
2,000+ ads in 1,000+ ad groups, generated by software
Spend
Over $1M a year in Google Ads, managed with pacing controls
Coverage
The work is also described in a third-party case study published by Spider AF

The Problem

The practice offers several services in several locations, and every combination needs its own keywords, ads and landing pages. Building and maintaining that by hand was slow, and it made budgets hard to pace.

What was delivered

Websites and SEO

Site builds and the technical SEO foundations the campaigns land on.

Account structure

Campaigns organised by service, intent and location.

Automation engine

Software that creates and updates campaigns, ad groups, keywords and ads from templates.

Governance

Change logs, dry runs and guardrails before anything is applied to the account.

How the Engine Works

Every service and location gets the same structure, generated from templates and kept in line by scheduled jobs.

Automation engine

  • Generators for campaigns, ad groups, keywords and ads.
  • Templated ad copy with variable slots and guardrails.
  • Rules for bids, budgets and negative keyword lists, scoped by label.
  • Sync jobs that keep the account in line with the source of truth.

Scale

  • 2,000+ ads across 1,000+ ad groups produced by software.
  • Over $1M a year managed with pacing controls.

Generator (simplified)

for (topic in topics) {
  kw = expand_keywords(topic)             // variants and match types
  ag = ensure_ad_group(topic, geo, intent)
  for (k in kw) add_keyword(ag, k)

  creatives = render_templates(topic, brand, policy)
  for (ad in creatives) upsert_ad(ag, ad)

  set_bids(ag, ruleset)                   // device, geo, time modifiers
}
schedule(sync_jobs, intervals)            // hygiene, labels, negatives

Architecture

Components

  • Controller API with OAuth2 access to Google Ads.
  • Scheduler and workers for generation and sync.
  • Template service for ad copy and sitelinks.
  • Rules engine for bids, budgets and exclusions.
  • Logger with change journals and diff views.

Data sources

  • Keyword seeds and intent taxonomies.
  • Landing page metadata and schema markup.
  • Performance signals from the ad account.

System flow

+---------------------+
| Web + SEO layer     |
|  - site build       |
|  - schema, speed    |
+----------+----------+
           |
           v
+---------------------+       +-------------------+
| Automation API      |<----->| Google Ads API    |
|  - OAuth2, scopes   |       |  campaigns, ads   |
+----------+----------+       +-------------------+
           |
           v
+---------------------+
| Workers, scheduler  |
|  - generators       |
|  - sync jobs        |
+----------+----------+
           |
           v
+---------------------+
| Logs and governance |
+---------------------+

Controls and Guardrails

  • Label-based scopes for safe bulk operations.
  • Rate limits, and dry-run modes before changes are applied.
  • Policy filters for capitalisation, punctuation and claims in ad copy.
  • Budget pacing with daily and monthly caps.

Note: the engine does not scrape. It uses the official Google Ads API with OAuth2 and follows Google's advertising policies. Every change is recorded with a timestamp and who made it.

Outputs and Results

Structure

  • Campaigns by service, intent and location
  • Keyword sets with match types
  • Ads with assets and variants

Operations

  • Daily hygiene and fixes
  • Creative refresh cycles
  • Bid adjustments

Reporting

  • Label views for experiments
  • Budget dashboards
  • Change journals
2,000+ Ads generated by the engine
1,000+ Ad groups created
$1M+ Annual Google Ads spend managed

What changed

  • New ads and ad groups no longer wait on someone building them by hand.
  • Account structure and hygiene stay consistent across services and locations.
  • Creative and bid changes go out through rules and templates instead of one-off edits.

Technology

  • Google Ads API
  • Python
  • PostgreSQL
  • OAuth2
  • Scheduled jobs
  • Templates
  • Bidding rules
  • Budget pacing
  • SEO

Managing a large Google Ads account by hand?

Describe your services, locations and current account structure, and what you would want generated automatically.