Reads new Gmail email for feature requests and logs the ones it finds in Notion as tasks, with a summary of who asked and why.

UsesClaudeGmailNotion

Turn emailed feature requests into Notion tasks

When a new email arrives in your Gmail inbox, the AI checks whether it asks for something your product does not do yet. If it does, each request is written up as an actionable item, a short summary says who is asking, what problem it would solve and how much it matters, and both land on a new page in your Notion feature-request database. Emails that hold no request - bug reports, billing questions, newsletters, notifications, replies that only chase an earlier request - are skipped, with the reason in the run log.

Each page is titled with the feature rather than the email, so the database reads as a list of requests. It holds the requests as to-dos, the summary, who sent the email and when, a link back to it in Gmail, and the email's own text, so teammates who cannot see your inbox can read the request in the sender's words. Only the title column is written, so it works with any database.

You need Gmail, Anthropic and Notion connections, and the link to a Notion database shared with your Notion connection. Every new email in your inbox starts its own run and is read by the AI, so set the trigger's From filter to the sender or domain your requests come from, such as your feedback form's address: the rest of your inbox then stays away from the AI, and you pay for far fewer runs.

GmailGmailWhen an email arrives. Save it as email.When an email arrives. Save it as email.
ValuesSet featureRequestsDatabaseId to blank.Set featureRequestsDatabaseId to blank.
ValuesSet titleProperty to Name.Set titleProperty to Name.
ValuesSet productDescription to blank.Set productDescription to blank.
ValuesSet includeEmailText to true.Set includeEmailText to true.
ValuesSet subjectKeywords to an empty list.Set subjectKeywords to an empty list.
ValuesSet ignoreKeywords to [out of office, automatic reply, auto-reply, autoreply, undeliverable, delivery status notification, mail delivery failed].Set ignoreKeywords to [out of office, automatic reply, auto-reply, autoreply, undeliverable, delivery status notification, mail delivery failed].
ValuesSet gmailAccountIndex to 0.Set gmailAccountIndex to 0.
CodeRun Python code on message, database, title_property, product, subject_keywords, ignore_keywords, and account_index and save it as intake.Run Python code on message, database, title_property, product, subject_keywords, ignore_keywords, and account_index and save it as intake.
Decisions & LoopsIf intake.setup_problem isn't emptyIf intake.setup_problem isn't empty
Yes
Decisions & LoopsStop and report a problem: intake.setup_problem.Stop and report a problem: intake.setup_problem.
No
No steps
Decisions & LoopsIf intake.proceed is noIf intake.proceed is no
Yes
Decisions & LoopsFinish the run: intake.reason.Finish the run: intake.reason.
No
No steps
ValuesSet requestsReply to blank.Set requestsReply to blank.
Decisions & LoopsIf a step below fails, save the error as requestsErrorIf a step below fails, save the error as requestsError
Try
ClaudeClaudeAsk Claude: 'You are reading an email that arrived in a product team's inbox. Find the feature requests in it, and write each one as an actionable item for the team's backlog.@intake.product_contextAsk Claude: 'You are reading an email that arrived in a product team's inbox. Find the feature requests in it, and write each one as an actionable item for the team's backlog.@intake.product_context A feature request asks for the product to do something it does not do today: a new feature, a change to how something works, an integration, a setting, a report, support for another platform or file format. It still counts when it arrives as a complaint ('there is no way to export this'), as a question that shows the product falls short ('can I bulk-edit invoices?'), or when the sender is passing on what a customer asked for. It does not count when the email is only a bug report about something that should already work, a billing or account question, a question about using something that already exists, praise, a sales pitch, a newsletter, a receipt or an automated notification. Reply in exactly this format, with nothing before or after it. For example: TITLE: CSV export for the revenue report - Add CSV export to the monthly revenue report - Let finance schedule that export to arrive on the first of each month Rules: - The TITLE line is a short name for the main request, at most eight words, naming the feature rather than the email. - Then one line per distinct request, each starting with '- ' and a verb. At most twenty, the most important first. - Keep the specifics the email gives - which screen, which format, which integration, who needs it, by when - so each line makes sense without the email. - Say what they asked for, not how to build it. Do not invent requests the email does not make. - A request has to be for the team's own product - something they could build or change - not for a tool they use, a document, or a service someone else provides. - If the sender forwards or passes on someone else's message, the requests in it count. - Lines starting with '>', and anything below a line such as 'On Tuesday, Dana wrote:' or a 'From: ... Sent: ...' block, are earlier messages in the conversation. A request that appears only there counts when the new part of the email passes it on or adds another voice to it ('see the customer's request below', '+1, we need this too'), but not when the new part only chases an update on it, thanks someone for it or acknowledges it. - When in doubt whether something is a feature request, include it.@intake.product_rule - If the email contains no feature request at all, reply with exactly NONE and nothing else.@intake.email_block'. Save it as requestsResponse. Maximum response length: 1000
TextTrim requestsResponse.response_text and save it as requestsReply.Trim requestsResponse.response_text and save it as requestsReply.
On error
Decisions & LoopsStop and report a problem: intake.ai_failure_prefix plus requestsError.message.Stop and report a problem: intake.ai_failure_prefix plus requestsError.message.
Decisions & LoopsIf requestsReply is emptyIf requestsReply is empty
Yes
Decisions & LoopsStop and report a problem: intake.ai_failure_prefixnothing - its reply was empty.Stop and report a problem: intake.ai_failure_prefixnothing - its reply was empty.
No
No steps
Decisions & LoopsIf requestsReply starts with NONEIf requestsReply starts with NONE
Yes
Decisions & LoopsFinish the run: intake.no_request_reason.Finish the run: intake.no_request_reason.
No
No steps
ValuesSet summaryText to blank.Set summaryText to blank.
ValuesSet summaryProblem to blank.Set summaryProblem to blank.
Decisions & LoopsIf a step below fails, save the error as summaryErrorIf a step below fails, save the error as summaryError
Try
ClaudeClaudeAsk Claude: 'Summarise this email for a product manager, who will read your summary in the team's feature-request log instead of opening the email.@intake.product_contextAsk Claude: 'Summarise this email for a product manager, who will read your summary in the team's feature-request log instead of opening the email.@intake.product_context Write three to five sentences of plain prose. Cover who is asking - their name, and their role and company if the email says; what they want and the problem it would solve for them; how they manage without it today, if they say; and anything that shows how much it matters, such as a deadline, a renewal or deal that depends on it, how many people it affects, or a plan to leave. If the sender is passing on a customer's request, say who the customer is and who passed it on, and if the email chases a request made earlier in the conversation, say so. Lines starting with '>', and anything below a line such as 'On Tuesday, Dana wrote:', are earlier messages: use them as context, and summarise a request made there only when the new part passes it on. Keep the names, numbers, dates and amounts. Leave out greetings, signatures and legal footers. Do not judge whether the request is a good idea, do not add a heading, bullets or a closing line, and do not open with 'This email'.@intake.email_block'. Save it as summaryResponse. Maximum response length: 500
TextTrim summaryResponse.response_text and save it as summaryText.Trim summaryResponse.response_text and save it as summaryText.
On error
ValuesChange summaryProblem to summaryError.message.Change summaryProblem to summaryError.message.
CodeRun Python code on requests_reply, summary, summary_problem, intake, and include_email_text and save it as page.Run Python code on requests_reply, summary, summary_problem, intake, and include_email_text and save it as page.
Decisions & LoopsIf page.has_requests is noIf page.has_requests is no
Yes
Decisions & LoopsFinish the run: page.skip_reason.Finish the run: page.skip_reason.
No
No steps
Decisions & LoopsIf a step below fails, save the error as notionErrorIf a step below fails, save the error as notionError
Try
NotionNotionCreate the page page.title in intake.database_id.Create the page page.title in intake.database_id.
On error
Decisions & LoopsStop and report a problem: page.failure_prefix plus notionError.message.Stop and report a problem: page.failure_prefix plus notionError.message.
Decisions & LoopsIf summaryProblem isn't emptyIf summaryProblem isn't empty
Yes
ValuesShow in the output: page.summary_warning.Show in the output: page.summary_warning.
No
No steps
ValuesShow in the output: page.done_message.Show in the output: page.done_message.