Stochastic Strata
WritingAboutGet in touch

Search budgets and bids · 20 min read · Interactive · Video

Where am I losing money right now, and can I trust Google's own estimate of the fix? Impression share and a replay of logged auctions

It is Thursday evening, and the search campaign has spent its 200 euros for the day, as it does every day. Its owner opens the bid simulator and finds a promise there. Raise the bid by 30 per cent, take the cap off the budget, and the coming week brings 138.7 conversions. Underneath, in the chat window, one line. "Is that real?"

Two questions hide in that line. Where is this campaign losing money now? And how far can Google's own estimate of the fix be trusted? The first has a good answer already sitting in the account. The second is the one I measured.

The short answer

You are losing money in two places, and your account already shows both: the auctions your budget kept you out of, and the auctions you entered and lost on bid. Those shares describe auctions that already happened, so they are the most trustworthy numbers you have. The fix is harder. Simple arithmetic overstates what a bigger budget wins and underprices what higher bids cost. Google's bid and budget simulator estimates the fix by replaying last week's auctions at the new setting, which Bottou and colleagues, writing about Bing's ad auction, call a counterfactual estimate from logged data. In my tests on five hundred synthetic campaigns, such a replay landed within a fifth of the next week's clicks 89 per cent of the time when the world held still. When competition rose a fifth, the typical campaign's click projection overshot by 23.9 per cent. A replay cannot see next week. It assumes everyone else stands still.

Watch · 16 min Taught end to end: the scope first, what this answers and what it does not, then the report and its three shares, the split and the win share hidden in it, the two leaks and why the budget one is read first, the naive arithmetic wrong twice, the formula read left to right, the ticket intuition, the budget lever against the truth, the bid lever and the price of the extras, what a bid rise does under a capped budget, what a simulator is in Google's words and the literature's, how a replay runs on one hour of the log, the replay reproducing its own week, four next weeks, five hundred campaigns scored, the change inside the lookback in proportion, the conversion figure by account size, three pieces of evidence, the log and its floors, and the honest limits.

Watch: where am I losing money right now

Prefer to read? Everything below covers the same ground in more depth: the arithmetic, a widget to play with, and the notebook and spreadsheet to run it yourself. The worked example is synthetic, and every on-screen number is computed. (Turn captions on with the CC button.)

What the report already knows

Every time someone types a query your campaign could answer, an auction runs, and one of three things happens. You show, because your bid (weighted by how good Google thinks your ad is) clears the price the others set. You are kept out, because the day's budget is spread thin. Or you enter and lose, outbid.

Google reports these as three shares of one pool: impression share, the share lost to budget and the share lost to rank [2, 3]. They add up to the whole, and they describe auctions that already happened.

The catch is that the pool itself is an estimate. It counts auctions you could have shown in at a higher bid (Google's example is twice your current one), and leaves out ones that would have needed something like a 1,000 per cent bid increase [2]. So the share lost to rank means the auctions within reach, and the whole split moves when the bid does.

Think of the pool as a stack of tickets, each with a price on it. The budget decides how many you get to look at, and the bid decides how many of those you can afford. The obvious mistake comes in two halves: assuming the tickets you never saw were all winners (they were a mix, in your usual proportion), and assuming the ones you could not afford would cost what your usual ticket costs. They would not. They are the expensive ones, which is why you lost them.

Which methods this uses, and why not the others

What runs here. Two readings and one experiment. I read the three-way split as the platform reports it, with the arithmetic it supports and nothing more. I relay the platform's own estimate of a change, the bid and budget simulator, as what it is: a projection only Google can check. And I build a replay of the same kind on a campaign I generated auction by auction, so its projection can be held against the week that followed.

The back-of-envelope sum. Multiply the impressions you lost by your usual click rate, conversion rate and value, and call it the money on the table. It takes a minute and gets one thing right for each leak: budget-lost impressions do come at about your usual price, and rank-lost ones are reachable if you bid enough. But it overstates what a bigger budget wins by one over the win share, 1.47 times on the worked campaign below.

It also gets the price of the rank leak wrong. On that same campaign, the extra conversions from bidding half again as much cost €30.63 each against an average of €17.60.

Google's estimate, read as a forecast. The simulator holds data nobody else has, every competitor's bid in every auction you were in, so I do not try to rebuild it from outside. Its weakness is in the tense. Google's own page says the tools estimate how your ads "might have performed" [1]. The research name for that is a counterfactual on logged data, and Bottou and colleagues set its scope in one phrase: what would have happened "without incurring user or advertiser reactions" [7]. It is last week re-run, with everyone else frozen.

Measuring the change after you make it. A before-and-after comparison (the careful version is called an interrupted time series) tells you what a change did. The split and the simulator tell you, beforehand, where the room is. A good decision puts three things side by side: the headroom the account reports, what the vendor projects, and what happened the last time you moved this lever. None of the three settles it alone.

The formula, written out

Here is the maths, in five short steps. The first four are one division or multiplication each, and after them you can check every figure in this post by hand.

The pool. With I the impressions the platform reports and s the impression share,

E = I ÷ s

is the eligible pool. With b and r the shares lost to budget and to rank, s + b + r = 1, and the auctions lost to each cause are E · b and E · r. On the worked campaign that is 29,234 and 20,860 auctions.

The win share. When the campaign does enter an auction, it wins a fraction of the time, and the report already holds that fraction:

w = s ÷ (s + r)

The win share is 67.8 per cent on the worked campaign.

What a bigger budget wins. If the budget is spread evenly through the week, the auctions it kept you out of are a fair sample of all your auctions. So a bigger budget would have won E · b · w of them, at about your usual click rate, conversion rate and price. That is 19,832 impressions, not 29,234. The even spread is an assumption about the budget, not a law, and the notebook says so.

The naive count and the corrected one. With click rate c and conversion rate v, the naive conversions from a bigger budget are E · b · c · v and the corrected ones E · b · w · c · v, so the naive count is too big by 1 ÷ w. On the worked campaign that is 50.5 naive conversions against 34.3 corrected ones. For the rank leak there is no corrected count without a bid, and no price without the spread of prices to beat, which the report does not carry.

The replay. Take last week's auctions, each with its price to beat t. At a bid m times the current one, the campaign wins every auction with t ≤ m · bid. Clicks are the wins times last week's click rate for that hour, cost is the price to beat of each clicked auction, and conversions are clicks times the week's conversion rate. If the cost goes over the budget, everything shrinks to the share the budget allows. That is the whole engine, and the widget runs the same code. Bottou and colleagues describe exactly this kind of replay of past data, and say where it is weakest: at settings the logged data barely covers, which a careful system leaves out [7]. That is why a simulator shows a band of bids around your current one, not a curve to the horizon.

The worked example synthetic

Every number here comes from the accompanying notebook, which builds the campaign auction by auction (synthetic, built so the right answer is known in advance).

The campaign. One search campaign bidding €1.20 a click on a budget of €200 a day. Prices to beat are stiffer in business hours, when clicks and conversions also peak, and the budget is spread evenly across the week, which makes the three-way split exact.

Each conversion is worth €32 to the business. Last week's report:

what the report said last week
impressions43,997
clicks1,782
spend€1,425
conversions76
click rate4.05%
conversion rate4.26%
cost per click€0.80
cost per conversion€18.75
shown46.8%
lost to budget31.1%
lost to rank22.2%
share of the budget spent101.8%
One eligible pool split three ways: shown, lost to budget, lost to rank
What the report says: one eligible pool, split three ways. Synthetic campaign.

Three figures for now, and why they differ. The 76 conversions and the €18.75 are what last week happened to deliver. On its own odds, the campaign brings 79.5 conversions a week at its €200 a day, or €17.60 each, and the levers below start from that. Lifting the budget buys more of the same auctions at the same odds, so the price stays at €17.60. It does not get cheaper. The replay further down reads last week's actual log, and gives back 75.0.

Reading the leak. Last week the campaign was eligible for 94,091 auctions, and the budget, not the bid, was the tighter limit.

Corrected for the win share, the arithmetic says a bigger budget would bring about 34 conversions here, not the 50 the naive count says. So I tested it. I lifted the budget in the notebook until it stopped binding.

The world's own answer was 35.9 extra conversions, for €631 more spend, at the same cost per conversion as before the lift. The naive count was 1.41 times the truth, and the corrected count was within two conversions of it.

There is a second way the naive count misleads. The budget stops binding at 1.45 times the current one, while the naive count would keep buying until 1.68 times, chasing auctions the campaign would never have won.

lifting the budget until it stops binding
naive conversions50.5
their value at €32 each€1,616
corrected conversions34.3
the truth35.9
cost per extra conversion€17.60

The rank leak, priced. Now take the cap off and raise the bid in steps. At half again the bid, the campaign takes 157.6 conversions a week instead of 115.4.

The extra ones cost €30.63 each, or 1.74 times the average. And each step costs more than the one before, so the last steps cost well over twice the average, as the table shows.

At the conversion's value, the extras first cost more than they are worth on the step to 1.4 times the current bid, and the week's margin peaks at 1.3 times, the Thursday setting.

The naive count of the rank leak, 36 conversions at the usual cost, matches the extras at 1.4 times the bid (37.0) and gets the price wrong at every bid.

raising the bid with the budget lifted
conversions a week at the current bid115.4
spend at the current bid€2,031
cost per conversion at the current bid€17.60
spend at half again the bid€3,323
extra conversions at half again the bid42.2
extra spend at half again the bid€1,292
each extra conversion, the step from 1.4 to 1.5 times the bid€36.36
each extra conversion, the last step to twice the bid€47.10
margin at 1.3 times the bid€1,754
margin at the current bid€1,661
naive rank-leak conversions36

Why the budget leak is read first. Raise the bid half again and leave the budget at its 200 euros, and the campaign loses 13.1 conversions a week. The same money now buys fewer, dearer clicks. Google says much the same in its own way: a campaign that hit its daily budget recently gets budget ideas instead of the bid simulator, and the rank figure disappears from the ad group view if the budget ran out at any point in the dates you picked [1, 3].

conversions a week, budget kept at its 200 euros
at the current bid79.5
at half again the bid66.4

The replay, on the week it was built from. Run at last week's own bid and budget, the replay gives back almost exactly the week it read. That is what a replay does.

the replay at last week's own settingsreplayreported
impressions43,38143,997
clicks1,7581,782
spend€1,400€1,425
conversions75.076

The replay, against the week that followed. Now the change from the Thursday screenshot: the bid up thirty per cent, the budget lifted so it does not bind. The replay projects 3,252 clicks and 138.7 conversions for the week.

what the replay projects for the change
projected impressions79,712
projected spend€2,963

Then next week happens, in four different worlds.

next week's worldclicks realisedprojection's error on clicksconversions realisederror on conversions
the same world3,108+4.6 %134+3.5 %
demand up a quarter3,858−15.7 %194−28.5 %
competition up a fifth2,701+20.4 %123+12.8 %
a change inside the lookback2,643+10.7 %123+2.7 %

In the same world, the replay is close. When demand rises, it undershoots by the rise it could not see. When competition stiffens, it overshoots, because some auctions it counted as winnable no longer are.

The fourth world is the sly one. Competition rose by a fifth at the start of the fifth day of last week, so the replay read a log that was part old world and part new. It overshot next week by about half as much as the competition world did.

the week with a change inside it
share of the week before the change57%
share of the week after it43%
projected clicks2,927
shown, lost to budget, lost to rank46.2%, 21.6%, 32.3%

Scored on five hundred campaigns. One campaign is an anecdote. The notebook builds five hundred, each with its own size, competition, rates, budget and value, and gives every week the small wobble no two real weeks are without. The same change (bid up 30 per cent, budget lifted) is projected from each campaign's last week and scored against its next, as a share of what really happened.

next week's worldclicks: typical errormiddle 80 % of campaignswithin 20 %conversions: typical errormiddle 80 %within 20 %
same settings, same world−0.4 %−8.3 to +7.698 %+0.3 %−30.8 to +39.957 %
the change, same world+0.3 %−14.9 to +17.289 %+0.6 %−28.9 to +39.660 %
demand up a quarter−17.6 %−31.4 to +0.758 %−16.8 %−40.1 to +15.749 %
competition up a fifth+23.9 %+2.6 to +53.043 %+23.0 %−11.2 to +71.341 %
a change inside the lookback+13.2 %−9.0 to +39.461 %+11.9 %−23.8 to +61.945 %

The first row is the replay doing nothing but predicting next week from last week at the same settings. Its clicks landed within ten per cent on 85 per cent of campaigns. The second row is the change: no lean either way, but wider, because the new bid wins auctions the campaign never entered. In the last three rows the projection stays faithful to a week that no longer exists.

A change inside the lookback, in proportion. The later in the week the change happened, the more of the old world the replay carries. A projection built on a week with a change inside it is wrong in proportion to the share of the week that came before the change, up to 22.4 per cent when six of the seven days came before it.

share of the lookback before the change14%29%43%57%71%86%
typical click error+0.6%+9.2%+10.5%+13.9%+16.6%+22.4%

The conversion figure is the shaky one. Clicks are learned from thousands of impressions, and the conversion rate from a few dozen conversions, so the projection inherits every lucky and unlucky week. On campaigns with fewer than fifteen conversions a week, the projected conversions were off by a third or more on 38 per cent of weeks. Google's page puts it mildly: conversions "can be more difficult to estimate" [1]. The table says by how much.

conversions a weekclick miss either way, middle caseconversion miss either way, middle caseconversions off by a third or more
under 157.4%25.4%38%
15 to 506.8%18.2%26%
50 to 1508.5%11.6%7.6%
over 1508.8%11.3%3.2%

What to do with the estimate

Read the leak before the estimate. The split is exact for what it counts. Fix the budget leak first, because while the budget binds, the rank figure is understated and a bid rise buys nothing.

Treat the projection as a look back, not ahead. It says what last week would have brought at the new setting. If a seasonal event, a competitor's move or a change of your own sits between the lookback and the week ahead, the projection is wrong by about the size of the move. Check the simulation's dates against your change history first.

Trust its clicks before its conversions. The click projection is the sturdy one. On an account with fewer than fifty conversions a week, read the conversion figure as a range at least a fifth wide either way: the middle miss there was 20.0 per cent.

Keep a log, and let it earn trust. Every time you act on a projection, write down what it promised and what happened over a window of the same length. On the synthetic campaigns' own errors, the typical click error is known to within ten points either way after 8 logged changes, and the typical conversion error after 30. The notebook refuses a reading below those floors and shows the errors one change at a time instead.

Try it on your own numbers

The synthetic campaign's report and its split sit at the top. Below them, a replay of last week's auctions projects what a different bid or budget would have brought, and beside it is what next week's auctions actually hold in a world you choose: the same world, demand up, competition up, or a change inside the lookback. Move the bid and the budget and watch where the projection is honest and where it carries last week into a week that no longer exists. The pinned cases are the ones the notebook stores, and the widget reproduces all of them with the same code and says so at the bottom.

Caveats to watch out for

Every method has conditions it needs. These are this one's, and they are the part of the post worth reading twice.

The eligible pool is an estimate that moves with your bid.

Google counts as eligible the auctions you could have shown in at a higher bid, its example being twice your current one [2], so raising the bid changes the pool the shares are measured against. My synthetic campaign draws the line at four times the bid. The arithmetic of the split is the same wherever the line sits.

A capped budget hides the rank leak.

While the budget binds, the share lost to rank is measured only on the auctions the campaign entered, so it understates how often it is outbid. A bid rise under the cap cost the worked campaign 13.1 conversions a week. Google withholds the rank figure at ad group level in exactly this case [3]. Lift the budget, let the shares settle, then read the rank leak.

Raising the bid with the budget lifted: conversions climb and flatten, and the extra conversions each step buys cost more than the average ones. With the budget kept where it is, conversions fall. Synthetic campaign.
Raising the bid with the budget lifted: conversions climb and flatten, and the extra conversions each step buys cost more than the average ones. With the budget kept where it is, conversions fall. Synthetic campaign.

The clamp bites where the leak is biggest.

The platform reports a lost share above ninety per cent as a ceiling and an impression share below ten per cent as a floor [4]. The campaign in the notebook whose true budget-lost share was 94.2 per cent arrives as 90.01. The room behind it is at least what is shown, and the notebook reads it that way.

A bigger budget buys your usual share of the lost auctions, not all of them.

The naive count of the budget leak is too big by one over the win share: 1.47 times on the worked campaign, and 1.41 against the world's own answer. The correction assumes the budget is spread evenly across the week. Where a real budget runs out at a fixed hour, the auctions it misses are that hour's, and the correction is only approximate.

Lifting the budget until it stops binding: the naive count and the truth climb together at the same price, then the truth stops where the budget stops binding and the naive count keeps buying. Synthetic campaign.
Lifting the budget until it stops binding: the naive count and the truth climb together at the same price, then the truth stops where the budget stops binding and the naive count keeps buying. Synthetic campaign.

The rank-lost conversions are priced above your average, by construction.

The auctions you lose on rank are the ones whose price to beat is above your bid, and winning them means paying it. On the worked campaign the extras from half again the bid cost 1.74 times the average. No report shows the spread of prices behind that. Only a bid change does.

A replay describes last week, with everyone else frozen.

On a typical campaign it ran −17.6 per cent on clicks when demand rose by a quarter and +23.9 when competition rose by a fifth. It cannot see next week, and it says nothing about whether anyone else will move.

Five hundred campaigns: the projection's error on clicks and on conversions, by world. The median is a dot and the middle eighty per cent a band. Synthetic campaigns.
Five hundred campaigns: the projection's error on clicks and on conversions, by world. The median is a dot and the middle eighty per cent a band. Synthetic campaigns.

A change inside the lookback is carried in proportion.

With a change inside the lookback, the typical click projection ran +13.2 per cent high. With most of the week before the change, it reached 22.4 per cent. Check the simulation's start and end dates against your change history before reading the number.

The median projection error against how much of the lookback lay before the change. Synthetic campaigns.
The median projection error against how much of the lookback lay before the change. Synthetic campaigns.

The conversion projection inherits a week's luck.

On campaigns with fewer than fifteen conversions a week, it missed by a third or more on 38 per cent of weeks, while the click projection's typical miss was 7.4 per cent. Google says the conversion estimate is harder and improves with more history and more conversions [1].

Same world, same change: the typical error of the click projection and of the conversion projection, by how many conversions the campaign gets in a week. Synthetic campaigns.
Same world, same change: the typical error of the click projection and of the conversion projection, by how many conversions the campaign gets in a week. Synthetic campaigns.

A handful of logged changes proves nothing.

The typical error from three changes is mostly luck. It takes 8 changes for clicks and 30 for conversions before the middle ninety per cent of typical errors spans less than twenty points.

Bids far from the one you ran are the weakest region.

Last week's data holds few auctions that speak for a bid twice the current one, and a careful counterfactual system leaves such settings out rather than print a number [7]. My widget goes to twice the bid only because the synthetic log is complete.

These numbers are from synthetic data.

Every auction and every week was generated with the answer built in, so each reading could be scored. Yours has a different shape. The method transfers, the numbers do not.

Getting your data

A campaign export, one line per day. In the Google Ads interface, on the Campaigns page, add the columns Search impr. share, Search lost IS (budget) and Search lost IS (rank) next to impressions, clicks, cost and conversions. Segment by day, filter to one campaign (a brand campaign's shares say nothing about a generic one's) and download as CSV. The notebook reads that download as it comes, title lines, percentages, Total row, European decimals and .xlsx included, or a tidy file with these columns:

columnwhat it holdsexample
datethe day2026-08-03
impressionsimpressions that day4988
clicksclicks182
costspend, in your currency149.20
conversionsconversions7
search_impression_shareimpression share, as a fraction or a percentage0.43 or 43%
search_budget_lost_impression_shareshare lost to budget0.28
search_rank_lost_impression_shareshare lost to rank0.29
daily_budgetoptional: the average daily budget that day150

From the API, the same rows come from the campaign resource segmented by date, and the give-to-your-AI brief carries the query. The platform clamps the ends of its scale: < 10% or > 90% in the interface, 0.0999 or 0.9001 from the API, where a lost share is reported between 0 and 0.9 and anything above 0.9 comes back as 0.9001 [4]. The notebook reads each one as the limit it is, so > 90% means at least ninety per cent.

A projection log, one line per change you acted on, kept by hand. Write the simulator's projected clicks and conversions down before you apply the change, because they are gone once it is live.

columnwhat it holdsexample
change_datethe day the change went live2026-07-14
what_changeda note: bid, budget, targetbudget 150 to 220
projected_clickswhat the simulator projected for the window after1620
projected_conversionsits projected conversions64
actual_clickswhat happened in a window the same length as the simulator's1544
actual_conversionsactual conversions in that window51
change_in_lookbackoptional: yes if something else changed in the week before the projectionno

What it refuses. Fewer than seven days with an impression share, because the shares swing with the weekday and arrive a day or two late. A file without the three share columns. A trust reading from a log below the floors. It warns, rather than refuses, when a share arrives clamped, when the shares do not add up, and when a logged change had another change inside its lookback.

The notebook runs on your own computer. Nothing about your account leaves it.

The same numbers, in production

The split is the platform's own instrument, and I read it by the platform's own definitions: impression share is impressions over the total eligible, and the two lost shares are the time your ads did not show because the budget was too low or the Ad Rank too poor [2, 3]. Google's Limited by budget status fires on that split, when a campaign misses 5 per cent or more of its potential traffic in a week [5, 6]. The simulators are the platform's own too, built from auction data including Quality Score and competition over the last 7 days [1]. The engineering behind such an estimate is public: the team running Bing's ad auction described estimating, from logged auctions, how the system would have done with one auction setting scaled, every user and advertiser frozen [7]. It is the same scope I measured, with the same limit at settings the data never ran.

Common questions

My campaign says "limited by budget". Should I raise the budget?
Read the split first. If the budget-lost share is large and you would pay the current cost per conversion again, a bigger budget buys your win share of the lost auctions at about the same price. On the worked campaign the naive count said 50.5 conversions a week and the truth was 35.9, at the same cost per conversion as before.
Should I raise bids instead?
Not while the budget binds. The same budget then buys fewer, dearer clicks, and conversions fall. Once it does not, raise the bid in steps and price each one. Stop before the step where the extra conversions cost more than they are worth: at 1.3 times the bid on the worked campaign, at €32 a conversion.
Is the bid simulator accurate?
It is a replay of your last seven days at a setting you did not run, with everyone else's behaviour frozen. On my synthetic campaigns, that kind of estimate landed within twenty per cent of the following week's clicks 89 per cent of the time when the world held still, and ran 17.6 per cent low when demand rose, 23.9 per cent high when competition rose and 13.2 per cent high with a change inside the lookback. Nobody outside Google can score its simulator except by logging it against what happened, which the notebook's last section does.
Why is its conversion number so far off when the clicks are close?
Because conversions are rare. A week's clicks are counted in thousands and its conversions in dozens, so the conversion rate the replay learns is noisy. On campaigns under fifty conversions a week, the conversion projection was off by a third or more on 29 per cent of weeks.
What does "lost IS (rank)" actually mean for my money?
That the campaign was outbid in that share of the auctions it entered, among the auctions Google reckons it could have competed in at a higher bid. Winning them costs more than you pay now, and no report says how much more. Only a bid change, priced step by step, does.
The shares don't add up to a hundred. Is the export broken?
Usually not. A clamped share or a day the platform has not finished updating will put the sum a few points off. The notebook warns and reads the split anyway. Below ninety-five or above a hundred and five, it tells you which days.
Can I skip all this and just follow the recommendations tab?
The recommendations read the same split and the same simulations. They cannot know what you know: whether something changed inside the lookback, whether a competitor is moving, and what a conversion is worth to you. Add those, and decide.

Try it on your own account

Export the last thirty days of one search campaign, one line per day, with the three share columns. Work out the pool, the win share and the corrected count for a bigger budget, and set it beside what the simulator offers. Then write the simulator's promise down before you press apply. Next Thursday, when the chat window asks whether it is real, you will have a week of your own to answer with.

References

  1. [1] Google Ads Help. Estimate your results with bid, budget, and target simulators. Google. support.google.com/google-ads/answer/2470105 (accessed 15 September 2026).
  2. [2] Google Ads Help. About impression share. Google. support.google.com/google-ads/answer/2497703 (accessed 15 September 2026).
  3. [3] Google Ads Help. Get impression share data. Google. support.google.com/google-ads/answer/7103314 (accessed 15 September 2026).
  4. [4] Google Ads API. Metrics field reference, version 24, the search impression share and search budget lost impression share fields. Google for Developers. developers.google.com/google-ads/api/fields/v24/metrics (accessed 15 September 2026).
  5. [5] Google Ads Help. Fix "Limited by budget" bid adjustments. Google. support.google.com/google-ads/answer/2616012 (accessed 15 September 2026).
  6. [6] Google Ads Help. About budget pacing insights. Google. support.google.com/google-ads/answer/13685469 (accessed 15 September 2026).
  7. [7] Bottou, L., Peters, J., Quiñonero-Candela, J., Charles, D. X., Chickering, D. M., Portugaly, E., Ray, D., Simard, P. and Snelson, E. (2013). Counterfactual reasoning and learning systems: the example of computational advertising. Journal of Machine Learning Research, 14, 3207 to 3260, pages 3221 to 3227.

From Stochastic Strata. I build marketing measurement that shows its working: every number carries its range, and when the data cannot answer a question, I say so and tell you what would. The worked example here is synthetic. The method is the real thing, and you can run it on your own data with the notebook or spreadsheet above. Nothing in this post is financial advice.