Technical documentation

Horizen Placement Audit

A placement-intelligence pipeline for Google Ads. It ingests placement performance reports, enriches every website, mobile app, and YouTube channel with public metadata, scores each placement across seven quality dimensions plus a performance overlay, and exports exclusion-ready segments back into the advertiser's Google Ads workflow.

● Working prototype — internal use ◐ Google Ads API integration — in development ○ Hosted multi-account version — planned

Document version 1.2 · Last updated 2026-06-11 · Maintained by Horizen (Intelektas verslui, MB) · team@joinhorizen.com

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:

content_category content_quality mfa_risk brand_suitability audience_profile language_geo ad_load_ux

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

ComponentRoleNotes
Importer CLISingle entry point for import, scoring runs, status, export, and store maintenanceBatch directories of reports; hash-based dedup makes re-runs idempotent
Enrichment workersFetch public metadata per placement typeParallel, capped (timeouts + size limits), polite rate limiting; results cached
Channel resolverCanonicalises YouTube URL forms to channel IDsYouTube Data API v3 with persistent local cache
Scoring engineLLM-assisted labeling across the seven dimensionsSchema validator rejects malformed labels before any write
Placement storeSource of truth: placements, labels, enrichment cache, import stagingEmbedded SQL database (WAL mode), single-writer discipline
Web UIUpload/connect, coverage summary, segment review, export selectionLightweight Python web service + vanilla JS frontend
Export moduleComposes selected segments into exclusion-ready filesCSV 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:

Status note. The classification pipeline is a working prototype used in Horizen client engagements today, running on manually exported reports. The Google Ads API integration described above is the next milestone; this document and the application describe the same workflow.

Data handling

Roadmap

Questions about this document: team@joinhorizen.com · Google Ads is a product of Google LLC; Horizen is independent and not affiliated with Google.