โก
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
๐ Built for
Notion Custom Agent Buildathon
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)
- Calendar event with a Google Meet link exists in Notion Calendar
- Call happens โ Notion Calendar transcribes in real time via
/note
- AI Meeting Notes page lands automatically in Meeting Notes database
- Agent triggers, extracts tasks, posts to Slack โ zero manual steps
Mode B โ With manual notes
- Create a new page in Meeting Notes, write notes during the call
- Click Process Meeting button when notes are ready
- Agent triggers, extracts tasks, posts to Slack
โ
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.
-
1
Three gates before expensive work
Status check โ idempotency check โ content check. Each costs 1โ2 actions. A duplicate trigger exits at Gate 0B for 1 action instead of re-running the full pipeline.
-
2
Attendees-first name resolution
The agent checks the Attendees field (already in memory) before querying Team Directory. For a 6-person meeting where everyone is tagged, zero additional DB queries are needed for name resolution.
-
3
Agent View with 3 columns
The Team Directory Agent View exposes only Full Name, Notion User, and Slack Handle. The full directory may have 20+ columns. Hiding them cuts token cost on each lookup by ~85%.
-
4
Typed SOP prompt
Every step produces a typed intermediate output. Explicit verb lists, exact date resolution rules, and keyword-based priority inference replace open-ended reasoning with pattern matching โ the cheapest possible AI operation.
-
5
Slack fires last and conditionally
Step 10 only executes after Step 9 confirms both writes succeeded. If zero tasks were created (e.g. a decisions-only meeting), no Slack message is posted at all.
-
6
Estimated cost per run: ~15 actions
Measured on a real meeting with 7 action items across 2 attendees. vs. 20โ40+ actions for an unoptimised agent with no gates, full DB access, and a vague extraction prompt.
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.
-
1
Duplicate the starter workspace
Opens a pre-built Notion workspace with Meeting Notes, Tasks, and Team Directory already configured with the correct schemas and views.
-
2
Add team members to Team Directory
One row per person: Full Name (as they'll be mentioned in meetings), Notion User, Slack Handle. The Agent View is pre-built โ no configuration needed.
-
3
Create the Custom Agent
In Notion Settings โ Connections โ Custom Agents. Name it "Meeting to Action". Set trigger: Meeting Notes DB, Status property changed. Grant access to Meeting Notes (edit), Tasks (edit), Team Directory Agent View (view).
-
4
Connect Slack and paste the prompt
Add Slack in the agent Connections panel. Grant Post permission to your target channel. Paste the instruction prompt from above into the Instructions field. Update the default Slack channel name at the top.
-
5
Optional: connect Notion Calendar
For zero-touch mode. Connect Notion Calendar to your Google Calendar, set the default AI Meeting Notes database to Meeting Notes. Add a Notion Automation: page created in Meeting Notes โ set Status = "Needs Processing".