BABORSelected work All work
01 / 03Measurement systemLive system

Multi-source attribution for UK service businesses

Overview

A transparent measurement system that turns five disconnected marketing sources into an inspectable cost per enquiry.

Role
System architecture · Data engineering · Attribution logic
Stack
Python · SQL · Postgres · REST APIs · ETL
Interactive attribution diagram connecting five marketing sources to enquiries
Portfolio demonstration · illustrative data · no client records shown

The problem worth solving.

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?

How the parts connect.

  1. 01

    Vendor APIs

  2. 02

    Scheduled ingestion

  3. 03

    Normalised Postgres model

  4. 04

    SQL attribution models

  5. 05

    Decision dashboard

From ambiguity to a working system.

  1. 01

    Built scheduled ingestion jobs against Google Ads, GA4, Search Console, Meta and Google Business Profile APIs.

  2. 02

    Normalised mismatched channel schemas into a shared Postgres model before calculating performance.

  3. 03

    Joined click identifiers and first-party enquiry data, with repeat-contact de-duplication.

  4. 04

    Implemented position-based and last-non-direct attribution side by side in SQL so assumptions remain inspectable.

Normalise before attribution

Each source defines campaigns, conversions and dates differently. A shared schema keeps model logic independent from vendor formats.

Keep models comparable

Running two attribution views side by side exposes where a single last-click answer would hide earlier influence.

Record data quality

Source gaps and unresolved joins are surfaced instead of silently presented as complete measurement.

5sources unified
Dailyautomated refresh
Per-channelcost per enquiry

What the demonstration does not claim.

  • Vendor APIs use different schemas, authentication models and refresh windows.
  • Attribution is a decision model, not ground truth; assumptions must remain visible.
  • The public demonstration uses an illustrative flow and contains no client data.
PythonSQLPostgresREST APIsETL