Issue #187 | Let’s Talk About Ad Fatigue

It’s almost October. If you work in paid media, that means t-minus 6 weeks until your Meta CPMs take their annual pilgrimage to Mt. Everest (aka spike around Black Friday / Cyber Monday), with your CPAs following them on their meteoric rise. And, like clockwork, there will be a few thousand X posts about “creative fatigue”, while client/agency Slack channels are filled with some variant of: “The creative is fatiguing” or (worse) “We need some FRESH creative.”
It’s the paid social equivalent of a doctor telling you it’s probably a virus. It describes the symptom, it sounds clinical and it (almost always) ends the conversation (and doctors wonder why trust in them is down ~40% since COVID. I digress). What this doesn’t do is tell you what’s actually wrong. The standard treatment (pause what’s running, launch new creative) is the correct remedy for 1 of the 3 things that are bundled up in “fatigue” – but ineffective for the second and downright harmful for the 3rd.
If you were to ask 5 media buyers to define ad fatigue, you’ll get some version of “performance drops because people have seen the ad too many times” (I know because I did it):
Follow up with a question on how they’d confirm that’s what happened (vs. anything else that raises a CPA) and the most common answer is a frequency value. And if you ask the really interesting question – how can you predict which ads are most likely to fatigue BEFORE it shows up in a CPA/CPM – almost none have an answer.
The reality is that all 3 of those questions have mathematical answers. You don’t need any fancy tools to figure it out – you just need a willingness to do some annoying work.
What’s In A CPA
At its most fundamental level, a CPA is the price of an impression divided by the probability that impression produces a conversion. So a CPA can only rise for 2 reasons: impressions got more expensive, or impressions got less likely to convert. The second one splits in 2 (wear out + depletion), which is how you end up with the 3 possible causes referenced above:
Auction pressure is the price side. More advertisers bid for the same inventory (e.g. BFCM), which means the cost of showing your ad goes up. The ad didn’t change. Nobody in your audience changed. You’re just paying more for the same thing, the same way you do for a flight the day before Thanksgiving. That’s how supply + demand works – there is a (mostly) fixed supply of available ad impressions (I’m massively simplifying a wildly complex ecosystem), and there’s a lot more advertisers with a lot more dollars all competing for that supply. End result? Price goes up.
Wear-out is the version everyone imagines: all things being equal, the same person responds at a lower rate to the 12th exposure relative to the 1st. Mathematically, the relationship isn’t linear; if you graph ad response vs. exposures, it looks more like a hill than a slope (i.e. between 1 exposure + 12 exposures) that maximizes action probability; beyond that, performance decays with each successive exposure. This is what’s meant by “fatigue” – there’s plenty of psychological + marketing research that shows people eventually get tired of seeing the same ad over and over again.
Depletion is the cause that is wildly under-discussed (at least in my little corner of the marketing universe). The platform delivers first to the people it thinks are most likely to convert. Once it’s found those people, each additional impression is served to someone who’s either (a) already seen the ad or (b) has a lower expected conversion probability (i.e. is less likely to care about whatever it is you’re selling).
The most common response to this (at least, in my experience) is something along the lines of, “This is semantics, so what, performance fell, make more ads dummy.” The reality is that new creative is the answer to exactly 1 of these. A fresh execution of the same angle solves wear-out. It doesn’t address depletion (it’s being shown to the same pool of people) and it does zilch for auction pressure (you launching a new ad doesn’t make your competitors spend any more or any less, nor does it make more eyeballs magically arrive on IG).
The Math Behind Depletion
Let’s start with depletion (the one everyone ignores) because it explains most of what gets called fatigue AND it doesn’t require assumptions about psychology or buyer behavior (most of which I think are legitimate, but reasonable people can disagree).
When I was very early in my career, I was friends with an incredible real estate salesperson. He could sell ice to Alaskans. I still don’t know how he did it, but watching him work was the sales equivalent of watching Monet paint. One of the things he always told 22-year-old me was “Every customer has a currency”
That’s true for marketing, too. Every offer/angle has an effective pool of people who will actually respond to that specific message. Call it P. It is not the audience size in your targeting, which is a much larger (and much less useful) number. Any impression lands on a given person in that pool with probability 1/P. After I impressions, the probability that person still hasn’t seen the ad is (1 − 1/P)^I, which for any pool large enough to advertise to is e^(−I/P). Multiply by P, subtract from P, and you have reach (if you didn’t follow the math, just true me on this one):
Reach = P × (1 − e^(−I/P))
It also gives you a number that matters more than reach. The next impression lands on someone new with exactly the probability that a random person in the pool hasn’t been reached yet – so the share of your next impression going to new people is:
n = 1 − (reach / P)
What’s missing here is the response rate. A new person converts at your launch rate. Someone who’s already seen the ad converts at some fraction of that, which we’ll term λ. We already know (based on the definitions above) that the probability the next impression is new = n, which means the probability it is repeat = (1 − n), so:
Marginal CPA ÷ launch CPA = 1 ÷ [n + λ(1 − n)]
At λ = 0.25 (aka a repeat view converts a 25% as well as a first view):
Read the frequency column, then the CPA column. At an average frequency of 2.3 (which, honestly, most Meta advertisers would barely even think about), 86% of the total audience has already seen the ad & the next conversion costs 2.84x what the first ones did. But at a frequency of 2.3, there’s nowhere near enough exposure for a critical mass of users to get tired of your ad (if we’re all being honest, most probably don’t even remember it). The platform is spending most of your money on people it has already reached.
The 25% is an assumption, and the magnitude depends on it. The direction doesn’t. At 10%, that same row is 4.5x launch CPA. At 50% (generous for almost any direct-response ad) still 1.76x. There’s no plausible value of λ at which a frequency of 2.3 is free.
The clearest illustration of this is to convert it from a multiplier on CPA to a “Cost per 1,000 new People Reached” – which = CPM ÷ n. At a 14% new-reach share, a $12 CPM is an $86 CPM for anyone who hasn’t already seen your ad. That’s the price you’re actually paying for growth. If you actually calculate this on your Meta account, you’ll likely find growth is also experiencing inflation.
The Problem of Uneven Delivery
Everything above assumes the platform spreads impressions evenly across the pool – which we know it doesn’t (that’s the entire logic behind smart bidding / automated bidding / AI-powered bidding). If you’ve ever pulled a frequency distribution you already know this; Meta serves the same high-propensity users over and over before it broadens.
The good news is (well, at least for those of you who love math) we have a model for uneven exposure: the negative binomial. This is the distribution Ehrenberg used for repeat buying, and the same one most media planners have used for decades:
Reach = P × [1 − (1 + I/kP)^(−k)]
k controls how concentrated delivery is. As k increases, it converges to the even case above; as k approaches 0, the same people keep getting hit. If you chart out the frequency based on an assumption of impressions = 2x pool, with different values of k:
With concentrated delivery, a 33%-50% of the pool still hasn’t seen the ad – and a smaller share of impressions goes to new people than in the even case. Somebody on the account will look at 67% reach and conclude there’s plenty of room left. There is. Meta is just fundamentally disinterested in allowing you to serve ads to it.
This is why avg frequency is the wrong metric to monitor for fatigue. It’s an average over the people you’ve already reached, so it barely moves while new-reach share falls through the floor. A frequency threshold of 3 means one thing on a 40,000-person pool and something completely different on a 4-million-person pool.
Predicting Ad Fatigue
In the even case, n falls in a straight line against cumulative reach and reaches 0 at P. So you can estimate P (and from P, the date) with data already sitting in Ads Manager.
Pull an ad’s lifetime reach and impressions every 3 days. For each window, divide new reach gained by impressions served; that’s n for the window. Plot n against cumulative reach, fit a line, and read off where it crosses zero.
Say an ad has reached 40,000 people and 75% of its recent impressions went to new people. A few days later it’s at 80,000 and n is down to 50%. Losing 25 points per 40,000 net new reach means P = 160,000. Invert the reach formula to find the impression count at which n falls to whatever floor you care about (n*):
*I = P × ln(1 ÷ n)*
At a 20% floor, that’s 160,000 × ln(5) ≈ 257,000 impressions. The ad has served about 111,000 to reach its first 80,000 people, so there are roughly 146,000 left. At 15,000 impressions a day, you hit the floor in about 10 days, with marginal CPA at 2.5x launch. You can calculate this a week (or more) before it ever shows up, just with some (not so) simple math.
The same checkpoints allow you to calculate λ. Conversions per 1,000 impressions in each window should equal c × [λ + (1 − λ) × n], where c is the launch rate – a straight line in n. Regress one on the other and λ = intercept ÷ (intercept + slope). If the 75% window converted at 1.3 per 1,000 and the 50% window at 1.0, the slope is 1.2, the intercept is 0.4, and λ = 0.25. You can automatically calculate this using custom metrics in Meta Ads manager. If λ is declining, then you know the root cause is actual ad fatigue. You’re welcome.
You might read that and think you’ll just run it on Monday – and on most accounts, you’d be kidding yourself. The pool estimate runs on reach counts in the tens of thousands, so it works almost anywhere. The λ regression runs on conversions, and (per The Tampering Tax), the smallest difference you can resolve is approx. 4 ÷ √N. Telling 1.0 from 1.3 is a 30% difference, which takes roughly 180 conversions per window. Below that, λ is a guesstimate (but again, guesses can be fine, especially since the goal of all of this is to make more money, not get published in whatever Science of Marketing magazine exists).
Before we close this out, there are 3 other things to be aware of:
- #1: new prospects reached on day 20 are – all things being equal – worse prospects than the ones you reached on day 2, which drags the late windows down and biases λ low, so treat this estimate as a floor
- #2: concentrated delivery bends the n line downward, so a straight-line fit lands short of the true pool (which is the number you want anyway) since it’s the part of the pool the platform will actually reach at your spend
- #3: on Meta, reach is modeled, not counted; on Advantage+ the pool drifts as the system expands into lower-propensity users. Use at least 4 checkpoints to ensure you have the right shape of the curve
Which One Do You Actually Have?
Check in order of cost. Auction first, because ruling it out takes 5 minutes and it’s the one Q4 hands you by default.
1. Auction pressure. CPA = CPM / [conversions per 1,000 impressions], so the log of any CPA change can be decomposed into a price term and a response term:
ln(CPA₂ ÷ CPA₁) = ln(CPM₂ ÷ CPM₁) − ln(CVR₂ ÷ CVR₁).
Thus, if your CPA is up 40% with CPM up 25%, it means ln(1.25) ÷ ln(1.40) = 66% of the increase is price, before creative enters the conversation. You can confirm that against your newest ads: if something launched this week carries the same CPM inflation as something launched ~60 days ago, the auction has shifted (not your audience). The right response in that situation is budget + bidding changes (a cost cap holds its line where a volume-maximizing bid follows the price wherever it goes).
2. Depletion. This can be diagnosed by three conditions being met: (1) new-reach share falling; (2) cost per 1,000 new people rising; (3) λ holding steady. In this situation, the proper response isn’t more ads; it’s a net-new offer/angle. Why? Because a different message makes a different group of people care. A new execution of the same angle is still being shown to the same 160k people. The only way to make P bigger is to give someone new a reason to pay attention, which is exactly what Meta means when it says creative does the targeting.
3. Wear-out. Diagnose true “Fatigue” by (1) λ falling across successive windows while (2) new-reach share holds up. This is the only case where “refresh the creative” is the right remedy → use the same angle with a new hook / new format / new first 3 seconds.
The Right Refresh Policy
Most “solve the fatiguing ad” policies I see are calendars: rotate every 2 weeks or launch new ads every month or whatever. As far as I can tell (and as far as I’ve been told), those numbers are derived on vibes + X posts (which is a truly terrible way to do math).
Fortunately, we can do better. Every mechanism above runs on impressions relative to a pool, and converting impressions to days gives you:
Days to a given point on the curve = (u × P × CPM) ÷ (1,000 × daily spend)
where u is impressions ÷ pool. At a $12 CPM, a brand spending $1,500 a day into a 500,000-person pool reaches u = 2 – 14% new-reach share – in 8 days, and concludes its creative “fatigues fast.” Another brand spending $500/day against a pool of 2M gets to the same point in 96 days, but concludes well before then that its creative is evergreen. What’s ironic is the response curve for both brands is the same; one just has a 12x larger shelf life. Both brands will credit (or blame) the creative when they reach it, though.
If the first brand implements the standard “new ads every 2 weeks” rule, it’ll be too slow by almost a week. The brand is likely leaving 100s of thousands of dollars on the table because they’re not doing the math.
The second brand isn’t leaving money on the table; it’s actively incinerating it. By refreshing ads every 2 weeks, the brand has paid for 6 rounds of production nobody needed AND each new creative launch has (potentially) re-triggered learning for an ad that didn’t need it. They could have used those resources + time somewhere else (like spending more than $500/day on Meta).
The moral of the story: no one got tired of your ad. You ran out of people who hadn’t seen it – and the numbers that would have told you so 10 days early were sitting there in Ads Manager the whole time.
So, do the math.

