Ads-only reporting scaffold on top of the existing BigQuery Google Ads raw export.
This repo is structured around a shared multi-account reporting model:
- raw source dataset stays immutable
- config and thresholds live in seeds
- staging models standardize transfer tables
- mart models drive the HTML reporting layer
- a small Python runtime orchestrates release gating and dbt promotion
gads_rawExisting Google Ads transfer tables. Do not modify.gads_reporting_cfgSeeded config tables such as accounts, thresholds, and account groups.gads_reporting_stgStandardized views over the raw transfer tables.gads_reporting_martPrecomputed reporting tables for the app.gads_manualOptional manual uploads such as auction insights if they are not present in the transfer.
- management hub
- overview
- daily trends
- campaign explorer
- keyword audit
- search terms
- budget exhaustion
- hourly performance
- weekday profile
- ad group daypart profile
- alerts
- first interactive report app
.
├── deploy
├── docs
├── macros
├── models
│ ├── marts
│ │ └── reporting
│ └── staging
│ ├── google_ads
│ └── manual
├── orchestration
├── profiles
├── scripts
└── seeds
- The reporting model is shared across all clients. Every reporting table carries
client_id,account_id, andreport_date. - Client-specific differences belong in config tables or staging adapters, not duplicated datasets and not frontend logic.
- The eventual HTML layer should read from
gads_reporting_mart, not from raw transfer tables.
python3.12 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp profiles.example.yml ~/.dbt/profiles.yml
dbt debugRun the repeatable validation flow with:
./scripts/dbt_validate.shValidate the operational runtime with:
./scripts/runtime_validate.shValidation details and the last verified results are tracked in docs/verification.md.
The first application layer lives in app/ and reads directly from gads_reporting_mart.
It currently includes:
- shared client/account/date filters
- management hub with conclusions and drilldown links
- overview page with KPI summary, trend, campaigns, and competition
- keyword and query audit page
- timing page with time-of-day, day-of-week, ad-group daypart, and budget pacing
- action queue page
- in-process TTL caching for repeated report loads
Run it locally with:
python3.12 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
./scripts/run_reporting_app.shThen open http://127.0.0.1:8000.
scripts/raw_freshness_check.pyManual raw-import gate against active accounts incfg_accounts.scripts/release_orchestrator.pyRuns raw freshness, stage build, stage tests, prod build, and prod tests in order. It also bootstraps missing config seeds in the target environment on first run.profiles/profiles.ymldbt profile template fordev,stage, andprodtargets.deploy/cloud_run/deploy_release_orchestrator.shDeploys the orchestrator as aCloud Run Job.deploy/cloud_run/create_release_scheduler.shCreates the dailyCloud Schedulertrigger against the Cloud Run Jobs API.
docs/reporting_contract.mddocs/contracts.mddocs/report_app.mddocs/infrastructure_design.mddocs/operations_design.md