You publish a video a week. Your subscribers would read a good newsletter version, and you have the transcript. So you paste it into a chatbot and get back a tidy draft with a quote in it that you don't remember saying. It sounds like you. It isn't in the video.
This post is an AI newsletter from YouTube transcripts workflow where the draft has to survive an accuracy check. The method: give the model a strict brief, then run a small script that tests every quoted string and every number in the draft against the transcript. I ran the script on 2026-10-09 against a short, made-up transcript and a hand-written draft that contained planted errors. The output is below.
The workflow
- Get a transcript you trust. Export the captions, then fix names, numbers and product terms by hand. Auto-captions are the weak link, and the checker only compares the draft to this file.
- Write the brief (template below). The key rules: use only the transcript, mark verbatim quotes with quotation marks, keep the speaker's hedges.
- Generate the draft. One video per issue, or a digest of several if you give the model each transcript labelled with the video title.
- Run the checker. Fix or delete anything that fails.
- Add what the video can't: the link, one thing you've changed your mind about since, a reader question. That is also the part subscribers can't get from the video.
If you're after general repurposing prompts for other formats, see AI content repurposing prompts. If you're clipping the same material for short video, the podcast to Shorts workflow uses the same verify-before-publish idea.
The newsletter brief (untested template)
I wrote this template and did not run it on a live model for this post, so test it on one video before you rely on it.
You are drafting a newsletter issue from a video transcript.
SOURCE (the only facts you may use):
{{PASTE TRANSCRIPT}}
Write {{WORDS}} words in the first person as the creator.
Rules:
1. Every number, name and claim must come from the SOURCE. If you
want to add context, put it in a separate list called "Needs a
source" and do not put it in the draft.
2. Direct quotes go in straight double quotation marks and must be copied
character for character from the SOURCE. Do not tidy them.
3. If the speaker hedges ("at least for us", "I'm not sure"), keep the
hedge in the same sentence as the claim.
4. No sentence may claim a result the speaker did not state.
5. Structure: one-line hook, 3 takeaways with a sentence each, one
thing to try this week, sign-off.
Rule 1's "Needs a source" list is worth keeping. It gives the model somewhere to put its urge to add facts, instead of slipping them into the body.
The checker script, and what it printed
Save as check_newsletter.py. Standard library only.
import re, sys
from difflib import SequenceMatcher
def norm(s):
s = s.lower().replace("’", "'")
s = re.sub(r"[^a-z0-9' ]+", " ", s)
return re.sub(r"\s+", " ", s).strip()
def best(q, t):
q, t = norm(q), norm(t)
if q in t:
return 1.0
qw, tw = q.split(), t.split()
n = len(qw)
return max((SequenceMatcher(None, q, " ".join(tw[i:i+n])).ratio()
for i in range(max(1, len(tw) - n + 1))), default=0.0)
transcript = open(sys.argv[1]).read()
draft = open(sys.argv[2]).read()
fails = 0
for q in re.findall(r'"([^"]{12,})"', draft):
score = best(q, transcript)
status = "ok" if score >= 0.9 else "FAIL"
fails += status == "FAIL"
print(f"quote [{status}] ({score:.2f}) {q[:70]}")
draft = re.sub(r"(?m)^\s*\d+[.)]\s+", "", draft) # ignore list markers
t_nums = set(re.findall(r"\d+(?:\.\d+)?", transcript))
for n in sorted(set(re.findall(r"\d+(?:\.\d+)?", draft))):
spoken = n in t_nums
print(f"number [{'ok' if spoken else 'CHECK'}] {n}")
fails += not spoken
print("problems:", fails)
sys.exit(1 if fails else 0)
Run: python3 check_newsletter.py transcript.txt draft.md.
My test transcript is a made-up talk of about 140 words about handling returns at a small shop. My draft was hand-written to mimic common model errors:
Three habits for fewer returns.
1. Move the policy off the footer. The host says tickets "dropped by a third"
after the move, and 12 shops copied it.
2. Put a size chart by the buy button. "A size chart next to the buy button helps."
3. Reply fast. The host would keep one habit: "reply to every return request
within one working day".
Caveat from the host: it is "from our own tickets, not a study".
This is what the script printed:
quote [FAIL] (0.63) dropped by a third
quote [ok] (1.00) A size chart next to the buy button helps.
quote [ok] (1.00) reply to every return request within one working day
quote [ok] (1.00) from our own tickets, not a study
number [CHECK] 12
problems: 2
Two real catches. "Dropped by a third" is a number-flavoured claim wrapped in quotation marks that the speaker never said (the transcript says tickets "dropped, at least for us" and "I don't have a clean number"). And "12 shops copied it" is a figure with no source at all.
My first version of the script also flagged the list numbers 1, 2 and 3 as unverified figures. That was noise from the draft's numbered list, so the version above strips list markers first. Expect a few false alarms like that on real drafts (dates, years, "top 5") and treat CHECK as "look at this", not "this is wrong".
What the checker can't see
Be honest about these, because a green result feels safer than it is:
- Number words. "Three habits" is not flagged, since the script looks for digits. A model that writes "a third" or "half" gets through. Read every quantity word yourself.
- Meaning shifts. A verbatim quote can still be used to say something the speaker didn't mean. Check that the sentence around the quote doesn't change its sense.
- Bad transcripts. If captions heard "fifteen" for "fifty", the draft and the transcript agree and both are wrong.
- Paraphrases. Unquoted paraphrase isn't checked at all. Rule 4 in the brief and a read-through are your defences there.
- Matching threshold. I used 0.9 similarity. A quote that differs by one word may pass. Lower strictness for speech with filler words; raise it for legal or medical material, and for that kind of content get a human review no matter what the script says.
For a wider method on spotting machine-made errors, the fact-checking checklist covers claims that come from outside the transcript.
Handling several videos in one issue
If you do a weekly digest, paste each transcript under a header with its title and publish date, and run the checker once per transcript with the section of the draft that covers it. Running it once against all transcripts concatenated will pass a quote that was attributed to the wrong video, which is an error readers notice. Keep one file per video and one draft section per video.
Disclosure and ownership
Write about your own videos, or ones you have clear permission to use. (If you also republish the video content on YouTube itself, see the reused content rules; a newsletter is a different platform, but the "add real value" test is a good habit anyway.) Quoting other creators at length raises copyright and relationship questions that depend on your country and the amount used; ask a professional if the newsletter is a business. If a guest appears in your video, check what your release lets you reuse. If you used AI to draft, some readers care. Disclosure wording for AI use has options for client work; for a newsletter, say what you do in one honest line, such as that issues are drafted from your video transcripts and checked by you.
Sponsors: if an issue contains a paid placement, label it clearly at the top, in line with the rules of the places you operate. The creator sponsorship pitch post points to the regulators' own pages.
What I'd skip
Skip automated send. A script can tell you a quote is real; it can't tell you the issue is good. Also skip asking the model to "make it more engaging" after verification, because every rewrite is a new chance to add an unchecked number. If you do rewrite, run the checker again.



