Post

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.

Learning path · Lesson 16 of 16

AdTech from first principles

  1. The invisible auction
  2. From campaign budget to publisher payment
  3. Who decides which ad gets served?
  4. The millisecond handshake
  5. Anatomy of an OpenRTB auction
  6. Campaign lifecycle inside a DSP
  7. Trusting the programmatic supply chain
  8. ML in the millisecond
  9. A real-time ad platform under a millisecond budget
  10. The data exhaust of a page load
  11. The post-cookie frontier
  12. Practical privacy on the web
  13. Learning the win curve
  14. From win curve to bidding
  15. Floor-price optimization
  16. What did the ad actually cause? You are here
From Conversion Pixels to Incrementality: What Did the Ad Actually Cause?

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:

  1. Which marketing touch should receive credit for the order? This is attribution.
  2. 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:

EventTypical evidenceWhat it establishes
Ad opportunityAuction or ad-server logAn ad could have been selected
ImpressionRender or measurement beaconA creative was rendered under a counting rule
Viewable impressionViewability measurementEnough of the creative was on screen for long enough
ClickRedirect or click logA browser followed the ad link
ConversionBrowser pixel or server eventA business outcome was reported
MatchCookie, click ID, login, or clean-room joinTwo records probably belong to the same browser, account, or household
AttributionWindow and credit ruleA 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:

The same Day 1 display view, Day 3 search click and Day 5 affiliate click precede one 2,500-rupee order. Under common eligibility windows, first touch gives display all credit, last click gives affiliate all credit, and linear attribution gives each one third. A shorter view window can exclude display. 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.

RuleCredit assigned in this journeyAssumption embedded in the rule
Last click100% to affiliateThe final eligible click deserves all credit
First touch100% to displayThe first observed introduction deserves all credit
LinearEqual shares across eligible touchesEvery touch contributes equally
Time decayMore credit to recent touchesProximity is a useful proxy for influence
Position basedMore to first and last touchesIntroduction and closure matter most
Observational model basedShares estimated from observed pathsHistorical 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.

A server event S1 and its retry, drawn with a dotted outline, share an event ID and collapse to one transport record. A browser event B9 has a different event ID but the same order ID O42, so business reconciliation joins both transports into one 2,500-rupee purchase. A later refund is a new adjustment linked to O42. 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:

  1. Event reconciliation: How many real business outcomes occurred?
  2. Attribution: Which eligible touches receive accounting credit?
  3. 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:

ArmPeople assignedBuyersBuyer rate
Control, campaign withheld100,0004,0004.0%
Treatment, campaign available100,0004,6004.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\]

Attribution row: 60,000 rendered impressions lead to 3,200 matched purchases and 8.0 million rupees credited at 4.0 times ROAS. Incrementality chart: 4,000 control buyers and 4,600 treatment buyers per 100,000 assigned, with the 600-buyer difference highlighted beside its 95% interval of 422 to 778. At 2,500 rupees per order that is 1.5 million rupees of incremental revenue on 2.0 million rupees of spend, an iROAS of 0.75 with a 95% interval of 0.53 to 0.97. 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:

Eligible population of 200,000 people passes through random assignment before auction or exposure. It splits into 100,000 assigned treatment members for whom the focal campaign may run and 100,000 controls for whom it is withheld. The final comparison uses outcomes for both complete arms under the same definitions and outcome window, including treatment members never shown an ad. 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.

Two equal treatment and control arms of 100,000. The treatment column divides proportionally into 60,000 exposed and 40,000 not exposed. The control column withholds the campaign and contains only a schematic dashed split because its would-have-been-exposed subgroup is unobservable. A red crossed line marks the exposed-only versus control comparison as selecting on a post-assignment event; a bracket compares the full arms for intention to treat. 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:

  1. Reconcile real outcomes in the event ledger.
  2. Use a clearly named attribution rule for routine reporting and feedback.
  3. Run experiments at intervals to estimate causal lift and calibrate the attribution system.
  4. 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

Enjoyed this article? Never miss out on future posts - follow me.
© Sayan Biswas. All rights reserved.