Context
An agency reporting on dozens of client websites has the same numbers spread across four Google products. Every month someone opens each console, exports each range, and rebuilds the same deck.
Problem
Manual reporting doesn't just cost hours — it caps what you can ask. Nobody compares this quarter's organic traffic to ad spend across the whole client book, because assembling that once takes a day and it's stale the moment it's done.
Solution
A pnpm monorepo in three parts. An ETL worker authenticates through Google OAuth2 and syncs GA4, Search Console, Google Ads, and Business Profile into a PostgreSQL warehouse on a schedule. An Express REST API serves that history. A Next.js dashboard renders it with React Query and Recharts, so a client's traffic, rankings, spend, and local presence sit on one screen over a common date range.
Shared TypeScript types run through all three packages, with Sequelize migrations for schema changes, Winston for structured logging, and Vitest for unit coverage.
Outcome
Reporting shifted from a recurring manual export to a scheduled sync — and cross-client questions that were previously impractical became a query.