Homemade Pasta · Case study
An incrementality matrix you can bid from
Over the past year we ran geo tests on two client accounts and turned the results into one graded table of incrementality factors per client. Those tables now set platform bid targets and daily budgets.
Why this exists
The problem with platform numbers
Every ad platform reports its own return, and every platform has a commercial reason to report it generously. The brand value ads create often goes untracked: people who see an ad and later search the brand name, type in the web address or buy on another device rarely trace back to it. A budget built on platform figures can overfund one channel and underfund another without anyone noticing.
Our research pages, Creating demand, or collecting it and Measuring what a channel caused, make the case for measuring what each channel caused and set out how. This page shows how we applied that method on two client accounts between October 2025 and October 2026, and how the results reached bid settings and daily budgets.
We prefer this to a media mix model. Every number in a matrix traces to a test the client can inspect, and none of it rests on a model’s assumptions.
Both clients are anonymized. Client A is a global creative software company selling in the US and Europe. Client B is a US audio technology brand. Each measures success in its own backend, so their figures are not comparable with each other, and this page does not compare them.
Summary
What we did and what changed
Platforms misreported in both directions. At Client A, Meta’s US advertising caused between 87% and 120% of the new-customer conversions Meta reported, across two holdout tests. At Client B, total paid media caused about 65% of what the platforms reported, across two tests run six months apart.
Each client’s results live in one table: a factor for every platform and channel, a grade for how far it can be trusted, and a default for anything untested. Bid and budget logic reads the table directly.
Bids changed within weeks of the first results. Client A had been holding Meta to a 15× target ROAS when the tests put break-even near 1.15×, so it stopped bidding to that target and scaled spend for volume. Revenue at the higher spend came in close to what the 0.87 factor predicted. Client B lowered its Demand Gen target from 3.0 to 2.0 using the formula in section 2, and its plan for the second half of 2026 takes it to 1.38 on Demand Gen’s own read. A daily tracker applies the matrix to every campaign. Its board has since moved paid media to a self-funded model.
1. The matrix
How the matrix is built
Each cell holds an incremental share: the conversions a channel caused in the client’s own backend, divided by the conversions the platform reported in the same markets and weeks. A share of 0.65 means 65 of every 100 reported conversions were caused by the advertising. A share above 1.0 means the platform undercounts.
Every factor carries a grade. Planning-grade factors come from clean tests that clear 90% confidence on a placebo test, or from two independent tests that agree, and they set bids. Directional factors point one way and are due a second test. Until then one can replace the default on its own channel, and they decide what gets tested next. A read that misses the bar is not used, and the channel stays on the client’s default factor until it is tested again.
The tests ran on our in-house geo testing tool, built on Meta’s open-source GeoLift, with every outcome read from the client’s own backend rather than from the platforms.
| Platform and channel | Region | Incremental share | Grade | What it sets |
|---|---|---|---|---|
| Meta | US | 0.87 to 1.20 | Planning two tests | Bid targets and scaling decisions, planned on 0.87 |
| Meta | EU | 0.73 | Planning one test | Bid targets |
| All paid media | US | 0.98 | Planning one test | Overall budget envelope |
| Google Demand Gen | EU | 1.27 | Directional one read | Next in the test queue |
| Google Demand Gen | US | None yet | No factor | Bids unchanged until a read meets the bar |
| Platform and channel | Region | Incremental share | Grade | What it sets |
|---|---|---|---|---|
| All paid media | US | 0.65 | Planning two tests | Default factor for every channel without its own read |
| Google Demand Gen | US | 0.91 | Directional one test | Demand Gen bid target and the daily tracker |
| Search, Meta, Shopping, Reddit | US | 0.65 | Default | Account default until a read meets the bar |
The two tables differ because the accounts were measured from different ends. Client A has planning-grade reads on its largest channel in both regions. Client B has a total measured twice, six months apart, and uses it as the default for every channel while channel-level reads are confirmed. A default factor measured on the client’s own account is a better bidding input than the platform’s number, and better than a benchmark from someone else’s.
Not every read makes the table. A test that comes back inconclusive, or one where the platform’s own conversion counts shift mid-test, does not produce a factor. The channel keeps its default until it is tested again.
2. Bids
Setting bid targets from the matrix
Automated bidding hits its target on the platform’s own count. Dividing the return you need by the channel’s incremental share gives the platform target that delivers it.
Break-even platform ROAS = 1 ÷ incremental share
Client B’s own lifetime-value economics put its break-even at an incremental ROAS of 1.25. Using the 0.65 default, 1.25 ÷ 0.65 = 1.92, so the Demand Gen target ROAS was lowered from 3.0 to 2.0. At 3.0, the implied incremental return was 3.0 × 0.65 = 1.95, well above the 1.25 the business needed, so the account was turning away volume it could afford. Demand Gen’s own read then came in at 0.909. That puts its target at 1.25 ÷ 0.909 = 1.38, and the plan for the second half of 2026 uses that figure.
Client A’s Meta account had the same problem on a larger scale. Meta in the US was bidding to a 15× target ROAS. At a planning share of 0.87, break-even sits at 1 ÷ 0.87 = 1.15×, so the target was about thirteen times break-even (15 ÷ 1.15 = 13.0). Client A stopped bidding to it and scaled spend for volume. Break-even is an average, and returns fall as spend grows, so it scaled in steps and read backend revenue at each one. Section 4 shows the reads.
From matrix to bid target
Set a channel’s incremental share, the incremental return you need and its current platform ROAS. The presets load values from the two tables above.
Incremental return is more than 0.05 above the floor. Add budget while it stays there.
Current incremental ROAS = platform ROAS × incremental share. Actions follow Client B’s daily rules: Raise above the floor plus 0.05, Keep within 0.05 of it, Reduce between 1.0 and the floor, and Cut or fix below 1.0, which means diagnosing tracking and setup before pulling budget. Client B’s all-paid example uses the platform ROAS observed during its second test.
3. Budget
Moving budget day to day
For Client B, the matrix feeds a daily tracker. Its objective is to spend as much as possible while the blended incremental ROAS across all campaigns stays at or above 1.25.
Each morning the tracker pulls every campaign’s spend and reported return through the platforms’ APIs, adjusts recent days for conversions that have not arrived yet, and multiplies by the matrix factor for that platform and channel. It then ranks campaigns by incremental ROAS and draws a waterline: every campaign above it stays funded, because including it keeps the blend above 1.25. Below the waterline, campaigns are sized down gradually rather than switched off, and anything under 1.0 is flagged to be diagnosed before budget moves.
A strategist approves every change before it is made. Suggestions land in a queue grouped by action, and the queue records each budget move against the number that justified it.
4. Results
Results at Client A and Client B
Client A raised Meta spend in the US first, then raised Meta and Google spend in Europe with two markets held out for comparison. Each step was read on backend revenue from the client’s own data, against markets where spend did not change.
| Read | Dates | Platform spend | Backend revenue | Comparison markets |
|---|---|---|---|---|
| Meta, US | May to June 2026 | +37.0% | +10.8% | +1.0% (rest of world, spend flat) |
| Meta and Google, EU | July to August 2026 | +113.5% | +63.8% | +30.4% (Sweden and Denmark, held out) |
In the first US step, revenue grew 10.8% where spend rose and 1.0% where it did not, and the gain was close to what the 0.87 factor predicted for the added spend. In Europe, spend more than doubled and revenue in the scaled markets grew 33 points faster than in the held-out markets (63.8% against 30.4%). These are before-and-after reads against comparison markets, a lighter design than the holdout tests, and both point the same way as the tests.
At Client B, the matrix runs through the daily tracker and the Demand Gen target. Revenue has improved consistently enough since then that the board moved paid media to a self-funded model: spend grows for as long as the blended incremental return holds at 1.25 or better. Its current tests group nine or ten states per cell.
5. Limits
What the matrix does not tell you
A factor is the average share of reported conversions a channel caused, at the spend level and season of the test. It is not the return on the next dollar.
That is why Client A scaled in steps and read backend revenue at each one, and why the bid targets above are starting points, not permanent settings. Returns shrink as spend grows, and a heavy-up test or a scaled-spend read shows by how much.
Factors also age. A share measured at one spend level, with one set of creative and one attribution window, changes when any of those change, so each factor is re-measured when conditions shift. A change to a platform’s attribution window voids the factor outright, because the denominator has changed.
Current designs group eight to ten markets per cell. Factors are specific to the outcome each client measures, so they do not transfer between accounts. The method, the tooling and the grading do, which is why every account gets its own matrix, built the same way.
6. Working with us
Getting to a first matrix
- Build the outcome feed: daily sales or leads from your own systems, by market, with enough history to build a baseline. This usually takes longest, and it makes every later test cheaper.
- Run one holdout test on the channel with the most spend, sized in advance so it can return an answer. Client A had its first planning-grade read about a month after its first test launched.
- Publish the first version of the matrix, with a factor for the tested channel and a default for everything else, each one graded. Bid targets can move as soon as it is published.
- Apply the matrix to daily budget, test the next-largest channel, and re-measure when spend, creative or attribution settings change. Client A went from its first test to a scaling decision in about three and a half months.
Building something different on purpose. Senior Operators using the right tools.

Tell us whatyou need.
We will get right on it. What you write here goes to a person who can actually answer it, and the person who answers is the person who will do the work.
Heard, chef.
It’s with a person now. You’ll hear back from the one who will do the work.
Prototype only: nothing was sent. The form sends to HubSpot once a form ID is set.