Sorts each day's product feedback into your own themes, writes it to a tab and posts a rollup to Slack.

UsesClaudeGoogle SheetsSlack

Sort product feedback into themes

ScheduleRun every day.Run every day.
ValuesSet feedbackUrl to blank.Set feedbackUrl to blank.
ValuesSet themes to blank.Set themes to blank.
ValuesSet slackChannelId to blank.Set slackChannelId to blank.
ValuesSet feedbackTab to Feedback.Set feedbackTab to Feedback.
ValuesSet sortedTab to Sorted.Set sortedTab to Sorted.
ValuesSet maxRows to 200.Set maxRows to 200.
Google SheetsGoogle SheetsRead the rows of feedbackUrl. Save it as sheet.Read the rows of feedbackUrl. Save it as sheet.
ValuesSet sorted to an empty list.Set sorted to an empty list.
Decisions & LoopsFor each item in sheet.rows:For each item in sheet.rows:
Decisions & LoopsIf a step below fails, save the error as sortErrorIf a step below fails, save the error as sortError
Try
TextTrim item.Feedback and save it as comment.Trim item.Feedback and save it as comment.
Decisions & LoopsIf comment isn't emptyIf comment isn't empty
Yes
ClaudeClaudeAsk Claude: 'Sort one piece of product feedback into EXACTLY one of the themes listed below, and judge its tone. Reply with two lines and nothing else:Ask Claude: 'Sort one piece of product feedback into EXACTLY one of the themes listed below, and judge its tone. Reply with two lines and nothing else: THEME: the theme name, copied exactly from the list TONE: one of positive, neutral, negative If it fits none of the themes, use the theme name Other. Do not invent a new theme, and do not soften the tone - feedback that reads as frustrated is negative. Themes: themes The feedback: comment'. Save it as verdict. Maximum response length: 40
TextTrim verdict.response_text and save it as sortedAs.Trim verdict.response_text and save it as sortedAs.
Decisions & LoopsIf sortedAs isn't emptyIf sortedAs isn't empty
Yes
ListsAdd - sortedAs | comment to the end of sorted and save it as sorted.Add - sortedAs | comment to the end of sorted and save it as sorted.
Google SheetsGoogle SheetsAdd a row to sortedTab in feedbackUrl.Add a row to sortedTab in feedbackUrl.
No
No steps
No
No steps
On error
ValuesShow in the output: Could not sort a feedback row: sortError as text.Show in the output: Could not sort a feedback row: sortError as text.
Decisions & LoopsIf sorted is emptyIf sorted is empty
Yes
SlackSlackSend a message to slackChannelId.Send a message to slackChannelId.*Feedback rollup* Nothing new to sort today.
No
TextJoin sorted with a new line and save it as sortedList.Join sorted with a new line and save it as sortedList.
Decisions & LoopsIf a step below fails, save the error as rollupErrorIf a step below fails, save the error as rollupError
Try
ClaudeClaudeAsk Claude: 'Below is today's product feedback, already sorted into themes. Write two or three sentences for a product channel: which themes came up most, what the tone was, and anything that reads as urgent. Use only what is here - do not infer how many users are affected or how important something is.Ask Claude: 'Below is today's product feedback, already sorted into themes. Write two or three sentences for a product channel: which themes came up most, what the tone was, and anything that reads as urgent. Use only what is here - do not infer how many users are affected or how important something is. sortedList'. Save it as written. Maximum response length: 400
TextTrim written.response_text and save it as rollup.Trim written.response_text and save it as rollup.
SlackSlackSend a message to slackChannelId.Send a message to slackChannelId.*Feedback rollup* (the length of sorted as text) rollup sortedList
On error
SlackSlackSend a message to slackChannelId.Send a message to slackChannelId.*Feedback rollup* (the length of sorted as text) _Rollup unavailable today._ sortedList