โšก

Meeting to Action

A Notion Custom Agent that transforms meeting transcripts into structured tasks and Slack notifications โ€” automatically, from the moment your call ends.

๐Ÿท๏ธ Type Notion Custom Agent
๐Ÿ”— Integrations Notion Databases Slack MCP Notion Calendar
โš™๏ธ Trigger Status โ†’ Needs Processing on Meeting Notes
๐Ÿ“ฆ Starter kit Duplicate workspace โ†’
๐Ÿ† Built for Notion Custom Agent Buildathon
On this page

The problem it solves

Every team has a version of this: a meeting ends, people scatter, and the action items live only in a Notion page that nobody will open again until the next standup โ€” when someone asks "wait, who was doing the API work?"

The real cost isn't the 20 minutes someone eventually spends creating tasks. It's the two days of drift before they do it.

Meeting to Action closes that loop automatically. The moment a call ends and notes are ready, the agent reads the transcript, extracts every action item, creates structured tasks with real owners and deadlines, and posts a formatted summary to Slack โ€” before anyone has closed their laptop.

๐Ÿ“Š For a team running 3 meetings per week, this agent eliminates roughly 45 minutes of manual task creation, 2โ€“3 clarifying Slack threads, and one status-check meeting per sprint.

How it works

The workflow has two modes depending on how you capture meeting notes:

Mode A โ€” With Notion AI Meeting Notes (recommended)

Mode B โ€” With manual notes

โœ… Both modes produce identical output. Mode A is fully zero-touch from call end to Slack message. Mode B requires one deliberate button click โ€” which also serves as a quality gate ensuring notes are complete before processing.

Architecture

The full pipeline

Meeting ends
Call transcript captured via /note or manually written
Trigger fires
Status โ†’ Needs Processing on Meeting Notes page
Gate 0A โ€” Status check
Halt if status โ‰  Needs Processing
Gate 0B โ€” Idempotency check
Halt if Agent Ran = true or tasks already linked
Gate 1 โ€” Content check
Halt if note body under 100 words โ†’ Status: Too Short
Extraction
Scan for action verbs โ†’ extract task, owner, time reference
Resolution
Match names โ†’ Notion users ยท resolve dates โ†’ ISO dates ยท infer priority
Tasks created in Notion
One row per action item, linked to Source Meeting
Meeting marked done
Agent Ran = true ยท Status = Done
Slack message posted
Task list with owners, due dates, and Notion link
๐Ÿ” Why three gates before extraction? Each gate is cheaper than a full run. The idempotency check (Gate 0B) is a single database read โ€” if the agent fires twice on the same page (re-trigger, testing), it halts at essentially zero cost instead of duplicating all tasks.

Database schemas

The agent reads from and writes to three databases. Access is granted per-database with least-privilege permissions โ€” the agent is blind to everything else in the workspace.

Meeting Notes โ€” agent reads + writes status fields

Property Type Role Notes
Title Title reads Format: "Meeting Name โ€” Date"
Meeting Date Date reads Critical. Anchor for all date resolution rules.
Attendees Person (multi) reads Checked first for name resolution โ€” avoids DB lookup.
Status Select reads + writes Options: Draft ยท Needs Processing ยท Done ยท Too Short
Agent Ran Checkbox reads + writes Idempotency flag. If true โ†’ agent halts immediately at zero cost.
Process Meeting Button trigger Sets Status โ†’ Needs Processing on click. The human quality gate.

Tasks โ€” agent creates rows here

Property Type Role Notes
Task Name Title writes Imperative action phrase extracted from notes.
Assignee Person writes Resolved from Attendees, then Team Directory. Never guessed.
Due Date Date writes Name must be exact. Resolved via explicit date rules from prompt.
Priority Select writes Options: High ยท Medium ยท Low โ€” inferred from urgency language.
Source Meeting Relation โ†’ Meeting Notes writes Traceability + idempotency. Links every task to its origin meeting.
Agent Created Checkbox writes Always true on agent-created rows. Enables filtered audit views.
Notes Text writes Only populated when owner is unresolvable: "Owner unclear โ€” mentioned as: [name]"

Team Directory โ€” Agent View only (3 columns exposed)

Property Type Notes
Full Name Title Must match how names appear in meeting notes exactly.
Notion User Person The actual Notion account assigned to the task.
Slack Handle Text Used for @mentions in Slack output. Format: @firstname
๐Ÿ’ก Why an Agent View? The full Team Directory may have 20+ columns. The agent reads every exposed column as context on every name lookup. Hiding irrelevant columns cuts token usage per lookup by ~85% โ€” one of the biggest single efficiency gains in the build.

The instruction prompt

The prompt is a typed SOP โ€” a rigid decision tree where every step produces a structured output that feeds the next. Vague instructions become expensive reasoning loops. Explicit rules become cheap pattern matching.

You are the Meeting to Action agent. Your job is to extract action items from meeting notes and create tasks in the Tasks database. You do not summarise, you do not add content to pages, you do not modify the page body under any circumstances, you do not send messages unless all tasks are confirmed created. Default Slack channel: #your-channel โ•โ•โ• STEP 0A โ€” STATUS GATE โ•โ•โ• Read "Status" on the triggered page. If Status โ‰  "Needs Processing" โ†’ stop immediately. โ•โ•โ• STEP 0B โ€” IDEMPOTENCY CHECK โ•โ•โ• 1. If "Agent Ran" = true โ†’ stop immediately. 2. Query Tasks where Source Meeting = this page. If any rows exist โ†’ stop immediately. โ•โ•โ• STEP 1 โ€” CONTENT CHECK โ•โ•โ• Count words in page body (not property fields). If under 100 โ†’ set Status = "Too Short", stop. โ•โ•โ• STEP 2 โ€” READ CONTEXT โ•โ•โ• Hold in memory: MEETING_DATE = Meeting Date property ATTENDEES = Attendees property list NOTES_BODY = full page body text Do not modify the page body at any point. โ•โ•โ• STEP 3 โ€” EXTRACT ACTION ITEMS โ•โ•โ• Scan NOTES_BODY for: will ยท needs to ยท should ยท agreed to ยท volunteered ยท is responsible for ยท action: ยท TODO: ยท must ยท has to ยท going to For each match extract: [action phrase] | [name] | [time reference] Skip: decisions with no assigned action. No name found โ†’ "Unassigned" No time reference โ†’ leave Due Date blank โ•โ•โ• STEP 4 โ€” RESOLVE OWNERS โ•โ•โ• 1. Check ATTENDEES list first. 2. If not found โ†’ query Team Directory Agent View. 3. If still not found โ†’ blank Assignee + Notes: "Owner unclear โ€” mentioned as: [name]" Never guess. Never approximate. โ•โ•โ• STEP 5 โ€” RESOLVE DATES โ•โ•โ• Anchor = MEETING_DATE "today" โ†’ MEETING_DATE "tomorrow" โ†’ MEETING_DATE + 1 day "this week" โ†’ Friday of MEETING_DATE week "end of this week" โ†’ Friday of MEETING_DATE week "by [weekday]" โ†’ nearest upcoming weekday "next week" โ†’ Friday of following week "end of next week" โ†’ Friday of following week "EOD" โ†’ MEETING_DATE No reference โ†’ blank โ•โ•โ• STEP 6 โ€” INFER PRIORITY โ•โ•โ• High โ†’ urgent ยท blocking ยท critical ยท must ยท ASAP ยท launch ยท deploy ยท release ยท date within 48h of MEETING_DATE Low โ†’ eventually ยท nice to have ยท no rush ยท someday ยท when you get a chance Medium โ†’ everything else (default) โ•โ•โ• STEP 7 โ€” CREATE TASKS โ•โ•โ• One row per extracted action item in Tasks DB: Task Name = imperative action phrase Assignee = resolved Notion user or blank Due Date = resolved ISO date or blank Priority = High / Medium / Low Source Meeting = this page Agent Created = true Notes = unresolved owner note if needed โ•โ•โ• STEP 8 โ€” VERIFY โ•โ•โ• Count created rows vs extracted items. If mismatch โ†’ retry missing rows once. If still mismatched โ†’ continue with warning. โ•โ•โ• STEP 9 โ€” MARK DONE โ•โ•โ• Set "Agent Ran" = true on this page. Set "Status" = "Done" on this page. โ•โ•โ• STEP 10 โ€” POST TO SLACK โ•โ•โ• Only after Step 9. Skip if zero tasks created. *[N] action items from [Title] โ€” [MEETING_DATE]* โ†’ *[First name]* โ€” [Task Name] (due [date] or "no date set") [sorted: High โ†’ Medium โ†’ Low] *Needs owner:* โ†’ [Task Name] โ€” [Notes field content] View in Notion โ†’ [link to this page] If Step 8 had a warning: โš  [X] of [Y] items created โ€” check Notion for gaps.

Cost efficiency design

Notion Custom Agents are billed per action. The architecture of this agent is designed to minimise actions on every code path.

See it in action

The demo below shows a real end-to-end run โ€” from a live meeting transcript to tasks in Notion and a formatted Slack message, with two named attendees resolved to their accounts.

Streamlining Task Management from Architectural Meetings
Watch on Loom ยท Meeting to Action ยท full pipeline demo

Setting it up

๐Ÿš€ Quickstart: Duplicate the workspace from the Starter Kit link below, add your team members to Team Directory, connect Slack in the agent settings, and paste the instruction prompt. The trigger and database relations are pre-configured.
๐Ÿ“Ž Starter Kit: Hackathon Starter Kit โ€” Duplicate Me โ†’
Includes pre-built database schemas, Agent View, and example meeting notes.