From Conversion Pixels to Incrementality: What Did the Ad Actually Cause?
A practical guide to attribution rules, conversion deduplication, randomized holdouts, and the gap between credited revenue and causal lift.
- The invisible auction
- From campaign budget to publisher payment
- Who decides which ad gets served?
- The millisecond handshake
- Anatomy of an OpenRTB auction
- Campaign lifecycle inside a DSP
- Trusting the programmatic supply chain
- ML in the millisecond
- A real-time ad platform under a millisecond budget
- The data exhaust of a page load
- The post-cookie frontier
- Practical privacy on the web
- Learning the win curve
- From win curve to bidding
- Floor-price optimization
- What did the ad actually cause? You are here
Builds on ideas from the experimentation path: potential outcomes and causal inference and statistical power and sample size.
Priya sees an Urban Hiker boot ad while reading Wanderlust Weekly. Two days later she searches for the brand and clicks the ad above the search results. Two days after that, she follows a discount link on a coupon site and buys a pair for ₹2,500.
Three marketing systems each observed a part of that journey: the display platform that showed the banner, the search platform that sold the click, and the affiliate network behind the coupon link. Each logs the touch it delivered, sees that a purchase followed, and reports the sale as its own success. Three dashboards, three claimed conversions. The commerce database, meanwhile, records exactly one order.
Which system is right?
That question sounds precise, but it hides two different questions:
- Which marketing touch should receive credit for the order? This is attribution.
- Would the order have happened if the campaign had not run? This is incrementality.
The first question is about matching and accounting. The second is about causality. Both matter, but attribution cannot answer the incrementality question, no matter how clever the rule.
This distinction is easy to say and surprisingly expensive to ignore. A campaign can report a strong attributed return while producing little incremental revenue. The reverse also happens: a channel can create demand that another channel’s report collects, making it look weaker than it is. Before optimizing bids, budgets, or creative against a conversion metric, we need to know which question that metric actually answers.
The article follows that split. Sections 1 and 2 take the accounting question apart: what counts as an outcome, and how credit rules distribute it. Sections 3 through 5 build the causal answer: a worked experiment, the theory of what it estimates, and how to design one well. Section 6 adds the constraint layer both questions now live under, privacy. Sections 7 and 8 put the pieces back together as an operating discipline. One running example carries through all of it: Priya’s ₹2,500 order and the Urban Hiker campaign behind it.
1. One Purchase Is Assembled from Several Events
The millisecond handshake ended with a tracking pixel recording a later outcome. In production, that one sentence expands into an event graph owned by different systems:
| Event | Typical evidence | What it establishes |
|---|---|---|
| Ad opportunity | Auction or ad-server log | An ad could have been selected |
| Impression | Render or measurement beacon | A creative was rendered under a counting rule |
| Viewable impression | Viewability measurement | Enough of the creative was on screen for long enough |
| Click | Redirect or click log | A browser followed the ad link |
| Conversion | Browser pixel or server event | A business outcome was reported |
| Match | Cookie, click ID, login, or clean-room join | Two records probably belong to the same browser, account, or household |
| Attribution | Window and credit rule | A prior touch is eligible to receive credit |
Each row introduces another condition. A bid response is not a rendered impression. A render is not necessarily viewable. A click ID attached to a purchase is evidence of a path, not evidence that the click changed the purchase decision. The counting rules themselves are standardized territory: the Media Rating Council’s Outcomes and Data Quality Standards exist precisely because “an outcome happened” needs an audited definition before anyone argues about credit.
The conversion event itself also needs care. A browser pixel is easy to deploy, but it can be blocked, fired twice, or lost when the page closes. A server-to-server event is harder to block and can carry a stable order identifier, but it may include refunds, test orders, or events submitted by retrying jobs. Neither transport is automatically the source of truth.
A useful measurement record therefore has more structure than event=Purchase:
1
2
3
4
5
6
7
8
9
event_id transport-level idempotency key for this event record
order_id business-level key reconciling copies of the same order
event_time when the outcome happened
received_time when the measurement system received it
value amount, net or gross by declared definition
currency the currency the amount is denominated in
source browser, app, server, offline import
consent_state permissions applicable at collection time
match_key click ID, account token, or another approved join key
The definitions are part of the data. If one platform reports gross basket value at checkout while another reports net revenue after cancellation, their conversion counts can agree while their revenue does not.
That is the first question’s raw material: a trustworthy count of what actually happened. The next question is who gets credit for it.
2. Attribution Is a Credit-Allocation Rule
Suppose Priya’s purchase follows this sequence:
Figure 1. Same journey. Different accounting credit. Each row is an alternative credit rule for one purchase, not another sale. The unchanged journey contains no untreated comparison.
An attribution system first chooses the eligible touches. A 7-day click window includes both clicks. A 1-day view-through window excludes the display impression. A 30-day view-through window includes it. The system then distributes credit across the eligible set. For the table below, assume a 7-day click window and a 30-day view-through window, so all three touches are eligible; under a shorter view window, “first touch” would instead mean paid search.
| Rule | Credit assigned in this journey | Assumption embedded in the rule |
|---|---|---|
| Last click | 100% to affiliate | The final eligible click deserves all credit |
| First touch | 100% to display | The first observed introduction deserves all credit |
| Linear | Equal shares across eligible touches | Every touch contributes equally |
| Time decay | More credit to recent touches | Proximity is a useful proxy for influence |
| Position based | More to first and last touches | Introduction and closure matter most |
| Observational model based | Shares estimated from observed paths | Historical path patterns transfer to current traffic |
These rules can be useful. Affiliate settlement and CPA partner payouts need one deterministic rule to compute what is owed. A media team may need rapid feedback by campaign, placement, and creative. A bidding model may need a dense outcome label rather than waiting months for a market-level study.
But attribution has no untreated version of Priya. It observes that a purchase followed some touches, then applies a policy for assigning credit. Changing the window or rule, changes the allocation even though the customer journey is identical.
The arithmetic also stops being a neutral fact once several platforms operate separate ledgers. If display, search, and affiliate systems each use their own window and identity graph, the same ₹2,500 order can be reported three times. Within one platform, fractional multi-touch credit might sum to one. Across platforms, no such conservation law exists.
Deduplication comes before interpretation
Attribution is already hard when every purchase appears once. Duplicate events make it worse.
The two keys in the measurement record solve different problems. event_id provides transport-level idempotency: a retrying job that resends the same event updates or is ignored rather than creating another sale. order_id (or a canonical conversion key) provides business-level reconciliation: browser and server copies of the same purchase carry different event IDs, and it is the order key that collapses them into one canonical outcome. Refunds and cancellations should arrive as explicit adjustment events referencing the original order. Currency conversion and tax treatment should be defined before ROAS is computed.
Figure 2. Two kinds of duplication need two keys. Transport idempotency and business reconciliation use different keys. Neither operation decides attribution credit or estimates incrementality.
Cross-channel deduplication is a separate problem. Two platforms can both hold technically valid evidence linking an order to an earlier touch. Deduplicating the order does not decide which platform deserves credit, and choosing a winner does not establish which platform caused the order. These are three distinct operations:
- Event reconciliation: How many real business outcomes occurred?
- Attribution: Which eligible touches receive accounting credit?
- Incrementality: How many outcomes changed because advertising was available?
Keeping those ledgers separate prevents a reporting convention from quietly becoming a causal claim. These three operations are also the article’s spine: section 1 was about the first, this section about the second, and the rest of the article is about the third - and about running all three side by side.
3. A 4.0x Dashboard Can Describe a 0.75x Experiment
Return to the display campaign that showed Priya her banner, and give it the experiment it deserves. We randomly assign 200,000 eligible people, Priya among them, into two equally sized arms:
| Arm | People assigned | Buyers | Buyer rate |
|---|---|---|---|
| Control, campaign withheld | 100,000 | 4,000 | 4.0% |
| Treatment, campaign available | 100,000 | 4,600 | 4.6% |
Let us assume the rest of the campaign’s numbers for this worked example. The campaign spends ₹2.0 million, the average order value is ₹2,500, and in the treatment arm, auctions and page behavior allow 60,000 rendered impressions. Assume further that our attribution system matches 3,200 purchases to an eligible impression or click. All 3,200 are purchases by the treatment arm’s 4,600 buyers: the control arm never saw the focal campaign, so it has no touches to match against.
Two simplifications keep the arithmetic transparent: each person places at most one counted order in the outcome window, so buyers and orders coincide, and each order contributes a fixed ₹2,500 of net revenue. The intervals below therefore reflect conversion-rate uncertainty only; we return to what a production experiment does instead at the end of this section.
The attribution dashboard computes:
\[\text{Attributed revenue} = 3{,}200 \times \text{₹}2{,}500 = \text{₹}8.0\text{ million}\]and therefore:
\[\text{Attributed ROAS} = \frac{\text{₹}8.0\text{ million}}{\text{₹}2.0\text{ million}} = 4.0\]That calculation is internally coherent. It says the system found ₹4 of credited revenue for every ₹1 spent. It does not say all ₹8 million disappeared when the campaign was withheld.
The randomized comparison estimates 600 incremental buyers:
\[\text{Incremental buyers} = 4{,}600 - 4{,}000 = 600\]So the incremental revenue estimate is ₹1.5 million and incremental ROAS is:
\[\text{iROAS} = \frac{600 \times \text{₹}2{,}500}{\text{₹}2.0\text{ million}} = 0.75\]
Figure 3. 4.0× attributed ROAS. 0.75× incremental ROAS. Attributed credit and experimental lift answer different questions: attribution allocates credit to observed touches, while randomization estimates what changed when the campaign was available. The fixed-order-value example carries conversion-rate uncertainty into iROAS.
The gap is not a contradiction. Of the 3,200 attributed purchases, many would have happened without this campaign. The holdout supplies the missing baseline.
This is also revenue ROAS, not profit. If the contribution margin is 40%, the incremental contribution associated with the point estimate is only ₹600,000 before media costs. A positive sales lift can still be uneconomic.
The estimate needs uncertainty
The observed lift can be stated two ways:
\[\text{Absolute lift} = 4.6\% - 4.0\% = 0.6 \text{ percentage points}, \qquad \text{Relative lift} = \frac{4.6\% - 4.0\%}{4.0\%} = 15\%\]Reporting both forms prevents the common confusion between percentage points and percent. With independent randomized arms, an approximate standard error for the difference in buyer rates is:
\[SE = \sqrt{\frac{0.046(1-0.046)}{100{,}000} + \frac{0.040(1-0.040)}{100{,}000}} \approx 0.00091\]Note this is the unpooled standard error, each arm keeping its own variance, which is the right form for a confidence interval; the pooled form, which assumes equal rates under the null, belongs to the hypothesis test. Our z and t statistics post works through both and when each applies. The 95% interval is then the observed lift plus or minus 1.96 standard errors:
\[0.0060 \pm 1.96 \times 0.00091 \approx 0.0060 \pm 0.0018\]giving an approximate 95% confidence interval of 0.42 to 0.78 percentage points for the rate lift. At this experiment size, that corresponds to roughly 422 to 778 incremental buyers per 100,000 treated people.
Now convert the interval to money. At ₹2,500 per order against ₹2.0 million of spend, the two ends of the interval give:
\[\frac{422 \times \text{₹}2{,}500}{\text{₹}2.0\text{ million}} \approx 0.53, \qquad \frac{778 \times \text{₹}2{,}500}{\text{₹}2.0\text{ million}} \approx 0.97\]so the iROAS interval is roughly 0.53 to 0.97. Break-even on revenue alone means an iROAS of 1: a rupee of sales for every rupee of spend. Even the optimistic end, 0.97, falls short. Profit sets a higher bar: at a 40% contribution margin, ₹1 of revenue keeps only ₹0.40, so covering ₹1 of spend needs an iROAS of at least $1/0.4 = 2.5$. Under this short-run revenue definition, the entire interval sits below both bars. Longer-horizon customer value or spillover effects could change the business estimand, but they would need their own outcome definition and their own measurement.
The point estimate of 600 is useful, but a budget decision should see the interval too. A production experiment would also drop the fixed-order-value simplification and make net revenue per assigned person the outcome:
\[\text{iROAS} = \frac{N_T\,(\bar{R}_T - \bar{R}_C)}{\text{Spend}_T - \text{Spend}_C}\]Here $N_T$ counts the people assigned to treatment. $\bar{R}_T$ and $\bar{R}_C$ are the mean net revenue per assigned person in each arm, zeros included for nonbuyers. The denominator is the incremental media spend: with a withheld-campaign control this is just the treatment spend; with a public-service-ad control it is the spend difference. The confidence interval then comes from that revenue outcome directly. Order-value variance stacks on top of conversion-rate variance, which is precisely why Lewis and Rao found that even very large advertising experiments can leave wide ROI intervals. Precision is an economic constraint, not a cosmetic statistical add-on (the sample-size post covers the power arithmetic that decides it).
The experiment produced a number the dashboard could not. The next section pins down what that number estimates, and why no credit rule can reach it.
4. The Missing Object Is a Counterfactual
The dashboard credited Priya’s order to a touch. The experiment instead asked what she would have done without the campaign. To state that precisely, let $Y_i(1)$ be person $i$’s purchase indicator when the focal campaign is available and $Y_i(0)$ the indicator when it is withheld. The individual causal effect is:
\[Y_i(1) - Y_i(0)\]In plain English: did the campaign change this person’s decision? For a purchase indicator the difference can take only three values. It is $1$ when Priya buys with the campaign but not without it - the campaign created the order. It is $0$ when the campaign changes nothing: she buys either way, or she buys neither way. And it is $-1$ when the campaign prevented a purchase that would otherwise have happened - rare, but possible with an annoying enough creative.
Only one outcome can be observed for the same person in the same period. This is the fundamental problem of causal inference, the same one our causal-inference post wrestles with in observational settings. Random assignment does not reveal both outcomes for Priya, but it makes the treatment and control groups comparable in expectation. Their average difference estimates:
\[ATE = E[Y(1) - Y(0)]\]Attribution usually conditions on exposure, clicks, or matchable identity. Those are selected post-assignment. People who receive an impression may visit more ad-supported pages, fit targeting criteria, win cheaper auctions, or already have stronger purchase intent. People who click are an even narrower, more self-selected group. Comparing clickers or exposed users with nonclickers or unexposed users answers almost nothing causal without much stronger assumptions.
This is why observational attribution models can remain biased even with thousands of features. In a comparison against 15 large Facebook field experiments, Gordon, Zettelmeyer, Bhargava, and Chapsky found that common observational approaches often failed to recover the experimental result. More covariates help describe selection; they do not guarantee that unobserved selection has vanished.
If observation cannot recover the counterfactual, design has to create it. That is what a holdout is for.
5. What a Useful Advertising Holdout Looks Like
The cleanest design randomizes eligible units before the ad decision:
Figure 4. Randomize before the ad decision. Random assignment precedes exposure, and the outcome comparison retains both complete arms, including treatment members who never received an ad.
Write $Z_i$ for the randomized assignment, $D_i$ for actual rendered exposure, and $Y_i$ for the outcome. The primary result should usually be intention to treat: compare outcomes by $Z_i$ alone - the difference between everyone assigned to treatment and everyone assigned to control. That estimates the effect of making the campaign available, which is the policy a budget decision actually toggles. In the example, only 60% of the treatment arm received a rendered impression ($D_i = 1$). That does not justify dropping the other 40%: they were part of the policy being tested, including its auction losses, pacing, eligibility filters, and missed renders - and conditioning on $D_i$, which is realized after assignment, breaks the randomization. Estimating the effect of exposure itself requires an instrumental-variable or complier-effect argument with additional assumptions. Note also what the control arm means: the focal campaign is withheld, not advertising in general - control users still encounter search, affiliate, organic, and other campaigns.
Figure 5. Assignment preserves the comparison. The exposed treatment subset is selected after assignment, through auctions, pacing, filters, and rendering. Intention to treat compares the full randomized arms.
A simple holdout still needs design choices:
- Randomization unit: browser, account, household, geography, or time block. The unit should limit contamination across arms, persist across devices where possible, and set the inference method - household, geo, and time-block designs need cluster-appropriate standard errors.
- Eligibility: define the population before assignment. Restricting analysis to people selected after treatment can reintroduce bias.
- Control experience: business as usual with the focal campaign withheld, or a neutral public-service ad in its place. Each measures a slightly different policy contrast.
- Pre-registration: fix the primary outcome, analysis window, and estimand before anyone sees results.
- Outcome window: allow enough time for delayed conversions, while avoiding unrelated outcomes accumulating forever.
- Sample size: power the study for plausible lift, not for the much larger baseline conversion rate; baseline rate, minimum detectable lift, outcome variance, and clustering jointly set the requirement.
- Health checks: verify arm balance (an A/A test where practical) and monitor sample-ratio mismatch and cross-arm leakage while the experiment runs.
- Interference: one person’s exposure can affect another person’s outcome. Household purchases and marketplace effects can violate the assumption that units do not influence one another.
- Attrition and matching: outcome visibility must not differ across arms because one arm is easier to identify.
Ghost-ad designs are especially helpful in auction environments. A ghost ad is a measurement device, not a control experience: the control user sees nothing different. Rather than buying a public-service ad for every control opportunity, the platform records when the focal ad would have won and thereby identifies comparable exposure opportunities in the control arm without showing anything. Johnson, Lewis, and Nubbemeyer show how this can improve the economics and precision of online ad-effectiveness measurement. It still requires trustworthy randomization and platform instrumentation.
When individual randomization is impossible, geo experiments and time-based switchbacks can estimate broader effects. They trade more modeling assumptions and fewer independent units for reduced cross-arm contamination, and switchbacks additionally have to account for carryover and seasonality. Marketing mix models work at an even more aggregated level and can help allocate budgets across long periods and channels, but they do not replace clean experiment design when randomization is feasible.
Every one of these designs still has to observe outcomes and join them to arms. That observation layer is exactly what privacy engineering is rewriting.
6. Privacy Changes the Matching Layer, Not the Causal Question
Look back at the match row in section 1’s event table: nearly every join in this article has leaned on it. Traditional cross-site attribution relied on a browser identifier appearing near both the ad interaction and the conversion. Browser restrictions, consent requirements, and identifier loss make that join less available; the post-cookie frontier covered why that identity layer eroded. Measurement systems are responding in several ways:
- first-party click IDs and server-side conversion events;
- consented account or customer-data joins;
- aggregate reporting with delayed or noisy outputs;
- data clean rooms that constrain how parties match and query records;
- on-device or browser-mediated attribution APIs.
Chrome’s Attribution Reporting API offers two output types with different privacy constraints: coarse, delayed event-level reports and noised aggregate summary reports. The W3C’s Attribution Level 1 draft, from the Private Advertising Technology Working Group, is a work-in-progress Working Draft rather than a shipped browser standard; its current form centers on aggregated, differentially private measurement. WebKit’s Web AdAttributionKit (formerly Private Click Measurement) is a different browser design built around limited data and delayed reports. The important operational point is that browser support and semantics are not one universal standard.
Clean-room matching has a different role. The IAB Tech Lab’s ADMaP protocol (Attribution Data Matching Protocol, finalized in February 2025) specifies how two parties match records and measure attribution inside a data clean room using privacy-enhancing technologies, without exposing raw identifiers to every participant. The clean-room label alone guarantees little, though: actual protection depends on consent, input controls, query policy, output checks, and the underlying privacy technology.
None of these mechanisms manufactures a counterfactual. A privacy-preserving report can still be last-click attribution. A deterministic clean-room join can still connect an ad to a purchase that would have happened anyway. Privacy technology can make data use safer; causality still comes from design, usually random assignment or a defensible quasi-experiment.
Aggregate and noisy reports also change optimization. A platform cannot always use a delayed, noised event as if it were a precise per-user billing record or an immediate training label. Measurement architecture now has to state which outputs support campaign feedback, which support finance, and which support causal evaluation.
7. Keep Three Ledgers, and Label Every Number
Section 2 ended with three operations, and the sections since have shown why each needs different machinery. A mature measurement system institutionalizes them as three ledgers, and resists collapsing all its questions into one “conversion” column.
The event ledger counts business outcomes. It owns order reconciliation, refunds, currency, tax, and duplicate handling. Its job is to answer: what happened?
The attribution ledger connects eligible marketing touches to those outcomes under a declared rule. It owns identity scope, lookback windows, view-through policy, and credit allocation. Its job is to answer: which touches receive credit?
The incrementality ledger compares outcomes under different advertising policies. It owns randomization, treatment assignment, control integrity, confidence intervals, and experiment exclusions. Its job is to answer: what changed because the policy ran?
Every reported performance number should carry enough metadata to reveal its ledger:
1
2
3
4
5
6
7
metric: attributed_roas
attribution_rule: last_non_direct_click
click_window: 7 days
view_window: disabled
identity_scope: consented account or first-party click ID
revenue_basis: net of cancellations, before tax
as_of: 14 days after conversion
An incremental result needs a different contract:
1
2
3
4
5
6
metric: incremental_roas
estimand: intention_to_treat
randomization_unit: account
population: campaign-eligible accounts
outcome_window: 14 days
interval: 95% confidence interval
This discipline also clarifies power. Attribution platforms have an incentive to claim conversions because credit influences budget. Advertisers have an incentive to compare claims with their own event ledger and with independent experiments. Publishers and browsers influence which events can be observed at all. Measurement is not merely a technical join; it is a negotiated system of evidence among parties with different incentives.
8. The Practical Hierarchy
Attribution is not useless because it is not causal. It is fast, granular, and operationally necessary. Incrementality is not automatically superior for every task. Experiments can be slow, expensive, underpowered, and too coarse for creative-level optimization.
The productive hierarchy is:
- Reconcile real outcomes in the event ledger.
- Use a clearly named attribution rule for routine reporting and feedback.
- Run experiments at intervals to estimate causal lift and calibrate the attribution system.
- Optimize to business value using both, with uncertainty and margin visible.
The key is calibration. If attributed ROAS is 4.0x while repeated experiments place iROAS near 0.75x, the dashboard should not continue presenting its credit as incremental revenue. In the worked example, the ratio is 600 incremental buyers to 3,200 attributed purchases, about 19%. That is a calibration factor for this population, period, spend level, and attribution rule - not a statement that every attributed conversion is 19% causal, and not a number that transfers automatically across creatives, audiences, seasons, or budgets. Nor does one experiment license extrapolation: it estimates the tested policy at the tested spend, and doubling the budget need not double incremental revenue, because auction prices, reach, frequency, and channel substitution all shift with scale. The attributed metric can remain useful, but budget planning needs the experimental correction, refreshed as conditions change.
Priya’s ₹2,500 order, then, ends up in all three ledgers: reconciled to one event, credited by a rule to one of three claimants, and, if Urban Hiker runs the holdout, counted or not among 600 incremental buyers. The next time a dashboard says an ad “drove” a purchase, the immediate question is not whether the join was technically sophisticated. It is whether the number came from a credit rule or a counterfactual comparison. That one label separates a conversion path from a causal result.
References
- Gordon, B. R., Zettelmeyer, F., Bhargava, N., and Chapsky, D. (2019). A Comparison of Approaches to Advertising Measurement: Evidence from Big Field Experiments at Facebook. Marketing Science, 38(2), 193–225.
- Johnson, G. A., Lewis, R. A., and Nubbemeyer, E. I. (2017). Ghost Ads: Improving the Economics of Measuring Online Ad Effectiveness. Journal of Marketing Research, 54(6), 867–884.
- Lewis, R. A., and Rao, J. M. (2015). The Unfavorable Economics of Measuring the Returns to Advertising. The Quarterly Journal of Economics, 130(4), 1941–1973.
- Media Rating Council. (2022). Outcomes and Data Quality Standards.
- W3C Private Advertising Technology Working Group. (2026). Attribution Level 1. W3C Working Draft.
- Google Privacy Sandbox. Attribution Reporting API for the web.
- WebKit. (2024). Private Browsing 2.0, introducing Web AdAttributionKit (formerly Private Click Measurement).
- IAB Tech Lab. (2025). ADMaP: Attribution Data Matching Protocol.