Customer Lifetime Value & Marketing Campaign Analytics
A campaign programme running at a net loss per cycle, and the segmentation work that shows exactly which customers it should have been aimed at instead.
This project can be shown in full. It uses a public dataset with no sensitive content, so every figure, method and result on this page is the real thing — the visuals are screenshots of the working output, not rebuilds.
Context
This dataset pairs something most transaction files lack — customer demographics and household composition — with two years of category-level spending and, crucially, the response to five marketing campaigns.
That combination makes a specific question answerable: not just who the valuable customers are, but whether the marketing spend is reaching them. It was not.
Approach
- Profile before segmenting. Age, education, income and family structure derived from the raw fields, so the segments could later be described in terms a marketing team would recognise.
- CLV and RFM side by side. RFM captures behaviour; CLV puts a number on it. Running both means a customer can be ranked by what they do and what they are worth.
- Campaign economics, not campaign counts. Response rate on its own is vanity. Multiplying it against the $3 per-contact cost turns the programme into a profit-and-loss statement, which is what changes the decision.
- Channel and campaign attribution, to identify which route to market and which campaign design actually earned their cost.
Findings
Charts below are rebuilt natively from the analysis output so they match this site’s palette. Every figure is a real measured result.
RFM health of the customer base
Share of customers in each behavioural tier
Revenue by purchase channel
Where the money actually comes from
Average spend by product category
Two years of category-level spending per customer
Outcome
−$3,046 per campaign cycle
The programme was losing money. A 14.91% response rate against a $3 per-contact cost produced a net loss of $3,046 per cycle — a broadcast campaign paid for by the people who ignored it.
The base itself is healthy: 47.2% Loyal plus 25.7% Best customers is a strong core, with 15.9% At Risk or Lost. So the problem was never the customers, it was the targeting. Store (46.2%) and Web (32.6%) carry nearly four-fifths of revenue, and Campaign 4 outperformed the rest by a wide enough margin that its design is worth copying rather than averaging away.
The recommendation is narrow and costed: aim campaigns at Best and Loyal customers through Store and Web, prioritised by CLV and RFM score, and stop paying $3 a head to reach Silent Leads.
What I’d do differently
The $3 contact cost is treated as flat across channels, which is almost certainly wrong — email and catalogue do not cost the same to send. A per-channel cost would change which campaigns look profitable, possibly substantially.
More fundamentally, response is measured but incrementality is not. Some of the customers who responded would have bought anyway, so the true campaign effect is smaller than the raw response rate suggests. Only a holdout group can separate the two, and this dataset has none.