
Hey all, happy Friday,
Saturday was the big rainstorm in New York, and our plan to see Maddie's brother in Jersey City did not survive it. There was no world in which we were driving. So we spent the entire day in the apartment with James, who is now fully walking and therefore fully patrolling, and the day became bike laps up and down the hallway, every game and book we own, and a strategic amount of Elmo. He repaid us with a three-and-a-half-hour nap, which in this household is a winning lottery ticket.
We also baked chocolate chip cookies. He loved the dough, obviously, and I'll just say it: cookie dough is so good. I'd forgotten. I texted my family a photo of us mid-bake, and my mom's first response was "make sure he doesn't eat too much cookie dough." I relayed the message directly. "James, Yaya says you can't eat too much cookie dough." He understood completely, as he took down a spoonful, because he is one and a half.
The cookies have since become currency. Get through dinner without flipping your plate upside down, earn a cookie. Last night he was mid-reach to drop something off the high chair, paused, and told himself "no." Cookie earned. I asked him for a bite and got five nos in a row, so the sweet tooth is confirmed, and it is his mother's.
Sunday we watched the World Cup final at a beer bar in the neighborhood with friends and their newborn, who was perfectly behaved, though the bar was graded on a different curve. We brought James’ own soccer ball, which I bought at MetLife, but that didn’t help, as he spent the match trying to walk over and stand directly in front of the outdoor projector. So I experienced the final in fifteen-second increments between retrievals. Relatively speaking, as always, he was pretty good.
Ball update, because there is always a ball update: James has inherited Linus's puppy-era balls, the little ones, and this week I made the fatal mistake of taking them both to the park with one ball between them. I took James's ball to throw for Linus, and James fell apart. I gave it back, and Linus fell apart. I genuinely can no longer tell whether we’re raising James like a dog or Linus like a person, and I suspect the answer is unflattering to me either way. So now every morning I carry two balls, one per species. Linus plays fetch. James holds his and provides commentary, which is mostly "ball ball ball."
Two more things. Maddie and I finished Your Friends & Neighbors, and the episode around the father's death, the one at his parents' house, is some of the best TV I've seen this year. In the interest of the radical transparency this newsletter is allegedly known for, I'd had a low-dose THC drink (Delta) beforehand, so Maddie also received a live commentary track of "this is one shot. this is ALL one shot." Great show.
This weekend we're at the Newport Folk Festival, which is somehow one of the most kid-friendly events in live music; they genuinely encourage you to bring your kids. I have been to a great many Phish shows. Nobody is encouraging about bringing in a baby wook to those. So we're debating giving James his first festival, and if he's good, a lobster roll. The reward system scales.
Anyway,
Keep the high chair in mind, because James stopping himself mid-drop is the whole issue in one image: the game is catching the thing before it hits the floor. (lol sorry, brutal).
This is part four, and it's the one where the system I've been building with you all month finally admits its flaw.
The last three issues all share one assumption, and I never said it out loud because I hadn't noticed I was making it: once you find a winner, it stays found. The dashboard tags it, the matrix colors it green, you brief more like it, everyone moves on. I then taught that assumption to all of you, with diagrams.
Winners don't stay found. Every ad you will ever run is dying from the day it launches, some in three weeks, some in a year, and the tools we built in the last three issues are structurally incapable of noticing. Not because the model is dumb. Because of where the death hides: inside an average.
(Quick catch-up if you're joining late: issue one graded every ad you've ever run by persona, angle, and emotion. Issue two ranked the ones you never have, using Reddit. Issue three packaged both into two paste-ready prompts and taught the copy method. Start here if you're missing any of that, because today's prompt reads the dashboard from issue three.)
The first thing the monitor did when I turned it on was flag one of the messages our dashboard was still recommending we build on. Every lifetime number said winner. The last ninety days said otherwise. About a week before, I had referenced that exact message in a client call as a pillar of the account, with the confidence of a man citing a dashboard. The full autopsy is below, because how the monitor knew is the entire issue. Then you get the prompt.
A quiet death
Here's how an ad dies in your account, in practice.
It launches, it finds its audience, and somewhere in there it has a prime: its best sustained week, the stretch where the CTR is high, the CPM is friendly, and the KPI makes you look smart in a client call. Then, slowly, the people most likely to love it have all seen it. CTR drifts down. The auction notices fewer people are clicking and starts charging you more for the same eyeballs. The KPI holds for a while on momentum and retargeting, then sags.
And your dashboard notices none of it, because your dashboard, my dashboard, the one I taught you to build two issues ago, looks at totals. An ad that crushed for five months and has been quietly bleeding for six weeks still averages out to a hero. A lifetime number is a museum plaque. It tells you what the ad did, and says absolutely nothing about whether anyone's still living in the building.
So the fix is one idea, and everything else in this issue is plumbing: stop comparing ads to the account average, and start comparing every ad to its own prime. Not "is this ad good," but "is this ad still the ad it was at its best." Different question. The second one is the one that catches death early.

The three tells, in the order they fire
When an ad starts dying, the numbers confess in a fixed order, and the order is the useful part.
The audience knows first: CTR decay. Your trailing week's CTR versus the CTR of the ad's prime week. The people seeing the ad got bored before anything else in your account can possibly know, because boredom is the actual disease and everything downstream is symptoms. This is the earliest tell and it gets the biggest weight.
The auction knows second: CPM rising, net of your account. Meta charges more to show a tired ad (the auction has no sentimentality, which is the most honest thing about it). But raw CPM is a liar with seasons, so the monitor divides the ad's CPM move by the whole account's CPM move over the same dates. If everything you run got 30% more expensive this month, that's the auction, or Q4, or a competitor with fresh funding. That's weather. Fatigue is when THIS ad got more expensive while the account didn't.
Your KPI knows last. ROAS sag or CPA creep versus prime. By the time this one fires you've already paid tuition. It's the confirmation, not the warning, though it still carries nearly as much weight as CTR in the blend, because late is not the same as wrong: the KPI is the least noisy of the three, it just can't lead. It is also the only one of the three I actually watched for the first eight years of my career, which means I was reading the invoice and calling it an early-warning system.
The sharp-eyed will notice frequency isn't in there, and that's deliberate. Frequency is exposure, not response. It tells you they've seen the ad, not that they've stopped caring, and a tight niche audience can live at a frequency that would scream fatigue on a broad one. So it rides along as corroboration, never as evidence. The three tells above are the audience actually voting.
Blend the three into one score per ad, stage it like a diagnosis (fresh, watch, fatiguing, fatigued), and put guardrails on it so it doesn't cry wolf: an ad has to be at least three weeks old and carrying real spend this week before it's allowed to have an opinion. Too young or too small isn't "fine," it's "no verdict," and a monitor that guesses is worse than no monitor.
And so you don't have to take the fixed order on faith: we backtested it. I had the monitor replay our own accounts' history week by week, no peeking ahead, and checked every flag against what actually happened next: real sustained decline, or false alarm.
Across two accounts and a year of replays, the composite fired a median of five days before the sustained decline set in, and the earliest catch on a slow bleed was over seven weeks ahead of the KPI. It also cried wolf, instructively: the first version flagged half the account every time the auction got seasonally expensive, which is exactly where the net-of-account CPM math came from. Same story with the signal weights in the prompt below. Nobody handed them down. They're tuned on that replay, adjusted until the false-alarm rate stopped embarrassing me.

The autopsy
So, the dead winner from the top of the issue, on the table. Same protein brand you've been following all month, name withheld as always, and the vein was the account's oldest reliable message: the gut-health persona (issue-one readers have met her, she was the best buyer in that whole story) crossed with an ingredient-transparency angle. The pairing that built the account. Lifetime numbers: comfortably above target, more history behind it than anything else we'd run.
The monitor's read, everything against its own prime: trailing CTR down 41 percent from the prime week. CPM up 17 percent while the account's own CPM moved about 2 percent over the same dates, so the rise was real, not weather. And the KPI had finally begun to sag too, months after the CTR started whispering. Composite deep in the fatigued band.
Then the verdict, which is the part that stung. Not ad wear. Every execution in the vein was sliding together. Saturation. The audience that built this account is done being told this particular thing, and my first honest reaction was that the monitor was broken, so I pulled the weekly numbers by hand. It wasn't broken. The evidence of the vein's prime and the evidence of its death were about eight months apart, which is exactly why no lifetime view, and no human eyeballing last month, could ever see both at once.
The isolation made it useful instead of just sad: the persona still performed fine in her other angles. The angle was decaying in every persona it touched. So the brief wrote itself in one sentence: keep her, retire the argument, say something new to the same woman. I'd have bet money it was the persona that was worn, and I'd have been wrong in the most expensive possible direction, retiring our best audience instead of a tired argument.
Tired ad, or spent message?
That verdict layer is the part I haven't seen anyone else do, which either means it's genuinely new or everyone else found a flaw I haven't hit yet. Either way, it's what turns the monitor from a smoke alarm into a diagnosis.
"It's fatigued" is not an instruction. The instruction depends on a question the score alone can't answer: is the ad tired, or is the message spent? Those are different deaths with different funerals, and if you mix them up you waste a month.
The monitor answers it by looking at the ad's family. Remember the dashboard's persona-by-angle matrix: every cell is a vein, a persona times an angle, usually with several ads mining it. So when one ad starts decaying, look at its siblings in the same vein:
The ad decays while its vein holds: AD WEAR. The message is fine, this execution is worn out. People got tired of the picture, not the point. That's a reskin, the cheapest move in creative: same message, new clothes. Last issue's dashboard sorted your spend into iterate, reskin, and rethink. This is the monitor telling you reskin, and telling you now, while the vein still has heat.
The whole vein decays together: VEIN SATURATION. Every execution of the message is sliding at once, which means the audience isn't tired of an ad, they're done being told this particular thing. No reskin will save it, and I can tell you where the month goes when you get this wrong, because I have personally spent it: re-dressing a message the audience had already finished hearing, then billing for the re-dressing, then concluding, ad by ad, that "creative is fatiguing" as if it's weather. It's not weather. The message is spent, and the move is to evolve the angle, not the outfit.
One honest edge case: a vein with only one ad in it can't be split this way, so the monitor judges it at ad level and says so. On a real account that's more common than you'd think, most matrices have a long tail of cells with one lonely ad in them. No pretending.
(That's also the thumbnail, if you were wondering: me as a cartoon doctor doing rounds on a sweating ad, stethoscope out, clipboard chart pointing the wrong way. The ice pack is not going to save it.)

Which half actually died
Saturation has one more layer, and it's the one that hands you next week's brief.
A vein is two variables, persona times angle. When the vein saturates, one of them is usually the culprit, and you can isolate it: score the persona across ALL its angles, and the angle across ALL its personas, the same three-tell math on each aggregate. Four outcomes, and every one of them is a different Monday:
The persona is fatiguing everywhere, the angle still performs elsewhere. Swap the persona, keep the angle. You haven't run out of message, you've run out of this audience's patience. (no, there's no metric for patience, I checked)
The angle is fatiguing everywhere, the persona still responds elsewhere. Swap the angle, keep the persona. The audience is fine, they're just done with this argument.
Both are spent. Recombination won't save you, this calls for net-new territory. Which, conveniently, is exactly what the issue-two Reddit scrape is for. The monitor tells you when to go back to that well.
Neither is spent on its own. Then it's this specific combination that's worn, and the move is to pair each half with something new. The halves are fine. The marriage wasn't.
The autopsy above was the second Monday. You already know which one I bet on. That's the point of running the isolation instead of trusting your gut: the gut has favorites. The math doesn't.
This is the difference between "creative fatigue" as a vibe and creative fatigue as a diagnosis. A vibe gets discussed in a meeting. A diagnosis gets briefed by Thursday.

The prompt
Paste this into Claude with the Meta connector on (setup is in last issue: one URL, no keys), in the same folder as the dashboard it built. It runs the whole exam and hands you a ranked briefing. Run it weekly. It's a check-up, not a project. (Ours runs Monday mornings, which is exactly the wrong day to learn a hero died, and I run it anyway.)
You are my creative performance analyst. My creative strategy dashboard
is the index.html in this folder: every ad I run, tagged by persona,
angle, and format. Your job is a WEEKLY FATIGUE CHECK: find what is
wearing out BEFORE the spend notices, and tell me whether the ad is
tired or the message is spent. Use the Meta Ads connector for fresh
data. Never invent a number. Ask me ONE question total (Phase 1).
PHASE 1 - SCOPE
1. List my ad accounts and confirm which one to use. Read my KPI (ROAS
or CPA) and target from the dashboard. That is the one question.
PHASE 2 - PULL DAILY HISTORY (autonomous)
2. For every ad with meaningful spend in the last 30 days (default
$100+, scaled to my account), pull DAILY rows for the last 120 days:
spend, impressions, link clicks, purchases, purchase value. Daily,
not lifetime. Lifetime numbers are where the death hides.
- Parse formatted strings ("$1,204.18", "1.78%") to real numbers
before any math.
- If a call errors, halve the batch and retry; merge partials.
- Report what pulled and what failed. Never fill a gap with a guess.
PHASE 3 - FIND EACH AD'S PRIME (autonomous)
3. For each ad, slide a 7-day window across its history and find its
PRIME: its best sustained week at real spend (at least $150 in the
window; best ROAS week, or cheapest CPA week if CPA is my KPI).
Every ad is judged against its own prime, never the account average.
4. Gates: skip any ad younger than 21 days, or under $150 spend in the
trailing 7 days. Report those as "no verdict", not "fine". A monitor
that guesses is worse than no monitor.
PHASE 4 - SCORE THE THREE TELLS (autonomous)
5. Compare the trailing 7 days to the prime. Three signals, weighted:
- CTR DECAY, weight 40: trailing CTR vs prime CTR. The audience is
always the first to know.
- NET CPM RISE, weight 25: the ad's CPM move DIVIDED BY the whole
account's CPM move across the same dates. If everything got more
expensive, that is the season, not fatigue. Only the net counts.
- OUTCOME DECAY, weight 35: ROAS sag or CPA creep vs prime. This is
confirmation, not early warning; that is why it is not the
biggest weight.
Blend to a 0-100 score per ad. Stages: under 25 FRESH, 25+ WATCH,
45+ FATIGUING, 70+ FATIGUED.
PHASE 5 - TIRED AD OR SPENT MESSAGE? (autonomous)
6. Group ads into veins by persona x angle using my dashboard's tags.
Sum each vein's members into one daily series and score the vein
with the same method. Verdicts:
- AD WEAR: the ad decays while its vein holds. The execution is
worn, the message is fine. Recommend a reskin.
- VEIN SATURATION: the whole vein decays together. No reskin will
save it. The message must evolve.
Use the scores for the verdict: AD WEAR when the ad is 45+ and its
vein stays under 25. VEIN SATURATION when the vein itself is 45+.
In between, call it MIXED and say which way it leans.
A vein with one ad cannot be split; judge it at ad level and say so.
7. For each saturated vein, isolate the variable. Score the persona
aggregated across ALL its angles, and the angle across ALL its
personas. Then:
- Persona fatiguing everywhere, angle fine elsewhere: swap the
persona, keep the angle.
- Angle fatiguing everywhere, persona fine elsewhere: swap the
angle, keep the persona.
- Both spent: recommend net-new territory, not recombination.
- Neither spent alone: this combination is worn. Pair each half
with something new.
PHASE 6 - REPORT (the deliverable)
8. Add a "Fatigue" section to the TOP of my dashboard HTML, same file,
same style, worst first. Each flagged ad or vein gets: the exact
movements (CTR a to b, CPM a to b, KPI a to b, with prime-week
dates), its stage, its verdict, and the single recommended move in
one sentence. Re-serve the file and give me the URL.
9. RANKING RULES, so this report does not hand me the same list every
week:
- Confidence decays with age. Weight each vein's spend by
0.5^(days old / 120), so a giant from last winter carries about
the pull of a modest current performer, instead of permanently
topping the list on accumulated mass.
- Current form beats career stats. Where a vein has real spend in
the last 90 days, judge it about 60% on that and 40% on lifetime.
- Rotation. If I say I already briefed a fix for something, demote
it to "briefed, awaiting verdict" instead of recommending it
again. Move on to the next idea.
10. End with exactly three sentences: the one refresh to brief this
week, the one message to evolve, and the one winner to leave alone.Three things in there earned their place the hard way. The net-of-account CPM math is what stops the monitor from screaming every time the whole auction gets expensive, which it does, seasonally, like clockwork. The gates are what stop it from diagnosing a four-day-old ad with a cold. The stage cutoffs came off the same replay as the weights, so nobody's vibes were consulted. And phase 6's ranking rules exist because of what happened the first week I ran this without them, which deserves its own section.
What this won't do
Honest limits, as always.
It needs history to work. Three weeks of life and real weekly spend per ad, or it stays silent, and on a small account it will stay mostly silent. That silence is a feature. The version of this that guesses on four days of data is a random-number generator with a dashboard.
The seasonality filter is account-level, not category-level. If the auction spikes for your whole niche but your account's mix hides it, some of that can still read as fatigue. Before you kill a winner in the middle of November, look at a calendar.
It diagnoses, it doesn't prophesy. "Swap the persona" tells you which half is worn, not that the replacement will hit. The replacement is a forward bet. Issue one said the forward bet is still the human job, and annoyingly, that keeps holding.
Attribution lag can make the outcome signal jumpy on short windows. Purchases wander in days after the click, so the KPI is permanently describing last week. That's part of why the KPI is the confirmation signal and not the alarm. The attention metrics don't lag. Trust the order.
And the standing caveat: the MCP is great at this weekly-check-in scale and times out on huge pulls. The 24-month production version runs on the API. Yes, I know, I keep promising that issue. It's coming.
TLDR
The system from the last three issues has a blind spot: it grades winners on lifetime numbers, and a lifetime average will call an ad a hero months after it's rolled over. Compare every ad to its own prime instead. Catch up here if you're new; today's prompt reads the dashboard from issue three.
Fatigue confesses in a fixed order: CTR decays first (the audience got bored), CPM rises net of the account second (the auction noticed), the KPI sags last (the invoice noticed). Weight the early tells, gate out young and small ads. Backtested by replaying our own accounts week by week: it flags a median of five days before the sustained decline, and weeks ahead on the slow bleeds.
The score alone isn't the diagnosis. Ad wear (the ad decays, its persona-x-angle vein holds) means reskin. Vein saturation (the whole vein slides together) means the message is spent and no reskin will save it. Our autopsy: the account's oldest winning message, saturated, caught with the persona still healthy and the angle dead in every pairing. Keep her, retire the argument.
Saturation isolates further: score the persona across all its angles and the angle across all its personas. Swap the worn half, keep the working one, go net-new when both are spent (that's the issue-two scrape's job), or retire just the combination.
Keep the memory long but decay its authority: half-life on old evidence, current form over career stats, and rotate any bet you've already briefed. Otherwise the report nags you with the same list every week and you stop reading it.
The full paste-ready prompt is above. It appends a Fatigue section to your dashboard and ends with three sentences: what to refresh, what to evolve, what to leave alone.
Reply and tell me about your account's zombie: the ad everyone knows is past its prime that nobody's allowed to turn off. Every account has one, usually with a founder attached. I'm collecting these, and between the untested angles, the weird subreddits, and now the zombies, you people are building me a genuinely unhinged dataset.
Have a great weekend,
Will
P.S. If you're at Newport Folk this weekend and see a man carrying a lobster roll, a toddler, and two balls of very different sizes, that's us, come say hi. The little ball is not the dog's. We've been over this. Many times.