The Attribution Gap: Can you prove money spent on marketing brought in clients?
Before you can ask what your marketing created, you have to know what it recorded. Four handoffs sit between a click and a client, and any one of them will fail without telling you. Here is what happened when we ran the diagnostic on ourselves and got an answer we did not like.
Leonard
Leonard is Director and Builder at Caydev.

There is a moment in quarterly reviews that most marketing leaders will recognise. The CFO is going through the quarter's marketing spend, ads, and operations together, looking for the line that connects it to the income the business generated. The marketing team has come prepared, with pages of traffic, engagement, likes and follows, and not one of those pages tells the CFO how much money we made. The CFO looks around the table and arrives at the hard fact that more spend cannot be signed off on this evidence, while the marketing team sits quietly, aware that the request for more ad funding is about to be cut.
The gap is well documented. In the ANA and NewtonX study published in June, 59 percent of marketers said they could measure marketing's financial impact, but only 45 percent of finance leaders agreed, and just 12 percent called that measurement resilient under pressure.[1] Research released this week by 10Fold and Sapio Research, covering 400 B2B marketing leaders, found only 38 percent connecting their impact signals to pipeline or revenue at all.[2]
Notice what the CFO was actually looking for: proof that the spend caused the income. Answering that properly takes specialist analysis, and that is a different piece. This one is about the step before it: whether the clicks, leads, and bookings that any analysis would rely on were recorded in the first place. If they were not, no amount of analysis can bring them back, and fixing the recording is the cheaper and more neglected half of the problem.
The zero that means two different things
When a campaign reports no conversions, there are two explanations, and they point in opposite directions.

The first is that the campaign failed: the targeting was off, the offer did not land, or the creative asked too much of a cold audience. The response is to change the campaign.
The second is that it was never recorded. Someone converted, and the system that should have noticed either did not, or noticed without keeping the label saying where they came from. The response there is to change the plumbing, and every hour spent rewriting creative instead is an hour on a problem you do not have.
Most real cases turn out to be some of each, which is the point rather than a complication. If you cannot separate the two, you cannot size either, and you will spend your budget on whichever explanation your team already believed.
This is also why layering another attribution model on top so rarely helps. An attribution model is simply the rule that decides which marketing touchpoint gets the credit for a sale: the first one, the last one, or some split across several. It divides credit among touchpoints that were recorded, so if the touchpoint never entered the system, no model will bring it back. Research from the CMO Alliance puts roughly two-thirds of marketers on the CRM as their attribution backbone, with first-touch and last-touch still dominant.[3] Both work when the record is complete and fail quietly when it is not, because a lead arriving with no source attached never throws an error. It becomes "direct," and "direct" is where unattributed revenue goes to disappear.
Four handoffs between a click and a client
It helps to stop thinking of attribution as a system and start thinking of it as a chain. Between someone seeing your ad and appearing in your pipeline as a booked opportunity, there are four points where the label identifying their origin has to survive a handoff.

The tag. Every link you publish, paid or organic, carries a consistent, machine-readable label, which in practice means UTM parameters on the URL. When the same campaign is named one thing in LinkedIn Ads, another in Google Ads, and a third in the CRM, nothing downstream can reconcile them. Treat the naming convention as the primary key of your measurement system, because that is functionally what it does.
The landing. The label has to survive arrival and get stored somewhere durable. A visitor who lands on a campaign URL on your website, reads three pages, and converts on the fourth, whether that is a form submission, a booked call, or a purchase, has usually lost the parameters, because they only ever existed in the address bar of the first page.
The record. The label has to reach the CRM and attach to a human being rather than a browser session. Modern CRMs are robust and customisable enough to hold this, and adding fields for source, medium, and campaign is configuration work rather than a development project. The handoff still fails silently more often than any other, because the integration reports success while a subset of records arrives stripped of everything useful.
The outcome. The CRM has to change state when something commercially meaningful happens, and that state has to be a specific value everyone reads the same way: a literal status that marketing and finance have both signed off on, rather than a soft label like "engaged" or "influenced."

Break any one and the other three still produce numbers that look complete. Nothing errors, no alert fires, and the dashboard populates on schedule, so you read a healthy-looking surface stretched over missing data. The only way to catch it is to check the destination directly rather than trusting the connection is live.
What happened when we ran it on ourselves
Earlier this year we ran four paid ad campaigns pointed at our website. They produced over 150,000 impressions, 1,540 link clicks, and around 1,100 landing page views. Recorded conversions: zero. A separate set of ads sent traffic straight to our calendar link and generated around a hundred clicks with no recorded leads at all, because a calendar booking created no CRM record. Only the contact form path had ever been instrumented.
At that scale, with 1,540 clicks, we could review every click by hand. Scale that up to enterprise level and the same failure is a rounding error no one investigates, let alone tries to fix, which is why it survives there for years.
Three of the four handoffs were broken at once. Campaign URLs carried their parameters, but nothing stored them, so an ad-originated booking landed in our CRM as generic inbound interest. The calendar tool did not put its tracking data on its outbound webhook at all. And the status representing our north-star metric existed nowhere in our codebase, because we had defined the metric in a planning document and never built the thing that would produce it.
So how did we fix it? We rebuilt the chain. Tags are now enforced across Google, Meta, and LinkedIn, and across organic and offline traffic, including print QR codes, so a rack card and a LinkedIn ad arrive labelled in the same vocabulary. The site holds first-touch parameters for the whole session; both the form and the calendar booking write them onto the CRM lead, and the lead status moves on a booking and back on a cancellation, so the denominator cannot quietly inflate.
What the chain told us was narrower than we expected. It confirmed no genuine leads had arrived and been lost, which eliminated the explanation we would otherwise have spent a month chasing, and it exposed that the calendar path had never created a record at all. The ad platform's own reporting, meanwhile, showed the campaign itself had been poorly set up: optimised for cheap clicks with automatic placements, it had bought exactly that. So we had a badly configured campaign and broken recording at the same time, and until the recording was trustworthy we had no way to tell how much of the zero belonged to each.
What we built, and what built it
Worth noting: there is no artificial intelligence anywhere in the system I have just described. Nothing infers, nothing predicts, nothing scores a lead. The chain is deterministic plumbing: a parameter captured, stored, carried through a webhook, verified against a signature, written to a field. It returns the same answer every time, which is the entire point, because a number you carry into a board meeting cannot come from something that may have hallucinated it.
The AI was in the construction.
All of it is unglamorous engineering: signature verification, safeguards so a retry does not create a duplicate lead, input hardening, reconciliation for reschedules and cancellations, and a test suite proving it still works next month. That work is usually why the chain never gets built, because marketing owns the problem without owning the engineering capacity. We built ours with a coding agent team over a matter of weeks, adversarially reviewed by other models. The techniques were never secret, and any competent engineer could have written them in 2019. What changed is the cost of producing a bespoke version, and the speed at which an internal, non-critical tool can be rolled out.
Where the build-and-buy line falls, and what it costs
We kept the CRM, the ad platforms, the calendar tool, and the analytics platform. Each of those is a system of record, the place where a particular fact officially lives, and each stayed where it was, because they are mature products solving well-understood problems. What we built was the thin connective layer that makes them agree with one another.
Plenty of vendors sell versions of that layer. LeanData, Dreamdata, HockeyStack, CaliberMind, and the warehouse-plus-reverse-ETL pattern all address it,[4] and for many teams buying one is the right answer. What none of them can sell you is your own definitions: what counts as a booked call, when a status reverses, which handoffs your process actually has.
Construction cost is not total cost. A platform absorbs maintenance, so when a vendor changes a webhook or deprecates an endpoint, it is someone else's problem. Build it yourself, and it is yours permanently, with monitoring, someone on call, a security review, and eventually a successor inheriting code they did not write. The case for building holds where the layer is genuinely thin, the definitions are genuinely yours, and somebody owns it after launch. Where those fail, buy.
The distinction that matters is which tier the thing belongs to. Customer-facing and revenue-critical systems deserve the full discipline of proper software development, with the timelines and cost that come with it. Internal, non-critical tooling like this connective layer is exactly where agentic coding earns its place: the damage if it breaks is contained, and the cost of getting it wrong and rebuilding is days rather than quarters.
We run first-touch attribution, which credits the first recorded source a lead came from. Purists would call that primitive, and on the substance they are right. A complete first-touch field is bookkeeping: it tells you where a lead came from, but it cannot tell you whether that lead would have arrived anyway without the spend. That second question is the one the CFO was really asking, and it belongs to the specialist analysis mentioned at the start.
Four checks you can run this week
You can find out which handoff is broken in your own stack without a platform decision and without waiting on a vendor.
Check the tag. Trace one active campaign's name through every system it touches: ad platform, analytics, CRM. If it appears under three different names, fix the taxonomy before anything else, because nothing downstream can be trusted until it resolves.
Check the landing. Open one of your own campaign links, navigate two pages deep, then convert. If the resulting record shows a blank source or "direct," your parameters are dying on arrival, and every conversion past the landing page is credited to nobody.
Check the record. Pull last month's inbound leads and count how many carry a campaign. Whatever percentage is missing is the share of your marketing budget you currently cannot defend, and it is usually the number that makes the room go quiet.
Check the outcome. Ask which specific CRM field value represents a commercially meaningful conversion, then ask whether it reverses when the meeting cancels. If nobody can name the field, or it only ever moves one way, your pipeline number is inflating on its own schedule.

And one thing the chain will not do. Closing the CRM chain gives the ad platform nothing to learn from, because those are two different pipes: your bookkeeping about humans, and the conversion feedback the platform's algorithm optimises against, which needs a pixel or a server-side conversions API. We had neither, so the platform kept buying the cheapest clicks it could find, because nothing had told it what a good outcome looked like. Fix the recording first, then feed the platform.
The question underneath all of it
Our campaigns failed and our recording was broken at the same time, and for a while we could not have told you which mattered more. That is an uncomfortable thing to admit and a common thing to live.
So the question worth asking before disregarding a low-performing campaign is simple: when your next campaign reports zero, can you tell whether nothing happened or nothing was recorded?
Most stacks cannot answer that, which makes the budget request to the CFO even more difficult. I spent years trying to piece together how a marketing function could get to that answer, and was always faced with unrealistic timelines, software costs, and limited buy-in for the resources it needed. Now, with the right approach and accessible internal tooling, we can finally pull together a system that gives us the data we need, and the next time the CFO goes looking for the line from spend to income, there is one to point to.
Sources
[1] Association of National Advertisers and NewtonX, The Confident B2B Marketer 2026, June 2026. Survey of 202 senior B2B marketing leaders and 150 finance and revenue leaders. https://www.ana.net/miccontent/show/id/rr-2026-06-confident-b2b-marketer and https://www.newtonx.com/article/confident-b2b-marketer-2026/
[2] 10Fold and Sapio Research, The Communications ROI Reset: What B2B Leaders Measure, Trust and Act On, released 18 August 2026. Survey of 400 B2B technology marketing and communications leaders. https://10fold.com/10fold-research-finds-b2b-marketing-leaders-measure-more-than-ever-but-still-struggle-to-prove-business-impact/ (press release also on Business Wire: https://www.businesswire.com/news/home/20260818813120/en/)
[3] CMO Alliance, Future of Marketing 2025 Report (CRM used for attribution by 66.7 percent of marketers; first-touch 36.1 percent; last-touch 31.2 percent). https://www.cmoalliance.com/future-of-marketing-2025-report/ Summary of the attribution findings: https://www.cmoalliance.com/how-cmos-can-justify-their-financial-investments/
[4] Vendors named for reference only; Caydev has no commercial relationship with any of them. LeanData (https://www.leandata.com), Dreamdata (https://dreamdata.io), HockeyStack (https://www.hockeystack.com), CaliberMind (https://www.calibermind.com).
Leonard Lewis is Co-Founder of Caydev, which builds AI systems and automation for businesses in the Cayman Islands and beyond.



