CTV Measurement Framework
How layering CTV with Display reduced time-to-signup by 5-7 days for a single client - and justified $500K+ in additional CTV budget. The codebase was handed off to Causal IQ at my departure for continued use across the broader client book.
Does CTV actually accelerate conversion - or steal credit from Display?
A client was running Display-only campaigns and considering adding CTV. The question was simple to ask and hard to answer: how long does it take a typical user to convert when they are exposed to (a) Display only, (b) CTV only, or (c) CTV + Display layered together?
And the harder follow-up: does CTV actually accelerate conversion, or just steal credit from Display in last-click attribution? Off-the-shelf measurement tools could not answer that for a programmatic-direct law firm campaign. Last-click reporting credited Display by default because CTV is unclickable. The answer had to be built.
Cohort the users. Measure time-to-signup. Verify against conversion data.
A custom Python framework that bucketed users by first exposure type, measured time-to-signup for each cohort, and closed the loop against the client's first-party conversion data so every conversion could be traced back to an ad exposure.
Bucket users by first exposure type
Three cohorts: Display-only, CTV-only, and CTV + Display layered. Cohort assignment was based on the first ad served, not the last - which is where most attribution tools fail.
Measure time-to-signup for each cohort
From the first impression served to the conversion event. The signup itself was the dependent variable - not impressions, not clicks. What mattered was how many days passed before a real customer outcome.
Control for audience overlap, frequency, and recency
Same audience targeting across all three cohorts. Frequency-capped consistently. Recency windows aligned. Without these controls, the comparison would be apples-to-oranges and the finding would not be defensible.
Close the loop with first-party conversion data
Client-provided log-level conversion data was joined back to ad exposure logs. Every signup was verified against the client's actual conversion records - not an attribution pixel guess. This is the part most agencies skip.
Generate weekly cohort reports for the AM team
Outputs were formatted for the Account Manager to hand to the client without a data scientist in the loop. Built in Python with Pandas, custom attribution logic, and DSP API integrations.
Three cohorts. One question.
Bars below represent relative time-to-signup. Shorter is better. The layered cohort beat both single-channel cohorts by a meaningful margin.
The combination accelerated conversion meaningfully.
CTV-only had a longer time-to-signup than Display-only - a longer consideration cycle, as you would expect from a non-clickable awareness channel.
But CTV + Display together had 5-7 days shorter time-to-signup than either channel alone. The two channels were not just additive in reach - they were compounding in conversion velocity. CTV primed the audience, Display closed it, and the combination shortened the funnel by nearly a full week.
The number that moved a budget.
The anchor client expanded their CTV budget once the cohort report cleared the question of whether CTV was actually moving the needle. The framework was then generalized to apply across the broader Causal IQ client book.
Most agencies cannot answer this with quantitative rigor.
Cross-channel measurement is hard. The "does CTV accelerate conversion" question gets asked at every quarterly business review - and most teams answer it with a story instead of a number.
Off-the-shelf attribution does not solve this
Last-click reporting credits Display by default because CTV is unclickable. MMM is too slow and too aggregate to answer at the campaign level. Lift studies require a holdout most clients will not budget for.
This is what Innovid, IAS, DoubleVerify, and LiveRamp sell as products
Cross-channel attribution and incrementality measurement are paid SaaS categories. I built a focused version of one in Python for a single anchor client - and then made it portable across the rest of the book.
It persisted after I left
I handed the codebase to Causal IQ at my departure. The framework continues to be used on the broader client book. That is the kind of operator most teams need: builds the tool, runs the business with it, leaves it behind in working condition.
Built once. Reused across accounts.
The framework was originally scoped for a single legal client. The methodology generalized: any account with sufficient log-level data and a closed-loop conversion event could be run through the same cohort + time-to-conversion pipeline.
The methodology is portable. The codebase is not mine.
I no longer own the codebase - it was handed off to Causal IQ. The methodology, however, is fully portable. Anyone with log-level DSP exports and a closed-loop conversion event can apply the same cohort + time-to-signup analysis to their own book.
What it was built on.
A focused Python stack. No managed attribution vendor in the loop - just log-level data, Pandas, and a closed-loop verification path against the client's first-party conversion data.