Case study · Data engineering → Decisions

Marketing Intelligence Platform

A cross-platform ETL pipeline and Streamlit application that replaced four disconnected reporting tools with a single source of truth — and became the tool the CEO decides from.

The Migration · 2026

PythonStreamlitPandasMeta Graph APIGHL APIGA4Search ConsoleProphetClaude Code

Open the live dashboard →

Every marketing team has the same quiet problem: the ad platform reports one number, the CRM reports another, and the meeting is spent arguing about which is right instead of what to do next.

01

The problem

Four platforms, four versions of the truth

Meta Ads knew about spend and clicks. GoHighLevel knew about leads and appointments. GA4 and Search Console knew about traffic. None of them knew about each other — so nobody could answer what a lead from a given campaign was actually worth once it reached a counsellor.

02

What I built

One pipeline, one source of truth

A Python ETL layer pulling from the Meta Graph API, the GoHighLevel API, GA4 and Google Search Console on a schedule, reconciling identity across them, and landing everything in a modelled dataset. On top of it, a Streamlit application with seven views — from a one-screen executive summary down to per-campaign and per-counsellor drill-downs.

03

The result

The CEO's primary strategic decision tool

It tracks 5,200+ leads, 3,300+ appointments and 395 conversions against a USD 10,000/month media budget, and it is where budget reallocation decisions now get made — driving cost-per-lead to USD 7.45 and cost-per-appointment to USD 11.58.

5,200+
Leads tracked end to end
$7.45
Cost per lead
$11.58
Cost per appointment
4 → 1
Platforms unified into one view

The executive view

The top of the application is deliberately one screen. If a decision-maker has to scroll to find out whether the month is on track, the tool has already failed.

Executive summary — headline metrics

What leadership sees first, with movement against the prior period

Total leads
1,232
11.4% vs last period
Avg CPL (paid)
$42
11.5% vs last period
Lead → booking
35.0%
0.4 pts vs last period
Show rate
71.9%
2.2 pts vs last period
Show → convert
31.3%
6.3 pts vs last period
Ad spend
$28.7k
$42 per paid lead
Revenue
$181.1k
6.3× ROAS

Demo figures shown for illustration; live values are commercially sensitive.

Lead volume by source

Daily leads over a 30-day window, stacked by acquisition channel

Meta Paid Organic / SEO Chatbot Referral
0 40 80 Meta Paid Organic / SEO Chatbot Referral D1D7D13D19D25 Referral Chatbot Organic / SEO Meta Paid leads / day
View as table
SourceTotal over periodShare
Meta Paid 709 49%
Organic / SEO 349 24%
Chatbot 213 15%
Referral 164 11%

Demo data reconstructing the shape of the live chart.

Stacking by source is the point. Total lead volume on its own hides the thing that matters — a flat total can be a paid surge covering an organic collapse, and those two situations call for opposite decisions.

Where leads actually go

Unifying the platforms is what made a true end-to-end funnel possible. Before this, Meta could tell you a lead was generated and GoHighLevel could tell you an appointment happened, but nothing connected the two.

Full funnel, ad click to conversion

Each stage as a share of the one before it

Leads 1,232
100% of total
Booked 431
35% of previous stage
Showed 310
71.9% of previous stage
Converted 97
31.3% of previous stage
View as table
StageCountStep rateOf total
Leads 1,232 100%
Booked 431 35% 35%
Showed 310 71.9% 25.2%
Converted 97 31.3% 7.9%

Demo proportions; the real platform reports live counts.

Laid out this way, the biggest single loss is obvious — the lead-to-booking step — and the second is the show rate, which became a project of its own.

Per-counsellor performance

The same data, cut by who handled the lead. This view replaced impressions with evidence in performance conversations, and it is used directly in 1-on-1s.

Conversion rate by counsellor

Of the consultations that were attended

Counsellor A
41.2%
41.2%
Counsellor B
39.5%
39.5%
Counsellor C
35.0%
35.0%
Counsellor D
26.7%
26.7%
Counsellor E
25.6%
25.6%
Counsellor F
17.4%
17.4%
View as table
CounsellorConversion
Counsellor A41.2%
Counsellor B39.5%
Counsellor C35.0%
Counsellor D26.7%
Counsellor E25.6%
Counsellor F17.4%

Demo names and figures.

The spread is the finding, not any individual row. A 24-point gap between the top and bottom performer on the same lead quality is a coaching opportunity worth more than most budget changes — and quantifying it is what turns "some people are better at this" into a specific, addressable number.

Forecasting and goal pacing

The last view answers the question that actually gets asked in a monthly review: are we going to hit target, and if not, what would it take? A 30-day lead forecast with confidence intervals, translated into the additional spend required to close the projected gap at current cost-per-lead.

Target160
Projected at current pace142
Gap−18
Additional leads needed+186
Additional spend at $42 CPL$7,812

Demo pacing figures.

That last row is the whole point of the platform. It turns a forecast into a decision with a price on it — which is the difference between a dashboard people look at and a dashboard people act on.

The seven views

Executive One screen: total leads, CPL, show rate, ROAS and goal pacing against monthly targets.
Meta Ads Spend, impressions, CTR and CPL split by ad account, down to campaign and ad-set level.
Funnel & Pipeline Lead → booked → showed → converted, with drop-off isolated at each stage.
Counsellors Per-agent slot fill, show rate and conversion — the performance matrix leadership uses in 1-on-1s.
SEO & Traffic Search Console keyword and ranking movement, feeding content prioritisation.
Forecast & Goals 30-day lead forecast with confidence bands, plus the spend needed to close the gap to target.
Upload Reports Controlled ingestion for sources without an API, kept inside the same governance rules.

What made it stick

The engineering was the straightforward half. The reason it gets opened every morning is the governance underneath it — a single agreed definition of what counts as a lead, when an appointment is real, and which timestamp wins when two platforms disagree. That work happened in the CRM architecture, and without it this would be four dashboards in a trench coat.


← All projects