Why this tool exists
Display, Performance Max, and YouTube campaigns routinely spend across thousands of placements. The native placement report answers where ads ran and what it cost — but not what each placement actually is: a real publisher or a made-for-advertising site, a kids' game or a finance app, a brand-suitable channel or background-noise content farms. Auditing this by hand at ecommerce scale is not realistic.
Placement Audit closes that gap. It turns a raw placement report into a scored, segmented map of an account's placement footprint, and turns the worst segments into exclusion lists. The outcome is measurable: spend shifts from inventory that cannot convert toward inventory that can.
End-to-end workflow
Ingest liveAPI: in dev
An advertiser's placement performance report enters the pipeline. Today: a standard Google Ads placement report export (CSV/TSV), uploaded through the web UI or dropped into the importer. In development: direct pull through the official Google Ads API — the advertiser connects their account once via OAuth, and reports are fetched on demand (see API integration).
Normalise & deduplicate live
Rows are parsed into a canonical placements store with three independent placement types: website, mobile app, and YouTube channel. File-level hashes keep re-imports idempotent; URL canonicalisation collapses duplicate forms of the same placement (e.g. YouTube @handle, /c/, and video URLs resolving to one channel).
Enrich with public metadata live
Each unscored placement is enriched from public sources: websites via a capped, rate-limited fetch of the public homepage; mobile apps via public app-store metadata (name, category, content rating, install count, ads/IAP flags); YouTube channels via the YouTube Data API with a local resolution cache to minimise repeat lookups. Enrichment results are cached so a placement is never fetched twice.
Score across seven dimensions live
An LLM-assisted scoring engine assigns each placement structured labels across seven quality dimensions, validated against a fixed schema before they are written to the database:
A performance overlay then joins the advertiser's own report metrics (cost, impressions, conversions, value) onto the quality labels — so "high spend × high MFA-risk × zero conversions" surfaces as a ranked waste segment, not a hunch.
Review in the web UI live
The advertiser sees a coverage and segmentation summary of their footprint: spend by category, waste candidates ranked by cost, brand-suitability flags, and per-placement drill-down with the evidence behind each label.
Act: exclusion-ready exports liveAPI write-back: in dev
Selected segments export as exclusion-ready CSVs for use in the advertiser's Google Ads workflow — negative placement lists, brand-suitability reviews, or reporting. In development: writing shared placement exclusion lists back to the connected account through the Google Ads API, turning the audit→exclude loop into one click.
Components
| Component | Role | Notes |
|---|---|---|
| Importer CLI | Single entry point for import, scoring runs, status, export, and store maintenance | Batch directories of reports; hash-based dedup makes re-runs idempotent |
| Enrichment workers | Fetch public metadata per placement type | Parallel, capped (timeouts + size limits), polite rate limiting; results cached |
| Channel resolver | Canonicalises YouTube URL forms to channel IDs | YouTube Data API v3 with persistent local cache |
| Scoring engine | LLM-assisted labeling across the seven dimensions | Schema validator rejects malformed labels before any write |
| Placement store | Source of truth: placements, labels, enrichment cache, import staging | Embedded SQL database (WAL mode), single-writer discipline |
| Web UI | Upload/connect, coverage summary, segment review, export selection | Lightweight Python web service + vanilla JS frontend |
| Export module | Composes selected segments into exclusion-ready files | CSV today; Google Ads API shared exclusion lists in development |
Google Ads API integration
The API integration replaces the manual CSV step at both ends of the pipeline and is the basis of our Google Ads API developer-token application. Scope of use:
- Reporting (read) — pull placement performance data (e.g. group placement and detail placement views) from our own manager account and from client accounts that have authorised access, on a scheduled or on-demand basis, instead of manual report exports.
- Exclusion management (write) — create and update shared placement exclusion sets composed from audit results, applied only after explicit human review and approval in the web UI.
- Account scope — accounts under, or linked to, the Horizen manager account; each client authorises via their own Google OAuth consent. No access is requested beyond what the audit workflow needs.
Data handling
- The pipeline processes placement-level advertising data: placement URLs/IDs, public metadata about those placements, and the advertiser's own performance metrics. It does not process end-consumer personal data.
- Uploaded reports are processed per session; raw upload files are deleted after the import job completes. Derived placement scores are retained to avoid re-scoring identical placements.
- Client report data is never shared across clients, sold, or used for any purpose other than producing that client's audit. Details in our Privacy Policy.
- When the API integration ships, Google user data obtained via OAuth will be handled in line with the Google API Services User Data Policy, including its Limited Use requirements.
Roadmap
- Shipped — import, enrichment, seven-dimension scoring, performance overlay, web UI review, CSV exclusion exports. In production use on Horizen-managed accounts.
- In development — Google Ads API integration: OAuth connect, scheduled placement report pulls, shared exclusion list write-back.
- Planned — hosted multi-account version so ecommerce brands and other practitioners can connect their own accounts, 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.