Devin Huber
Résumé
Claude scheduled task · n8n

Podcast Archive Article Engine

Turns a ten-year, 343-episode podcast archive into a weekly newsletter draft. A rule in code picks the episode, Claude writes the section around a quote already on record, and n8n sends the draft to the editors and records the promotion.

For a businessTen years of podcast episodes keep earning attention instead of aging out: each week an older interview returns as a newsletter draft, quoting the guest accurately, with an editor still approving what goes out.

Built for
Leadership-development institute (current work)
Index
Google Sheets · 343 episodes · 29 fields
Schedule
Every week
Output
HTML draft with a quote card, emailed to editors
Status
In production at my employer
Result
Not yet measured against an answer key; editors judge every draft before it is used
How it was measured
Each pick returns the rows it skipped and why, so a surprising choice can be traced
Biggest limit
Only episodes with a standout quote on record can be featured, so much of the archive isn’t reachable yet
343episodes indexed, 2016–2026
2.6Mspoken words transcribed, every episode
18months before an episode can return, enforced in code

01 · Context The problem

An episode gets attention the week it airs and then effectively disappears. Ten years of interviews sat in the archive with no practical way to tell which ones were still worth resurfacing, and nothing to write from even once you picked one: most episodes had no transcript, no quote, and no record of whether they had been promoted before.

02 · Pipeline How it works

  1. Build the index first

    The archive was pulled into a single sheet: 343 episodes across ten years, with 29 fields each — air date, guests, summary, categories, takeaways, shelf life, promotion history and episode URL.

  2. Transcribe and mine the transcripts

    Transcription was automated and the transcripts loaded back into the index: all 343 episodes, about 2.6 million spoken words. A model read each transcript and pulled one standout quote, stored as a field alongside the speaker and timestamp rather than generated later at writing time.

  3. Let the index decide eligibility

    A formula in the sheet marks an episode eligible only when it is flagged evergreen, has a standout quote recorded, aired more than a year ago, has not been promoted in the last 18 months, and is not marked skip. Of 343 episodes, 243 are evergreen; the rest are time-sensitive and never surface.

  4. Pick, weekly, in code

    A weekly Claude scheduled task asks n8n for the next episode: the first row marked eligible, skipping anything promoted in the last 18 months. Code reads the sheet’s dates in every format they appear in and returns the rows it skipped, with the reason.

  5. Draft around the recorded quote

    Claude writes the newsletter section around the episode’s standout quote. A quote card can be attached; the archive assistant’s card tool draws one only for a quote that passes its transcript check.

  6. Send to fixed recipients

    n8n emails the draft to the editors. Recipients are set by the action, never by the model, attachments must be images, and a test goes to me only.

  7. Record the promotion

    A separate call writes the date, the new count and the status back to the row, which starts the 18-month clock before that episode can come around again.

03 · Choices Design decisions

Selection is a rule, not a judgment call

Eligibility lives in the index as a rule over five conditions, and code enforces the 18-month rule again at pick time. The model is handed a decision already made, so it cannot pick an episode that ran recently or one with nothing to quote.

Quotes are recorded, not produced on demand

Each quote was extracted once from the transcript and stored with its speaker and timestamp. At writing time the quote is retrieved, not invented, so a guest is never credited with words they did not say.

Claude writes, n8n acts

The model never touches the sheet or the mailbox directly: it calls one unpublished n8n workflow with four named actions, so the recipients and what can be written are fixed in code.

Recording is a set, not an increment

The record call writes the new count rather than adding one, so repeating the same call does no harm.

Shelf life is a field, not a guess

Every episode is labeled evergreen or time-sensitive up front, so the question of what ages well was answered once across the archive rather than re-litigated every week.

People finish the work

The output is a draft for editors, not a published article. Nothing reaches an audience without a person putting it there.

04 · Evidence How I tested it

Indexing the archive doubled as an audit: the same pass produced a 299-item fix list for the live site, led by 190 episodes with no transcript on the page and 91 with no video embedded, plus duplicate descriptions and takeaway blocks attached to the wrong episode. An agent has since published every transcript to its episode page.

Each pick returns the rows it skipped and why, so a surprising choice can be traced back to the sheet.

05 · Outcomes What it has done so far

  • A weekly newsletter draft, running at my current employer without interruption.
  • Every episode’s transcript is live on its page on the podcast’s website, published by an agent.

06 · Iteration Tuning log

  1. Rebuild
    Moved from a Zap to a weekly Claude task over n8n, with a quote card attached to the draft.
  2. Bug fix
    The sheet’s eligibility formula never read the old Zap’s promotion dates, so recently promoted episodes stayed eligible and came back. The 18-month rule is now also enforced in code at pick time.

07 · Honest notes Known limits

  • Only episodes with a standout quote on record can be featured: 153 of 343 so far. Every episode now has a transcript, so the rest can become eligible as quotes are pulled from them.
  • Sending and recording are separate calls: if a send succeeds and the record call fails, the episode could come up again.
  • One episode per week by design, so the archive is worked through slowly rather than flooded.
  • Evergreen versus time-sensitive is a human judgment recorded once per episode; an episode labeled wrong stays wrong until someone changes the field.

Want to see this one run?

I'll screen-share the workflow, the test set and the results, including what didn't work.

Get in touch