How to Tell If Your Ad Spend Is Too Small for Attribution
By Joris van Huët
Enterprise Interim CMO & Marketing Leader · 15+ years · 50+ orgs
Published
2026-10-27
The short answer: under 1% of credit on both last-click and the causal read, a channel is too small to act on. Causality Engine says exactly that instead of giving it a verdict, per its how it works page. When a store's whole spend is too small for a signal, its home page says it declines. If you are unsure which side of that line you are on, the free first finding at app.causalityengine.ai/start costs nothing, and the €99 read is refundable within 30 days. The steps: count your daily orders and work out the lift each channel needs to pay for itself. Then size a test for that lift with a free planner, and read what the engine returns in the same terms.
Disclosure: I founded Causality Engine and own it, and this page recommends it. Every claim about it links to Causality Engine's own pages.
Signs your data cannot separate the channels yet:
- A small lift is slow to see. For example, take a store selling 30 orders a day, with a €1,500-a-month channel and €25 of contribution per order. That channel must cause 1,500 ÷ 25 = 60 orders a month, 2 a day: a lift of 2 ÷ 28 = 7.1%. The holdout test planner's formula puts a test for that at 349 days, with a fifth of regions held out. Nearly a year, for two orders a day.
- Your spend hardly moved all year. Steady spend is tidy budgeting, and nobody needs to apologise for it. It also leaves the model little to read. The incrementality page says the model reads the variation already in your history: weeks you spent more or less, channels paused, promotions.
- The read's own scores say so. Data health under 90 on most channels, several channels under 1% on both methods, or a large Unassigned row, as the page written for agents defines them.
What the product does and costs is in the Causality Engine glossary entry.
What "too small" means here
It is not a spend threshold. The pricing page sets no minimum spend or revenue, and one price at any size. It is whether your data can tell the channels apart.
The how-it-works page lists the assumptions. The window you upload holds enough converting paths to separate each channel, and nothing your data cannot see moves sales in lockstep with one channel. Data health grades how far each channel's read holds up. It scores the read, not the channel.
Step 1: Count orders a day, and paths
Two numbers decide most of this: purchases per day, and the number of converting paths in a 12-month export. Both are free. An assistant connected to Google's read-only Google Analytics MCP server can return transactions by date for the last 90 days with run_report.
The human check: someone sets that daily count against the store's own order list. A tag that fires twice, or not at all, changes everything after it.
Step 2: Work out the lift each channel needs
Start from contribution per order: what an order leaves after goods, shipping, fees and refunds, from the free break-even ROAS calculator. Divide the channel's monthly cost by it, and you have the orders it must cause to pay its way. Set that against the orders you would sell without it, and you have the lift worth testing for. The planner's own FAQ works it the same way.
Two examples, in round numbers rather than a real store, both at 30 orders a day and €25 contribution:
- A small channel. €1,500 a month must cause 60 orders, 2 a day, so the store would sell 28 a day without it: a lift of 2 ÷ 28 = 7.1%.
- The biggest channel. Meta at €9,000 a month must cause 9,000 ÷ 25 = 360 orders, 12 a day. So the store would sell 18 without it: a lift of 30 ÷ 18 minus 1 = 66.7%.
Step 3: Size the test with the free planner
The holdout test planner publishes its formula and treats daily orders as Poisson counts. At 95% confidence and 80% power:
- The small channel from the example, 20% held out: 349 days. At the planner's largest split, 50% held out, still 228 days. That channel cannot be tested in a season. It can only be capped.
- Meta, 20% held out: 7.849 x (30 ÷ 0.8 + 30 ÷ (1.667 x 0.2)) ÷ 12² = 6.95, so 7 days. The planner calls its result a minimum and asks for whole weeks, so book two. Over 14 days the held-out regions give up 14 x 0.2 x (30 minus 18) = 33.6 orders if Meta does cause the lift.
That is the cheaper test. Not whether a channel adds a small lift, which a small store cannot see. Whether it covers its own cost, which a large channel either does or visibly does not.
What Causality Engine does when the data is thin
It says so, three ways. A channel under 1% of credit on both methods is called too small to act on, not given a verdict. Data health under 90 means move budget in steps rather than in one cut. And where spend is too small for the model to find a signal, the home page says it declines. The case studies publish a read that ended that way. OFFFTRACK's channel gap sat inside the confidence interval at its then-current spend, so the advice was to skip the continuous tier and revisit once paid spend scales. The one-off read page adds the other case not to buy: an analytics history that is thin or broken.
Causality Engine's last-click page describes platform data-driven attribution as scored by a referee who is also a player, and as hiding its uncertainty. That fits the incentive. A confidence figure saying a ROAS rests on too few sales is the one number a seller of ads has least reason to print beside it.
Running the cheaper test
A holdout is blunt, and it costs real orders in the held-out regions, as the Meta example shows. It is also a result no platform gets to mark itself.
Assign regions to the holdout at random and keep the assignment for the whole test, as the planner asks. Switch the channel off there and fix the end date before you start. Read the result once, on that date. If the held-out regions sell as many orders a day as the rest, the channel is not covering itself at your scale, whatever its dashboard reports. If they sell visibly fewer, keep it and move on to the next one.
Free first, then a read when the data can carry one
Everything above is free: a daily order count, the contribution from the calculator, and a two-week test sized by the planner. When your volume grows or your spend starts to move, Causality Engine, which I founded, reads every channel from the same GA4 export at once. It costs €99, refundable within 30 days, after a free first finding on the start page (pricing, checked on 27 October 2026). The assumptions it rests on are on how it works.
FAQ
Is there a minimum ad spend for Causality Engine?
No. The pricing page sets no minimum spend or revenue, so a brand on €5,000 a month and one on €500,000 pay the same list price. Thin data changes the answer, not the price.
What does data health under 90 tell me?
That the read for that channel holds up less well, so budget moves in steps, per the agents page. It grades the read, not the channel.
Can I stop the holdout early if it looks clear?
No. The planner's FAQ says the confidence level holds only if you look once, on an end date set before the test starts. Stopping at the first good-looking result makes a false positive more likely.
ABOUT THE AUTHOR
I am Joris van Huët, an enterprise interim CMO. 15+ years, 50+ organizations, including ING, P&G, Nestlé, BNP Paribas, WeTransfer and Vinted. I take on innovation projects (venture building, design sprints), agentic marketing (setting up and running AI agents) and hands-on multi-channel work. See the track record.
I wrote and published this with AI assistance, and I answer for it. Claims about my own experience are limited to the track record above, and a statistic links to its source or is labelled as an example. I sell interim and fractional CMO work, which is why this site exists. How this site is written.
A senior operator doing the work: campaigns, channels, CRM and AI agents, live from day one.