Scattered sources
Different structures, histories, and metric definitions.
MARKETING DATA ENGINEERING
I build BigQuery warehouses that bring marketing sources into documented models, with scheduled loads and validated tables for dashboards and analysis. It is the least visible part of reporting, and the one that holds it up.
Typical sources: paid media, web analytics, and CRM.
01 / THE PROBLEM
When campaign, CRM, and analytics data live in different platforms and files, every report starts with cleaning, joining, and checking the same information again.
Different structures, histories, and metric definitions.
Files and transformations have to be rebuilt or adjusted every reporting cycle.
Numbers are difficult to trust when the source and calculation logic are unclear.
02 / WHAT I BUILD
Every table has a reason to exist: it feeds a report or an analysis with defined sources, data rules, and level of detail.
Before I consider a table done, I check coverage, quality rules, and differences from the source.
Each source connected, with its historical coverage and refresh frequency documented.
Tables, identifiers, and relationships organized so the data can be queried at a consistent level of detail.
Tables or views with documented dimensions, metrics, and calculation rules for each use case.
Validation checks, issue logs, and documentation for reviewing updates and handling exceptions.
The focus here is the data foundation. How I turn those tables into automated reports is covered in Reporting Automation.
03 / INTERACTIVE DEMO
A file can arrive twice, contain a correction or include incomplete data. See what the workflow does before updating the report.
Every test starts with the same report: 4 campaigns · USD 3,00001 / Choose what arrives
This sum includes repeated rows; it is not the actual spend.
One row per platform, account, campaign and day. Google Ads amounts arrive in micros: they are standardized to USD, without currency conversion.
| Source / campaign | Spend | Clicks | What changed |
|---|---|---|---|
| Google AdsG-01 · Brand search | USD 1,200 | 1,200 | Current record |
| Meta AdsM-01 · Prospecting | USD 1,000 | 2,000 | Current record |
| Google AdsG-01 · Generic search | USD 500 | 450 | Current record |
| LinkedIn AdsL-01 · Fund information | USD 300 | 150 | Current record |
| Report total | USD 3,000 | 3,800 | 4 campaigns |
Copies of the same key are ignored. A correction replaces the previous version; it is never added as another campaign.
04 / HOW I WORK
Three steps. The data model, the controls, and how the workflow runs are all documented.
I review sources, accounts, historical coverage, and update frequency. I configure extraction and keep every record traceable to its source.
I organize the tables, document metrics and check results against each source.
The result: reporting-ready tables, automated checks and a guide for running the workflow and reviewing exceptions.
05 / CORE TOOLS
BigQuery and SQL for the model, Python for loads and checks, and Data Studio to review the output.
06 / TECHNICAL QUESTIONS
Before building, I write down the sources, available history, level of detail, refresh frequency, and validation criteria.
Each table has a key defined by its grain: platform, account, campaign, and day. Loads merge on that key, so a reload creates no new rows and a correction updates the existing record. That is what the demo shows.
It stays out of the reporting table and is logged as an exception, with its reason. It is not turned into zero or silently dropped: it is reviewed, fixed at the source, and picked up by the next load.
I compare totals by period, account, and metric against the source, using the same time zone and currency. Expected differences, such as attribution windows or late-arriving data, are documented rather than forced to match.
It works for a quick view, but every report ends up repeating the same logic and definitions drift apart. With an intermediate model in BigQuery, metrics are calculated once, history is kept, and every dashboard or analysis starts from the same tables.
CONTACT
If you work with marketing data and want to compare approaches, message me.
Message me on LinkedIn