
Hey all, happy Friday,
It's been two weeks since the last issue, and I know you've all been waiting with bated breath.
One business note first, and I'll keep it short. I'm opening 3 consulting spots for September (maybe 4, depending on how much of my ambition survived Provence).
The last time I did this, they were filled in two days
TLDR [you can also find more info on the website here] I work directly with you or your team to stand up the kind of system this series keeps describing, in your account, with your brand/s
I'm telling you now because the creative system gets built in September and October, not November, when CPMs are already climbing. If you want to be pumping out content by then instead of still learning how, now is the time to learn
Reply to this email with "September" or shoot an email to [email protected]
We took James to France for the better part of two weeks: nuclear family in Paris first, then Provence with Maddie's parents, and then back to nuclear in Paris.
There is too much content for one preamble, so here’s the highlight reel:
The flights: bc that’s the first thing everyone asks, he was very, very good on both legs. We got one of those inflatable bed contraptions for the seat, and it worked so well I want to write it a review. A year and a half old on an eight-hour flight, twice, and he got high marks from basically everyone seated around us. The only real incident was Chip Gate, in which James shook a full bag of (truffle-flavored, lol) chips as if it were his first time opening a champagne bottle, and the fungi-scented chips scattered all around us. Most everyone thought it was pretty funny, and we were very apologetic, but one gentleman (it feels like a disservice to gentleman to call him that) was deeply unhappy and threatened to post about it to his many Facebook followers. He goes on cruises and has quite the big following, just so you know.
So if you see a post going around about a baby on a Paris flight eating truffle chips, hit me up; that's my son.
Paris: we went to the public amusement park (Jardin d'Acclimatation), the kind where you pay a couple of euros at the gate. I spent half the visit thinking, imagine if New York had this (Mamdani, if you’re reading this, you know what to do). James adored the water portion of the park beyond reason, and while he fell short by 3cm on all of the rides, he could luckily ride the baby carousel. Many, many times.
Also in the park, we took him to a puppet show, which was (shockingly) entirely in French. He does not speak French (what?!). He has maybe forty words, and one of them is "puppy," which turned out to be load-bearing, because there was a puppy in the show. All the other kids laughed at the jokes, and James would just join in and laugh with them, a beat late, no idea what was going on, delighted anyway.
We also took him to the Calder exhibit (a 1.5 y/o at a museum?! WHAT! We are such evil parents), where his unambiguous favorite was Calder’s circus, with all of the little wire animals.
Provence: after a few days in Paris, we migrated to Provence to meet Maddie’s parents. Our day-to-day agenda was rather simple: town exploring every morning, pool in the afternoon. Rinse and repeat. And if it is not abundantly clear already, this kid is a fish. His new game consisted of him sitting on the edge of the pool, counting to three (a new feat!), and launching himself at Maddie or me.
For every town we explored, we also hit the respective playground. A few hits and a few misses there. He also ate French fries. Every. Single. Day. He is now addicted to deep-fried potatoes… and I can't argue with the logic.
His vocabulary roughly 5x’d over the two weeks.
Some current favorites: turtle, whale, and cookie, where cookie is less a word than a category, because anything sweet is now "cookie."
Fwiw: We also did a lot of adult stuff, but I’d rather not bore you chatting about ruins and markets.
Back to Paris, just for one anecdote: I just recalled one last scene from the amusement park, because it was a moment when Maddie and I have never laughed so hard. We got a big ice cream cone, didn't finish it, and Maddie tossed the ice cream part and handed James the empty cone, because he mostly wants the cone (he's less interested in the ice cream, which I'm choosing not to investigate).
A little French girl watched Maddie throw away perfectly good ice cream and looked at us like we'd killed her puppy. I have never seen a child so betrayed by strangers. She'll remember us forever.

People warn you that traveling with a kid that young is stressful, and parts of it are. But he was an absolute champ, and I'll be replaying a version of these two weeks for a long time. Also, Linus did the full-body wag-spin combo for a solid two minutes when we saw him, and we are fully back in the honeymoon phase with our favorite cattle dog.
Anyway 😮💨,
Keep the puppet show in mind.
Because that's what a swipe file is. You saw an ad, the room reacted, you hit save. Everyone else is laughing, so you laugh too, a beat late, in a language you don't speak. A folder full of ads you liked, organized by nothing, ranked by nothing, telling you nothing except that at some point you had feelings. The industry calls this a swipe file. It is actually a fan account.
This is part six, and it's about the version that decides things. My swipe file is about 5,800 statics, which is either a research system or a hoarding disorder with a taxonomy, and I've stopped asking which. It earns a place in the pipeline for reasons other than the count. It has three properties the saved-ads folder doesn't: every ad in it earned its spot with evidence, the whole thing is organized by format instead of brand, and a weekly digest ranks which formats the market is winning with right now. All three are buildable in a weekend, mostly for free, and the prompt at the bottom does the heavy parts for you.
(Quick catch-up if you're new: issue three packages the dashboard everything runs on. Issue four watches your winners die. Issue five reads the week you're standing in. Today reads everyone else's creative, systematically.)
Quick sponsor note before the teaching starts, and the house rule stands: I don't run ads for anything I don't personally use every day. This issue is a Wispr Flow issue twice over.
If you’re not using it, you are wasting time
ChatGPT gives you generic answers because you give it generic prompts.
You know the fix: longer prompts, more context, clearer constraints. But typing all that takes five minutes per prompt, so you shortcut it. Every time.
Wispr Flow lets you speak your prompts instead of typing them. Talk through your thinking naturally — include context, constraints, examples — and get clean text ready to paste. No filler words. No cleanup.
Works inside ChatGPT, Claude, Cursor, Windsurf, and every other AI tool. System-level, so there's nothing to install per app. Tap and talk.
Millions of users worldwide. Teams at OpenAI, Vercel, and Clay use Flow daily. Free on Mac, Windows, and iPhone.
Longevity is the evidence
Start with the evidence problem, because it's the one that makes everything else work.
The Meta Ad Library is public, free, no login, and shows every active ad from every advertiser on Meta, with launch dates. Everyone in advertising knows it exists. Almost everyone uses it as a browsing surface: type in a competitor, scroll, feel things, leave.
Here's the read that matters: in the US, Meta won't show you what anyone spends. But it shows you when every ad launched, and whether it's still running. And almost nobody keeps paying to run an ad that isn't working (the exceptions are real, they're covered in the limits section, and they don't change the math). An ad that launched last week tells you nothing, it's a guess someone shipped. An ad that launched in February and is still running in August, with fourteen near-identical variations behind it, is not a guess. It's a memo from their analytics to yours: this ad pays rent. Longevity is the spend data they can't hide.

File by format, never by brand
Second property, and this is the organizational decision that turns a collection into a tool: every ad gets filed by its format archetype, never by whose ad it is.
Testimonial. Us vs them. Headline. Product hero. UGC-style. Before and after. Stat hero. Offer. Negative marketing. Founder story. Feature callouts. Fake Notes app. Handwritten post-it. My taxonomy has grown to about 24 formats over the years; the prompt below starts you at 16, which is plenty for your first year. The exact list matters less than the discipline: the folders ARE your format vocabulary. When a batch plan says "slot four is a labeled product grid," anyone on the team opens that folder and sees twenty examples of the layout logic in ten seconds. That sentence is impossible in a brand-organized folder, where the same layout is scattered across thirty brands and you find it by memory or not at all.
Brand-organized answers "what has Liquid Death been up to." Format-organized answers "show me every way anyone has ever staged a comparison," and that's the question a batch actually asks.
There's a bonus effect: filing by format forces you to name the format, and naming it forces you to see the structure underneath. Which comes back in a big way in a minute.

The weekly digest
The last property is the one I automated, because the file has to know what's winning now, not what won when you saved it.
Pick a watchlist. Mine is about 25 to 30 DTC brands worth learning from, big spenders in my categories and, crucially, adjacent to them. If you sell beverages, you should be swiping supplement brands, snack brands, cookware brands, whoever is doing elite creative work on a mundane product, because formats transfer and your category's habits are not the ceiling.
Then, weekly, a sweep, which is a genuinely strange way to spend part of every Monday and I've made my peace with it: pull every active static for the watchlist from the Ad Library, dedupe the placement variants (the Library will cheerfully count one creative nine times), and rank each brand's ads by the longevity proxy. The brand's strongest surviving static is position one, and so on down. Last week's sweep for me: 293 active statics across 26 brands.
Then the pass that makes it a digest instead of a pile: every ad gets annotated. Its format, from the folder taxonomy. Its layout in a phrase, "two column comparison table." Its on-screen text, transcribed. One sentence on why it works. And the field I use most, the copy shape: the structure the words actually live in. "Block quote with highlighted payoff." "Label plus stat columns." "Caption bubbles, lowercase." This used to be the expensive part, a human hour per hundred ads. It's now the cheap part, because reading an image and naming its structure is exactly what a model is good at. I spot-checked its tags obsessively for the first month. These days it mostly catches me filing things wrong.
Roll the annotations up and you get per-format market stats: how many ads run each format, how many different brands run it (one brand's pet format is a quirk, eight brands' format is a playbook), and how high those ads rank inside their own brand's stack. That last one is the killer stat. A format whose ads keep showing up at position one through five across many brands is a format that keeps beating everything else those brands test against it.
What the digest said the other week
Real output, so this isn't theoretical. From last week's sweep of those 293 statics:
Us vs them, the two-column comparison, is the top-ranked format in the market right now: run by 8 of the 26 brands, and its ads sit at a median position of 7 inside their brands' stacks, the highest of any format. Testimonials claim the biggest share of position one through five winners, about 27 percent. Offer ads are the volume format, 83 of the 293, which mostly proves that discounting is popular. And stat heroes, the big number with a tagline, claimed exactly zero percent of the top five slots. I don't fully know why comparison layouts are winning this hard right now. I know that they are, which is the humbler and more useful fact.
Here's what that was worth in practice. I was building a batch the same week for the alcohol-free beer client from last issue (whom I will continue not naming), and the account had never run a single us vs them ad. Not one, in the entire history of the account. The market's number one format, validated across eight brands, at zero tests in the account. It got two slots in the batch the same day, and finding it felt less like strategy and more like finding a twenty in a coat pocket. Issue five readers will recognize the shape: a crowded bet next to an empty lane, except this time the lane is a format instead of an angle.

How it plugs into the batch
This is where the swipe file stops being research and starts being production.
I'll tell you why this section exists. A while back I shipped a ten-ad batch I was proud of. Different headlines, different products, tight copy. At full size, ten ads. At thumbnail size, in a grid, it was one ad, ten times: the same centered layout with the words swapped out. Nobody needs a swipe file to write ten headlines. You need one so that ten ads are actually ten ads.
So now, when a batch gets planned, format choice is data: the account's own history says what has worked here, the digest says what's winning out there, and the gap between them is the test list. And for every slot, we open two to four actual exemplars from the file and extract the structure: the layout logic, the copy density, where the proof sits, how big the product is, and the copy shape.
Then the rule that changed our copy the most: the copy gets written INTO that shape, element by element. Not written first and pasted on after.
Because the shape dictates the writing. A testimonial format means the quote IS the ad, so the work is finding the customer sentence strong enough to carry it, not writing a headline and decorating it with quote marks. A stat-columns format carries no explainer prose, the columns are the body. A caption-bubble UGC format is lowercase and phone-native, and one properly spelled marketing sentence kills it. If you've ever wondered why your team's testimonial ads, comparison ads, and UGC ads all somehow read identically, this is why: the copy was written in a vacuum and the format was applied like a costume.
Every slot's exemplar goes into the brief as a link with a two-line annotation. TAKE: the composition logic. IGNORE: the brand, the scene, the words. You're stealing the skeleton, never the skin.

Connecting the firehose
One setup note before the prompt, because the difference between a demo and the real thing is one connector.
Out of the box, the prompt below runs on web search, and web search will build you a real starter file. But the weekly sweep, the part that pulls every active ad for 25 to 30 brands with launch dates, wants structured rows, and structured rows means Apify (the same scraper marketplace behind issue five's monitor). The setup is ten minutes, once:
Create a free Apify account at apify.com. The free tier's monthly credit covers a weekly watchlist sweep with room to spare; my sweeps cost cents.
Connect Apify to Claude. On claude.ai: Settings, then Connectors, then add Apify and sign in. In Claude Code, add the Apify MCP server the same way you added the connectors from issue three. Either route hands Claude the ability to run scrapers directly and read their results.
Pick the actor. Search the Apify store for "Facebook Ad Library scraper" and take a well-used one with recent runs. The store shows usage counts and last-updated dates; treat them exactly like the survivor badges they are. The actor takes brand names or Ad Library URLs and returns active ads as rows: launch date, creative, placements. Which is precisely what phase 2 of the prompt needs.
That's it. Once the connector is live, the prompt's sweep stops squinting through web search and pulls the Library directly. Nothing else about the prompt changes.
If you skip this, skip it knowingly: the file still builds and the digest still ranks, just with fuzzier edges. But if you're going to run this weekly for a real account, connect the firehose. It's the cheapest part of the entire system.
The prompt
Everything above, the sweep, the annotation, the rankings, the free-test list, is the part I automated, and it's one prompt. Paste it into Claude with web search on (the Meta Ads connector makes the sweep better if you have it). Run it once to build the file, then weekly for the digest. It writes into the same dashboard folder as issue three.
You are my swipe file builder and market analyst. My creative dashboard
is the index.html in this folder. Your job has two modes: BUILD (first
run) and DIGEST (weekly). Never invent an ad, a brand, a number, or a
link. Ask me ONE question total (Phase 1).
PHASE 1 - WATCHLIST
1. Read my dashboard for my brand and category. Then ask me the one
question: confirm my watchlist of 20-30 brands worth learning from.
Push me to include ADJACENT categories, not just competitors: the
best-creative brands selling anything to my kind of buyer. Formats
transfer; category habits are not the ceiling.
PHASE 2 - THE SWEEP (per brand, public sources)
2. Meta Ad Library (facebook.com/ads/library, public, no login): pull
ACTIVE ads for each watchlist brand. If the Apify connector is
available, run a Facebook Ad Library scraper actor and work from
its rows; else use the Meta connector's ad library search; else
web search. Image ads only for this file.
3. Dedupe: collapse placement/size variants of the same creative into
one. Count distinct creatives, never rows.
4. Evidence, not vibes: for every creative note the launch date and
compute days-running. Flag every ad running 60+ days as a SURVIVOR
and every ad with 5+ active variants as a SCALED WINNER. Almost
nobody keeps paying for an ad that is not working: longevity is
the spend data the Library will not show you. Rank each brand's
statics by this proxy; the strongest surviving static is
position 1.
PHASE 3 - ANNOTATE (this is what makes it a tool)
5. THE FILTER: only SURVIVORS and SCALED WINNERS get filed in the
swipe file. Everything else is context for the digest stats, not
a reference. If a brand has no survivor in a format, that format
gets no entry from that brand. A file full of launches is a guess
collection; the file holds survivors only.
6. For every FILED ad, write one annotation record:
- FORMAT: one tag from a fixed taxonomy (testimonial, us-vs-them,
headline, product-hero, ugc-style, before-after, stat-hero,
offer, negative-marketing, founder-story, feature-callouts,
bullet-list, native-ui, handwritten, press, other). Keep the
taxonomy stable across weeks; the tags are my format vocabulary.
- LAYOUT: the composition in one phrase ("two-column comparison
table", "overhead flat lay with floating stat badges").
- COPY SHAPE: the structure the words live in ("block quote with
highlighted payoff", "label plus stat columns", "caption
bubbles, lowercase"). This field is the most important one:
copy for an ad in this format must be written INTO this shape.
- OST: the on-screen text, transcribed.
- WHY IT WORKS: one sentence, mechanics not praise.
- DAYS RUNNING, VARIANT COUNT, POSITION, LINK.
7. BUILD mode: organize the filed ads into format folders (one
section per format tag), each ad with its record. By format,
never by brand.
PHASE 4 - THE DIGEST (weekly)
8. Per-format market stats across the WHOLE sweep (filed and
unfiled): number of ads (n), number of distinct brands running it
(breadth beats one brand's quirk), median position of its ads
inside their own brands' stacks, and its share of position 1-5
winners. Rank formats by median position and note movement vs
last week's snapshot.
9. Cross-reference my dashboard: list every format ranking well in
the market that MY account has never run or barely run. Those are
free tests. A market-validated format at zero account tests is the
clearest brief there is.
10. Name what died: formats and specific long-running ads that
disappeared from the Library since last week's snapshot. A
survivor that finally stopped running is information too.
PHASE 5 - SNAPSHOT AND REPORT
11. Before touching the dashboard, save this week's full per-ad table
as a dated snapshot file (swipe-snapshot-YYYY-MM-DD) in this
folder. Next week's run diffs against it; without the snapshot,
"movement" and "what died" are unanswerable.
12. Add/refresh a "SWIPE" section on my dashboard: the format
rankings, the free-test list, 2-3 named exemplars per top format
(brand, position, copy shape, link), and this week's deaths.
Re-serve the file and give me the URL.
13. End with exactly two sentences: the one format I should test next
with its market evidence, and the one exemplar to open first with
its TAKE / IGNORE line (TAKE the composition logic, IGNORE the
brand, scene, and words).
A few of those lines are load-bearing. Distinct-creatives-not-rows keeps one ad from impersonating a trend. The survivors-only filter in phase 3 is the difference between a swipe file and a screenshot folder. The fixed taxonomy is boring on purpose, because tags that drift week to week can't be compared week to week. And the TAKE/IGNORE line in the final sentence is the whole craft of swiping in one instruction: take the structure, leave the brand.
TLDR
A folder of ads you liked can't decide anything. A swipe file is three upgrades on top of it: evidence (survivors ranked above everything), organization (by format, never by brand), and a weekly digest (which formats the market is winning with right now).
The evidence is free: the Meta Ad Library shows every active ad's launch date. An ad still running after 60+ days with a stack of variants is paying rent. Longevity is the spend data they can't hide.
File by format and the folders become your production vocabulary: "slot four is a labeled product grid" becomes a sentence anyone can act on in ten seconds.
The weekly digest ranks formats by median position and winner share across a 25-30 brand watchlist. Last week's read: us vs them ranks first, testimonials take 27 percent of the top-five slots, stat heroes take zero. My client's account had never run the number one format once. Two free tests, briefed same day.
The craft rule that changed our copy the most: extract each exemplar's copy shape and write the words into that shape. In a testimonial the quote IS the ad. In stat columns the columns ARE the body.
The paste-ready prompt above builds the file, runs the weekly digest, and ends every run by naming your next free test and the one exemplar to open, with its TAKE / IGNORE line.
Reply and tell me the immortal: the ad you've personally watched run, unchanged, for the longest time. I once found one that had been running for over a year, and I think about it more than I think about most people I went to school with. I'm collecting these next to the zombie ads, the weird subreddits, and the trend-ad hall of shame, and at this point the archive is turning into a museum with a gift shop.
And I'll tell you the real reason this one is my favorite part of the whole stack. Of everything we've built together in this series, this is the piece that made me stop feeling like James at the puppet show, laughing along a beat late in a language I didn't speak. I hope it does the same for you.
Have a great weekend,
Will

