Sorts the comments on your latest videos into asks, praise and complaints, and emails the counts with real quotes.

UsesClaudeGmailGoogle SheetsYouTube

What your YouTube viewers are saying

Every Monday at 09:00, the comments on your channel's most recent uploads are read and each one is sorted by what the viewer wanted: a request for something, praise, a complaint or ordinary chatter. You get one email with the counts under each heading and a handful of real comments quoted beneath them, each with the viewer's name and the video it was left on.

The quotes are lifted straight out of the comments. The AI only ever decides which pile a comment belongs in and never writes the quotes, so no wording in the digest is invented. Only top level comments are read, in the order YouTube considers most relevant, and the replies beneath them are not fetched. A comment that cannot be read or sorted is logged and skipped while the rest carry on, and if no comments came back at all no digest is sent. If you give it a spreadsheet, each run also appends one row of the date, channel and counts, so you can watch the balance move week to week; without one, no sheet is touched.

ScheduleRun every Monday at 09:00.Run every Monday at 09:00.
ValuesSet channelId to blank.Set channelId to blank.
ValuesSet digestRecipient to blank.Set digestRecipient to blank.
ValuesSet videosToCheck to 3.Set videosToCheck to 3.
ValuesSet commentsPerVideo to 15.Set commentsPerVideo to 15.
ValuesSet quotesPerTheme to 4.Set quotesPerTheme to 4.
ValuesSet logSheetUrl to blank.Set logSheetUrl to blank.
ValuesSet logSheetTab to Comment themes.Set logSheetTab to Comment themes.
YouTubeYouTubeGet the details of channelId. Save it as channel.Get the details of channelId. Save it as channel.
ValuesSet channelName to your channel.Set channelName to your channel.
Decisions & LoopsIf a step below fails, save the error as channelNameErrorIf a step below fails, save the error as channelNameError
Try
TextTrim channel.title and save it as channelName.Trim channel.title and save it as channelName.
On error
ValuesShow in the output: The channel has no title; calling it 'your channel'..Show in the output: The channel has no title; calling it 'your channel'..
ValuesSet uploadsPlaylistId to blank.Set uploadsPlaylistId to blank.
Decisions & LoopsIf a step below fails, save the error as uploadsErrorIf a step below fails, save the error as uploadsError
Try
TextTrim channel.related_playlists.uploads and save it as uploadsPlaylistId.Trim channel.related_playlists.uploads and save it as uploadsPlaylistId.
On error
ValuesShow in the output: That channel did not come back with an uploads playlist..Show in the output: That channel did not come back with an uploads playlist..
Decisions & LoopsIf uploadsPlaylistId is emptyIf uploadsPlaylistId is empty
Yes
Decisions & LoopsStop and report a problem: YouTube did not return an uploads playlist for that channel, so there are no videos to read. Check the value in the 'channelId' step is a channel ID starting with UC, not a channel name or a video link.Stop and report a problem: YouTube did not return an uploads playlist for that channel, so there are no videos to read. Check the value in the 'channelId' step is a channel ID starting with UC, not a channel name or a video link.
No
No steps
YouTubeYouTubeList the videos in uploadsPlaylistId. Save it as uploads.List the videos in uploadsPlaylistId. Save it as uploads.
ValuesSet videos to uploads.items.Set videos to uploads.items.
ValuesSet reviewedCount to 0.Set reviewedCount to 0.
ValuesSet requestCount to 0.Set requestCount to 0.
ValuesSet praiseCount to 0.Set praiseCount to 0.
ValuesSet complaintCount to 0.Set complaintCount to 0.
ValuesSet otherCount to 0.Set otherCount to 0.
ValuesSet requestQuotes to an empty list.Set requestQuotes to an empty list.
ValuesSet praiseQuotes to an empty list.Set praiseQuotes to an empty list.
ValuesSet complaintQuotes to an empty list.Set complaintQuotes to an empty list.
ValuesSet videoLines to an empty list.Set videoLines to an empty list.
Decisions & LoopsFor each video in videos:For each video in videos:
ValuesSet videoTitle to Untitled video.Set videoTitle to Untitled video.
Decisions & LoopsIf a step below fails, save the error as videoTitleErrorIf a step below fails, save the error as videoTitleError
Try
TextTrim video.title and save it as videoTitle.Trim video.title and save it as videoTitle.
On error
ValuesShow in the output: A video in the uploads list had no title..Show in the output: A video in the uploads list had no title..
ValuesSet videoId to blank.Set videoId to blank.
Decisions & LoopsIf a step below fails, save the error as videoIdErrorIf a step below fails, save the error as videoIdError
Try
TextTrim video.video_id and save it as videoId.Trim video.video_id and save it as videoId.
On error
ValuesShow in the output: Skipped an uploads entry that had no video id..Show in the output: Skipped an uploads entry that had no video id..
Decisions & LoopsIf videoId isn't emptyIf videoId isn't empty
Yes
ValuesSet videoCommentCount to 0.Set videoCommentCount to 0.
ValuesSet comments to an empty list.Set comments to an empty list.
Decisions & LoopsIf a step below fails, save the error as commentReadErrorIf a step below fails, save the error as commentReadError
Try
ValuesChange comments to the items from the YouTube “List video comments” step.Change comments to the items from the YouTube “List video comments” step.
On error
ValuesShow in the output: Could not read the comments on: videoTitle.Show in the output: Could not read the comments on: videoTitle.
Decisions & LoopsFor each comment in comments:For each comment in comments:
Values Set commentText to blank. Set commentText to blank.
Decisions & Loops If a step below fails, save the error as commentTextError If a step below fails, save the error as commentTextError
Try
TextTrim comment.text and save it as commentText.Trim comment.text and save it as commentText.
On error
ValuesShow in the output: Skipped a comment with no text on: videoTitle.Show in the output: Skipped a comment with no text on: videoTitle.
Decisions & Loops If commentText isn't empty If commentText isn't empty
Yes
ValuesSet commentAuthor to A viewer.Set commentAuthor to A viewer.
Decisions & LoopsIf a step below fails, save the error as commentAuthorErrorIf a step below fails, save the error as commentAuthorError
Try
TextTrim comment.author and save it as commentAuthor.Trim comment.author and save it as commentAuthor.
On error
ValuesShow in the output: A comment had no author name; recording it as 'A viewer'..Show in the output: A comment had no author name; recording it as 'A viewer'..
Decisions & LoopsIf commentAuthor is emptyIf commentAuthor is empty
Yes
ValuesChange commentAuthor to A viewer.Change commentAuthor to A viewer.
No
No steps
ValuesSet sortPrompt to You are sorting one comment left on a YouTube video into exactly one bucket.Set sortPrompt to You are sorting one comment left on a YouTube video into exactly one bucket. Reply with EXACTLY one of these words and nothing else - no punctuation, no explanation, and never quote the comment back: request - the viewer is asking for something: a topic, a follow-up, a tutorial, a feature, more detail praise - the viewer is saying something positive about the video or the channel complaint - the viewer is unhappy, confused, or reporting a problem other - anything else, including spam, off-topic chatter and one-word reactions Video: videoTitle Comment: commentText.
ValuesSet bucket to blank.Set bucket to blank.
Decisions & LoopsIf a step below fails, save the error as sortErrorIf a step below fails, save the error as sortError
Try
TextReplace . with in the response text from the Claude “Ask Claude” step in lowercase and save it as bucket.Replace . with in the response text from the Claude “Ask Claude” step in lowercase and save it as bucket.
On error
ValuesShow in the output: Could not sort a comment on: videoTitle.Show in the output: Could not sort a comment on: videoTitle.
Decisions & LoopsIf bucket isn't emptyIf bucket isn't empty
Yes
ValuesAdd 1 to reviewedCount.Add 1 to reviewedCount.
ValuesAdd 1 to videoCommentCount.Add 1 to videoCommentCount.
ValuesSet quoteLine to - @commentText truncated to 220 characters using ... as the ellipsis - commentAuthor (on videoTitle).Set quoteLine to - @commentText truncated to 220 characters using ... as the ellipsis - commentAuthor (on videoTitle).
Decisions & LoopsIf bucket is requestIf bucket is request
Yes
ValuesAdd 1 to requestCount.Add 1 to requestCount.
Decisions & LoopsIf the length of requestQuotes is less than quotesPerThemeIf the length of requestQuotes is less than quotesPerTheme
Yes
ListsAdd quoteLine to the end of requestQuotes and save it as requestQuotes.Add quoteLine to the end of requestQuotes and save it as requestQuotes.
No
No steps
Else if @bucket is "praise"
ValuesAdd 1 to praiseCount.Add 1 to praiseCount.
Decisions & LoopsIf the length of praiseQuotes is less than quotesPerThemeIf the length of praiseQuotes is less than quotesPerTheme
Yes
ListsAdd quoteLine to the end of praiseQuotes and save it as praiseQuotes.Add quoteLine to the end of praiseQuotes and save it as praiseQuotes.
No
No steps
Else if @bucket is "complaint"
ValuesAdd 1 to complaintCount.Add 1 to complaintCount.
Decisions & LoopsIf the length of complaintQuotes is less than quotesPerThemeIf the length of complaintQuotes is less than quotesPerTheme
Yes
ListsAdd quoteLine to the end of complaintQuotes and save it as complaintQuotes.Add quoteLine to the end of complaintQuotes and save it as complaintQuotes.
No
No steps
Otherwise
ValuesAdd 1 to otherCount.Add 1 to otherCount.
No
No steps
No
No steps
ListsAdd - videoTitle - videoCommentCount as text sorted to the end of videoLines and save it as videoLines.Add - videoTitle - videoCommentCount as text sorted to the end of videoLines and save it as videoLines.
No
No steps
Decisions & LoopsIf reviewedCount is 0If reviewedCount is 0
Yes
Decisions & LoopsFinish the run: No comments came back on your latest videos, so there was nothing to sort and no digest was sent.Finish the run: No comments came back on your latest videos, so there was nothing to sort and no digest was sent.
No
No steps
ValuesSet requestBlock to No requests this time..Set requestBlock to No requests this time..
Decisions & LoopsIf requestQuotes isn't emptyIf requestQuotes isn't empty
Yes
TextJoin requestQuotes with a new line and save it as requestBlock.Join requestQuotes with a new line and save it as requestBlock.
No
No steps
ValuesSet requestSection to WHAT THEY ASKED FOR (requestCount as text)Set requestSection to WHAT THEY ASKED FOR (requestCount as text) requestBlock.
ValuesSet praiseBlock to No praise this time..Set praiseBlock to No praise this time..
Decisions & LoopsIf praiseQuotes isn't emptyIf praiseQuotes isn't empty
Yes
TextJoin praiseQuotes with a new line and save it as praiseBlock.Join praiseQuotes with a new line and save it as praiseBlock.
No
No steps
ValuesSet praiseSection to WHAT THEY PRAISED (praiseCount as text)Set praiseSection to WHAT THEY PRAISED (praiseCount as text) praiseBlock.
ValuesSet complaintBlock to No complaints this time..Set complaintBlock to No complaints this time..
Decisions & LoopsIf complaintQuotes isn't emptyIf complaintQuotes isn't empty
Yes
TextJoin complaintQuotes with a new line and save it as complaintBlock.Join complaintQuotes with a new line and save it as complaintBlock.
No
No steps
ValuesSet complaintSection to WHAT THEY COMPLAINED ABOUT (complaintCount as text)Set complaintSection to WHAT THEY COMPLAINED ABOUT (complaintCount as text) complaintBlock.
ValuesSet headerLine to Here is what viewers said on the last the length of videoLines as text videos from channelName.Set headerLine to Here is what viewers said on the last the length of videoLines as text videos from channelName.
ValuesSet countsBlock to Comments sorted: reviewedCount as textSet countsBlock to Comments sorted: reviewedCount as text Asked for something: requestCount as text Praised: praiseCount as text Complained: complaintCount as text Everything else: otherCount as text.
ValuesSet digestBody to headerLineSet digestBody to headerLine countsBlock requestSection praiseSection complaintSection VIDEOS CHECKED videoLines joined by a new line Every quote above is copied word for word from a comment on your channel; nothing here is wording the AI came up with.
GmailGmailSend an email to digestRecipient.Send an email to digestRecipient. Subject: What your viewers said on channelNamedigestBody
Decisions & LoopsIf logSheetUrl isn't emptyIf logSheetUrl isn't empty
Yes
Decisions & LoopsIf a step below fails, save the error as logErrorIf a step below fails, save the error as logError
Try
Google SheetsGoogle SheetsAdd a row to logSheetTab in logSheetUrl.Add a row to logSheetTab in logSheetUrl.
On error
ValuesShow in the output: The digest was emailed but the run could not be logged to your spreadsheet..Show in the output: The digest was emailed but the run could not be logged to your spreadsheet..
No
No steps