← All work
Shipped · daily sync, monthly reports

Ads Report Generator

A reporting engine for an agency running 50+ clients from a single managed account. Google Ads and GA4 data syncs into Supabase every day; once a month n8n builds a polished Google Slides report per client, files it in a fresh dated Drive folder, and Claude can spin up an on-demand report any time in between.

Google Ads APIGA4Supabasen8nGoogle SlidesAI
ads-report-generator · 50+ clients
Ads Report Generator screenshot

The challenge

50+ clients, a report month that never ended.

An agency managing Google Ads for 50+ clients from a single account hit the same wall every cycle: log into each account, export Google Ads and GA4, and hand-build a report per client. At that scale reporting isn't a task, it's a week lost, error-prone, and never quite consistent. The data was all there; the assembly was the bottleneck.

How it runs

Daily sync, monthly report.

01

Daily sync

Every day, n8n pulls fresh Google Ads + GA4 data for all 50+ clients into Supabase, deduped, so nothing is ever doubled.

02

Auto-onboard

New clients are detected and their real GA4 property validated by Claude automatically, so they join the daily sync without anyone lifting a finger.

03

Monthly build

Once a month, n8n builds a polished Google Slides report deck for each client through the Slides API.

04

Filed away

A fresh dated Drive folder is created for the month and every client's deck is filed neatly inside.

05

On demand

Any time in between, Claude pulls an on-demand report straight from Supabase.

What it does

The moving parts.

Technical stack

How it's built.

Google Ads → Sheets
Not pulled by direct API, the owner didn't want the main account's API opened. Instead 8 native Google Ads scheduled reports export to Google Drive as Sheets every day, and n8n syncs those 8 tables into Supabase. A no-API workaround that still lands the data.
GA4 · Google Cloud
GA4 is the exception: its Data API (a Google Cloud project + OAuth) pulls each client's on-site behaviour and conversions straight into Supabase.
Supabase · PostgreSQL
The data layer, every client's metrics land here as the single source of truth the report builder and Claude both read.
n8n
The engine, a daily sync (pull + dedupe + onboard new clients into Supabase) plus a monthly job that builds each Slides deck via HTTP and files it in the right dated Drive folder. No spreadsheet touched.
Google Slides + Drive
The Slides API renders each report; Drive auto-creates a dated folder per month and stores every client's deck.
AI (Claude)
Two jobs: it disambiguates a new client's GA4 properties, picking the real one that has conversions, so onboarding is automatic, and it serves on-demand reports straight from Supabase, a written read of the live numbers any time.

How it fits together

How the pieces connect.

One account, 50+ clients, a report per client every month, plus on-demand. Here's the shape of how the pieces talk. No sensitive details, just the wiring.

Google Ads8 daily reports → Drive Sheets
GA4Data API · Google Cloud
Supabase · PostgreSQLone door · source of truth
n8ndaily sync · monthly report
Google Slides + Drivereport deck · dated folders
Anthropic Claudeproperty sync + on-demand (MCP)

Who this fits for

Who it's for.

Marketing agenciesAgencies running Google Ads for dozens of clients who lose days to monthly reporting.
Multi-brand teamsIn-house teams reporting on several brands or accounts who want one consistent, automatic deck each.
Google Ads + GA4 usersAnyone who wants their spend-vs-outcome story built for them, on schedule, in Slides.

Screens

A look inside.

Questions & comments

Curious about this build?

Interested, or want to ask how something works? Leave a public comment.

Loading comments…

Comments are public. Links are shown as plain text, not clickable.