Normalise before attribution
Each source defines campaigns, conversions and dates differently. A shared schema keeps model logic independent from vendor formats.
A transparent measurement system that turns five disconnected marketing sources into an inspectable cost per enquiry.

Owners were spending across Google Ads, Meta, organic search and Google Business Profile with no honest answer to a simple question: which activity actually produced an enquiry?
Vendor APIs
Scheduled ingestion
Normalised Postgres model
SQL attribution models
Decision dashboard
Built scheduled ingestion jobs against Google Ads, GA4, Search Console, Meta and Google Business Profile APIs.
Normalised mismatched channel schemas into a shared Postgres model before calculating performance.
Joined click identifiers and first-party enquiry data, with repeat-contact de-duplication.
Implemented position-based and last-non-direct attribution side by side in SQL so assumptions remain inspectable.
Each source defines campaigns, conversions and dates differently. A shared schema keeps model logic independent from vendor formats.
Running two attribution views side by side exposes where a single last-click answer would hide earlier influence.
Source gaps and unresolved joins are surfaced instead of silently presented as complete measurement.