Why this platform exists
An ecommerce account today runs across six campaign types at once, and the questions that decide budgets cut across all of them: which products and queries make margin, where spend leaks, what to scale next. The answers live in six different report screens, none of which know the store's margins. Exporting reports by hand, account by account, week after week, doesn't scale — and the Google Ads UI's keyword and placement views answer "what happened", not "what is this query, this keyword, this placement actually worth".
Horizen Insights closes that gap with one internal platform: scheduled, consistent reporting across every campaign type; query and keyword intelligence grounded in Google's own planning data; and placement-quality auditing. Its outputs drive the decisions Horizen makes in client accounts — manually, in the Google Ads interface.
The three modules
| Module | What it does | Status |
|---|---|---|
| Reporting Hub | Scheduled performance pulls across Search, Shopping, Performance Max, Display, Video, and Demand Gen into a normalised reporting store; ROAS and product-margin overlays; weekly decision reports per account | In development |
| Keyword Lab | Search-term mining (classifies queries for intent and waste) plus keyword expansion: candidate keywords enriched with search volumes, trends, seasonality, and forecasts from Google's keyword planning data | In development |
| Placement Audit | Classifies every website, mobile app, and YouTube channel ads ran on across seven quality dimensions plus a performance overlay; produces exclusion-ready segments — full module documentation | Working prototype |
End-to-end workflow
Connect API: in dev
An account is connected once via Google OAuth (the account's own consent). Today, the equivalent input is manual report exports from the Google Ads UI. The Google Ads API integration replaces those exports — it is read-only (see API usage).
Pull API: in dev
Scheduled weekly pulls plus on-demand refreshes per account: campaign/ad-group/asset-group performance for all six campaign types, search term reports, product-level Shopping performance, and placement reports. Each pull lands in a staging area with hash-based dedup, so re-runs are idempotent.
Normalise live
Rows are parsed into a canonical store with consistent dimensions across campaign types — date, account, campaign, entity (query / product / placement / asset group), and metrics (impressions, clicks, cost, conversions, conversion value).
Enrich & classify livekeyword data: in dev
Three enrichment layers: placements get public metadata and seven-dimension quality labels (the shipped Placement Audit pipeline); search terms get intent and waste classification; keyword candidates get search volumes, trends, and forecasts from Google's keyword planning data. A margin table per client joins product economics onto Shopping and PMax rows.
Review live
The web UI presents per-account views: cross-campaign performance summaries, ranked waste candidates (queries and placements), keyword opportunities with volume and forecast context, and per-row evidence behind every label.
Act — manually, in Google Ads live
Outputs are decision documents and exclusion/expansion-ready CSV lists. The Horizen team applies approved changes (negative keywords, placement exclusions, new keywords, budget shifts) by hand in the Google Ads interface. The platform makes no changes to any account via the API.
Google Ads API usage
The API integration is the subject of our developer-token application. It is deliberately narrow: read-only reporting plus keyword planning, for accounts under or linked to the Horizen manager account, each authorised by its own OAuth consent.
| Purpose | API surface | Frequency |
|---|---|---|
| Cross-campaign performance | GoogleAdsService.SearchStream — campaign, ad_group, asset_group queries with metrics, segmented by date and campaign type | Weekly per account + on demand |
| Search term reports | search_term_view (Search, Shopping) and campaign_search_term_insight (Performance Max) | Weekly per account |
| Shopping product performance | shopping_performance_view — product-level metrics joined to client margin data | Weekly per account |
| Placement reports | group_placement_view, detail_placement_view — input to the Placement Audit module | Weekly per account + on demand |
| Keyword planning | KeywordPlanIdeaService.GenerateKeywordIdeas, GenerateKeywordHistoricalMetrics, GenerateKeywordForecastMetrics — volumes, trends, forecasts for Keyword Lab | Per research session |
| Account discovery | CustomerService.ListAccessibleCustomers, customer_client query | On connect |
- No mutations. The integration creates or changes nothing in any account: no campaigns, no bids, no budgets, no keywords, no exclusions. All changes are applied manually by the Horizen team in the Google Ads interface.
- Campaign types covered: Search, Shopping, Performance Max, Display, Video, Demand Gen. App campaigns are not supported.
- Volume: reporting pulls dominate; estimated well under Basic Access daily limits at current account count.
Components
| Component | Role | Notes |
|---|---|---|
| Connector layer | OAuth flows and scheduled report pulls per account | In development; replaces manual UI exports; staged, hash-deduplicated, idempotent |
| Reporting store | Source of truth: normalised performance rows, labels, enrichment caches, margin tables | Embedded SQL database (WAL mode), single-writer discipline |
| Classification engines | Placement labeling (shipped) and search-term intent/waste labeling | LLM-assisted; schema validator rejects malformed labels before any write |
| Keyword Lab engine | Joins candidate keywords with planning data: volumes, trends, forecasts | In development; per research session, cached per client |
| Margin overlay | Per-client product economics joined onto Shopping/PMax performance | Client-provided cost data; never shared across clients |
| Web UI | Per-account dashboards, waste queues, keyword research views, export selection | Lightweight Python web service + vanilla JS frontend |
| Export module | Decision reports and exclusion/expansion-ready CSV lists | Applied manually by the team in Google Ads |
Data handling
- The platform processes account-level advertising data: performance metrics, search terms, keyword planning statistics, placement URLs/IDs and public metadata about them, plus client-provided product margin tables. It does not process end-consumer personal data.
- Report files are deleted after import; derived classifications and aggregated reporting data are retained for the engagement's duration.
- Each client's data produces only that client's reporting and research. It is never shared across clients, sold, or used for any other purpose. Details in our Privacy Policy.
- Google user data obtained via OAuth will be handled per the Google API Services User Data Policy, including its Limited Use requirements.
Roadmap
- Shipped — Placement Audit pipeline (import, enrichment, seven-dimension scoring, performance overlay, review UI, CSV exports); normalised reporting store; review UI foundations.
- In development — Reporting Hub and Keyword Lab modules; read-only Google Ads API integration (OAuth connect, scheduled pulls, keyword planning data).
- Planned — API write-back of approved exclusion lists; hosted multi-account version with per-account isolation and billing.
Questions about this document: team@joinhorizen.com · Google Ads is a product of Google LLC; Horizen is independent and not affiliated with Google.