Skip to content
Was It Causal?

The Case for Doing Nothing

Contact fatigue, capacity, and cost mean no-action is a real treatment arm. Why it belongs in every decisioning system by default, and why organizations reliably leave it out.

Look at next quarter’s campaign calendar. Every slot is filled.

That is not because somebody weighed acting against not acting for each audience and acting won every time. It is because there is no brief template for a campaign you decided not to run, nobody presents one at the planning meeting, and no measurement system reports on it afterwards. Doing nothing is absent from the calendar because it does not look like work.

It is also, across most of most audiences, the correct answer.

Doing nothing is a candidate

A no-action decision has a value. It costs nothing and it changes nothing, so its expected value is zero. That makes it the reference every other action is scored against, and it wins whenever the alternative comes out negative.

There are three ways an action comes out negative, and they are different failures with different fixes.

It costs more than it returns. Break-even is the cost of the contact divided by the margin on the outcome, which is not zero, and with a discount-bearing offer it is nowhere near zero. Uplift Modeling in Practice works through what that threshold does to a program.

The effect itself is negative. Some people convert unless you interrupt them, and a message reminds a settled customer that they are paying for something. Prediction Is Not Persuasion covers why a propensity model puts these people at the top of its list.

It spends a budget that something better needed. This one is different in kind, because the contact can be profitable on its own terms and still be the wrong decision. A person has a finite tolerance for being contacted, and the campaign that gets there first spends it.

What the third one looks like

-250 -200 -150 -100 -50 0 50 100 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100% Net value, $ thousands Net value, 0%: 0.0k Net value, 5%: 25.8k Net value, 10%: 49.8k Net value, 15%: 71.7k Net value, 20%: 78.0k Net value, 25%: 75.5k Net value, 30%: 71.8k Net value, 35%: 67.4k Net value, 40%: 62.3k Net value, 45%: 56.1k Net value, 50%: 49.1k Net value, 55%: 39.6k Net value, 60%: 22.1k Net value, 65%: -0.4k Net value, 70%: -25.6k Net value, 75%: -52.1k Net value, 80%: -80.2k Net value, 85%: -109.7k Net value, 90%: -149.9k Net value, 95%: -196.2k Net value, 100%: -250.0k Net value Share of the audience contacted, best prospects first
Show the data
Share contacted Net value
0% 0.0k
5% 25.8k
10% 49.8k
15% 71.7k
20% 78.0k
25% 75.5k
30% 71.8k
35% 67.4k
40% 62.3k
45% 56.1k
50% 49.1k
55% 39.6k
60% 22.1k
65% -0.4k
70% -25.6k
75% -52.1k
80% -80.2k
85% -109.7k
90% -149.9k
95% -196.2k
100% -250.0k
One retention offer, 108,000 subscribers ranked by their true effect, contacted from the most persuadable down. Value peaks at 17% of the audience and turns negative around two thirds. Running it on everyone is $329,553 worse than stopping at the peak. Simulated data · scripts/uplift_validation.py

The offer works. Sent to the right 17% it produces $79,554. Sent to everybody it loses $249,999, and the gap between those two decisions is $329,553 on one campaign.

Almost all of that gap is made of contacts nobody would defend individually. Each one looked reasonable. The person was eligible, the offer was relevant, the model gave them a positive score. They were worth less than the cost of reaching them, and there was no step in the process where that comparison happened.

Fatigue is a budget you are always spending

The cost of a message is not the cost of sending it.

Every contact draws down two things that replenish slowly. Attention, which shows up as declining response rates to everything you send afterwards. And permission, which shows up as unsubscribes, complaints, and the quieter version where a mailbox provider starts filtering you on the strength of how little anyone engages.

Unsubscribes are the visible part and the smaller part. The expensive part is the person who stays subscribed and stops reading, because they remain in every audience count, keep receiving campaigns, and contribute nothing while making the next campaign’s deliverability slightly worse.

That cost lands on future campaigns rather than the one that caused it, so it appears in nobody’s post-campaign report. A program whose accounting stops at the campaign boundary will systematically over-contact, and it will do so while every individual campaign looks fine.

The organizational asymmetry

Nobody is promoted for the campaign they did not run.

Everything about how marketing work gets planned, staffed, and reviewed assumes an artifact. A campaign has a brief, a creative, a launch date, and a readout. A decision not to contact a segment has none of those, so even a team that agrees with everything above will drift toward acting, because the incentive gradient points that way and nothing pushes back.

The fix is not exhortation. It is to make the null action produce an artifact like any other. Score it, log it as a decision, and give the persistent holdout a named owner who reports what it is worth. A number that appears in a readout every quarter is the only form of argument that survives a planning meeting.

You cannot learn what you never do

There is a version of this that compounds.

A system that treats no-action as what happens when no campaign qualifies never records a decision to leave someone alone. It therefore accumulates no evidence about those people, so the next model is trained only on the population that was contacted, and it can never discover that a segment it stopped contacting would have been fine.

Scoring the null action explicitly and logging it is what breaks that. Next-Best-Action Policy is where the scoring belongs and Exposure and Decision Logging is where the record lands. Both exist partly to make doing nothing something the system can get better at.

Context

Best suited for

Programs contacting the same people repeatedly, where several campaigns compete for one audience and the cost of a contact includes anything beyond the send.

Data requirements

  • Uplift estimates, or at minimum a randomized holdout showing the effect is not uniform across the audience
  • A cost per contact that includes the offer, not only the delivery
  • Contact history, so fatigue is a measured quantity rather than an assumption
  • A persistent holdout, which is the only thing that prices doing nothing at the program level

What changes by context

Lifecycle-led
Contacts are cheap and frequent, so the binding cost is fatigue rather than send price. The curve still peaks below full coverage, and the decline is slower and longer, which makes it easier to ignore and no less expensive.
B2C subscription
Discount-bearing retention offers make the cost term large and the peak early. This is the setting where the gap between the best policy and contacting everyone is largest, and where sleeping dogs do the most damage.
B2C ecommerce
Fast cadence and short consideration windows mean the same person can be contacted about the same thing several times a week. The no-action option often loses to a cooldown rule, which is a blunter version of the same idea and much easier to ship.

When it breaks down

  • Free contacts with no fatigue cost, where the curve is flat past the peak and the decision hardly matters.
  • Populations with a uniform effect, where there is no ordering to exploit and the choice is all or none.
  • Service and transactional messages, which are obligations rather than decisions and do not belong on this curve at all.
  • Programs with no holdout, where the curve cannot be estimated and the argument stays theoretical.

What this does not establish

  • That the peak sits at a fifth of the audience in general. It sits where uplift falls to cost over margin, which depends on your offer, your margin, and how concentrated persuadability is in your population.
  • That contacting everyone always loses money. It loses money here because this offer has a real unit cost and the average effect is below break-even. A free message to a population with uniformly positive uplift has no such peak.
  • That fatigue costs what this implies. No number here measures fatigue. It is argued for rather than estimated, and estimating it needs a holdout that varies contact frequency rather than contact itself.
  • That the ranking used here is available in practice. The curve is drawn with the true effects, which exist only because the data is simulated. A real program orders by an estimate, and the estimate is wrong in ways that flatten the curve.

What to test next

The cheapest version of this argument is a frequency test rather than a holdout. Take one lifecycle program, cut contact frequency by half for a random slice, and measure both conversions and downstream engagement for a quarter. If the halved group converts about the same and engages more, you have priced fatigue on your own population, which is the number this lesson had to argue for rather than show.

The more complete version is a persistent holdout with a named owner, described in the assignment and experiment registry. It is the only instrument that prices doing nothing across the whole program rather than one campaign at a time.

Where this curve came from Code

The same simulated retention program as the uplift modeling lesson: 240,000 subscribers, an offer costing $5 against $85 of margin on a retention, so break-even sits at 5.9 points of uplift.

The curve ranks people by their true effect and accumulates, which is the best ordering any policy could achieve. That makes it an upper bound rather than a forecast: a real policy orders by an estimate and does worse. The peak is computed on the underlying groups and the plotted line is sampled at even intervals, since a line chart spaces its points evenly and the groups are not the same size.