What was there when I arrived
“We’re positively paleolithic.”
Someone on the client’s marketing team, describing their attribution at kickoff, 2025
The company was spending over a million dollars a year on paid media across Google, Bing and Meta, and couldn’t say which campaigns drove revenue.
Every week the analytics team spent 15+ hours matching Salesforce sales exports to ad-platform spend in Excel. Results arrived three weeks after the campaigns ran, by which point the budget was already spent.
The bigger problem was upstream. Ad platforms send 34 tracking parameters to a landing page. Seven survived into the CRM. The other 27, the campaign IDs, ad groups and keywords, were lost in the handoff between the landing-page platform and the CRM, so by the time a lead became a sale, attribution was a guess.
The agency’s performance reports ran on the agency’s own tracking, and the company had no independent way to check them. That’s not attribution. That’s trust.
Why they didn’t just buy something
They looked at four options and turned each one down for a specific reason. The costs are my estimates at the time.
- Build it inside Salesforce. Custom objects, triggers and a Marketing Cloud integration, across three departments and years of merged legacy systems, with an IT team that had no room for another project. Six months or more and north of $200K. Worse, the data was already lost before it reached Salesforce. If that had been the direction, I’d have told them to find someone else.
- An enterprise attribution platform. $70K+ a year in licensing, more than the whole custom build, every year, with the data on the vendor’s servers.
- The agency’s own platform. The company’s attribution data would have lived on its vendor’s instance, so the only way to check the agency would have been the agency’s numbers.
- A cloud data warehouse. About $2,000 a month for a job that needed about $50.
What they needed fit in one sentence: attribution measurement without involving IT, who was overworked and overextended, on data the company owns, in a standard format it could take anywhere.
What I built
The system captures marketing touchpoints at the source, before any data is lost, and connects them to closed sales. Spend comes in daily from Google, Bing and Meta. Form submissions are matched to the sales they became. Leadership gets return on ad spend by campaign, brand, country and period, updated daily instead of three weeks later.
GDPR is built in: row-level security, audit trails and PII handling designed for EU requirements.
The design decision that mattered most came out of validation (see below): spend is a fact, attribution is an interpretation, and they live in separate views. The thinking behind keeping that history instead of overwriting it is in Why Marketing Data Should Work Like Banking Records, Not Polaroids. What the same event data turned up during discovery is in Event-Sourcing for Attribution: What Discovery Actually Revealed.
The numbers
| Before | After | |
|---|---|---|
| Time to campaign performance data | 3 weeks | Next day |
| Weekly manual reconciliation | 15+ hours | Eliminated |
| Tracking parameters captured | 7 of 34 | 34 of 34 |
| Marketing touchpoints in the system | None (spreadsheets) | 50,800+ captured, 44,400+ backfilled (Feb 2026) |
| Return on ad spend visibility | None across platforms | By campaign, brand, country, period |
| Data ownership | Agency-dependent | Company-owned, portable |
| Annual infrastructure cost | n/a | Under $1,000 |
What the build caught
A return on ad spend that looked too good. The first figure was 3.77x. Validation took it to 1.90x, then 1.66x, then the correct view by segment, before any of it reached an executive. The cause was structural: spend and attribution sat in one database view, so filtering by attribution model quietly filtered out spend. The fix became the system’s core rule: spend is a fact, attribution is an interpretation, and they live apart.
A $1.28M currency discrepancy. The sales files mixed local currency and US dollars under ambiguous labels, and the system was reading foreign amounts as dollars. Validation caught it before it corrupted every metric downstream, which a tool that ingests data without questioning it wouldn’t have done.
A quarter-million dollars of understated spend. Ad platforms split spend by device and network, and the first load summed subsets instead of all rows, which made every early return-on-ad-spend figure look better than it was. The analytics team spotted it during a training session because the numbers looked low. Watching the fix happen built more trust than a clean launch would have.
Product lines nobody could tell apart. Some were returning more than 2x on ad spend; others were barely breaking even. That changes where a media budget goes, and it was invisible in agency reports.
The handoff
The analytics team was trained and running it on their own within eight weeks. Daily monitoring takes about five minutes and weekly maintenance 15 to 20. They call me only if the core processing breaks.
What it cost, said out loud
Six weeks is the first executive report, not the whole job. The full engagement ran about four months, through training and handoff.
The match rate looked broken for weeks. It showed 10%; the real figure was 42%. Over a thousand sales were matched but still labeled unmatched because of a sequencing bug. When a metric looks wrong, check the measurement before you question the method.
A custom build needs an owner on your side. Here that’s the analytics team, and they own it.
