Reads each new meeting's notes, pulls out who agreed to do what by when, and adds a task for each to Airtable.
Uses
AirtableFireflies.ai
Gmail
OpenAI
Turn meeting notes into tracked tasks
Once a day, the notes of your latest recorded meetings in Fireflies are read and the AI pulls out the follow-up actions people actually agreed to: the task, who took it on and any deadline stated. Each action becomes one row in your Airtable task tracker, so what was agreed on a call is tracked like any other work rather than forgotten.
Each row records the task, owner, due date, meeting title and meeting ID with a status of 'To do'. An owner is never invented: when the notes do not say who took something on, the row is filed under 'Unassigned' with the status 'Needs an owner', and a recap email lists those still needing an owner. Rows are only ever added, and a meeting whose ID is already in the table is skipped, so the same actions are never filed twice. If that check cannot be made, the meeting waits for the next run rather than risking duplicates.
Your Airtable table needs the columns 'Task', 'Owner', 'Due', 'Meeting', 'Meeting ID' and 'Status', spelled exactly.
taskBaseId to blank.Set taskBaseId to blank.taskTableName to blank.Set taskTableName to blank.recapEmail to blank.Set recapEmail to blank.meetingsToCheck to 10.Set meetingsToCheck to 10.tasksAdded to 0.Set tasksAdded to 0.actionsNeedingAnOwner to an empty list.Set actionsNeedingAnOwner to an empty list.recentMeetings.List Fireflies meetings. Save it as recentMeetings.meeting in recentMeetings.meetings:For each meeting in recentMeetings.meetings:meetingId to blank.Set meetingId to blank.meetingIdErrorIf a step below fails, save the error as meetingIdErrormeeting.id and save it as meetingId.Trim meeting.id and save it as meetingId.meetingIdError as text.Show in the output: Skipped a meeting that came back without an id: meetingIdError as text.meetingId is emptyIf meetingId is emptytasksAlreadyLogged to -1.Set tasksAlreadyLogged to -1.lookupErrorIf a step below fails, save the error as lookupErrortasksAlreadyLogged.Count the items in the records from the Airtable “List records” step and save it as tasksAlreadyLogged.meetingId was already logged, so it is being left for the next run: lookupError as text.Show in the output: Could not check whether meeting meetingId was already logged, so it is being left for the next run: lookupError as text.tasksAlreadyLogged is not 0If tasksAlreadyLogged is not 0meetingId was skipped - its actions are already in the tracker.Show in the output: Meeting meetingId was skipped - its actions are already in the tracker.meetingNotes to blank.Set meetingNotes to blank.notesErrorIf a step below fails, save the error as notesErrormeetingNotes.Trim the text from the Fireflies.ai “Get meeting transcript” step and save it as meetingNotes.meetingId: notesError as text.Show in the output: Could not read the notes for meeting meetingId: notesError as text.meetingNotes is emptyIf meetingNotes is emptymeetingTitle to blank.Set meetingTitle to blank.titleErrorIf a step below fails, save the error as titleErrormeeting.title and save it as meetingTitle.Trim meeting.title and save it as meetingTitle.This meeting has no title; it will be logged as 'Untitled meeting'..Show in the output: This meeting has no title; it will be logged as 'Untitled meeting'..meetingTitle is emptyIf meetingTitle is emptymeetingTitle to Untitled meeting.Change meetingTitle to Untitled meeting.extractionPrompt to You are reading the notes from one meeting and listing only the follow-up actions people actually agreed to.Set extractionPrompt to You are reading the notes from one meeting and listing only the follow-up actions people actually agreed to.
Rules:
- List an action only when the notes make both the task and the person who took it on clear.
- Never guess an owner. If the notes do not say who owns an action, write the single word unassigned in the owner column.
- Write the owner's name exactly as the notes give it.
- One action per line, in the form: task | owner | due
- Fill the due column only when the notes state a deadline. Otherwise leave it empty.
- Do not add a header row, numbering, bullets, quotes, or any other commentary.
- If nobody agreed to do anything, reply with the single word none.
Meeting: meetingTitle
Notes:
meetingNotes truncated to 12000 characters.agreedActions to blank.Set agreedActions to blank.modelErrorIf a step below fails, save the error as modelErroragreedActions.Trim the response text from the OpenAI “Ask OpenAI” step and save it as agreedActions.meetingId: modelError as text.Show in the output: Could not pull the actions out of meeting meetingId: modelError as text.agreedActions is emptyIf agreedActions is emptyagreedActions by a new line and save it as actionLines.Split agreedActions by a new line and save it as actionLines.actionLine in actionLines:For each actionLine in actionLines:actionLine and save it as actionText.Trim actionLine and save it as actionText.actionText is emptyIf actionText is emptyactionText in lowercase is noneIf actionText in lowercase is noneactionText doesn't contain |If actionText doesn't contain |actionText.Show in the output: Ignored a line that was not in the 'task | owner | due' form: actionText.actionText by | and save it as actionParts.Split actionText by | and save it as actionParts.actionParts[0] and save it as taskText.Trim actionParts[0] and save it as taskText.taskText is emptyIf taskText is emptyactionText.Show in the output: Ignored a line with no task in it: actionText.actionParts[1] and save it as ownerText.Trim actionParts[1] and save it as ownerText.ownerText lowercase and save it as ownerWord.Make ownerText lowercase and save it as ownerWord.ownerWord split by a space and save it as ownerLastWord.Get the last item of ownerWord split by a space and save it as ownerLastWord.ownerIsUnknown to the length of ownerText is 0 or ownerWord is unassigned or ownerWord is unknown or ownerWord is tbd or ownerWord is n/a or ownerWord is none or ownerWord is team or ownerWord is everyone or ownerLastWord is team or ownerLastWord is everyone.Set ownerIsUnknown to the length of ownerText is 0 or ownerWord is unassigned or ownerWord is unknown or ownerWord is tbd or ownerWord is n/a or ownerWord is none or ownerWord is team or ownerWord is everyone or ownerLastWord is team or ownerLastWord is everyone.ownerField to Unassigned.Set ownerField to Unassigned.taskStatus to Needs an owner.Set taskStatus to Needs an owner.ownerIsUnknown is noIf ownerIsUnknown is noownerField to ownerText.Change ownerField to ownerText.taskStatus to To do.Change taskStatus to To do.dueText to Not stated.Set dueText to Not stated.actionParts is greater than 2If the length of actionParts is greater than 2actionParts[2] and save it as statedDue.Trim actionParts[2] and save it as statedDue.statedDue isn't emptyIf statedDue isn't emptydueText to statedDue.Change dueText to statedDue.taskSaved to false.Set taskSaved to false.saveErrorIf a step below fails, save the error as saveErrortaskTableName.Add a record to taskTableName.taskSaved to true.Change taskSaved to true.saveError as text.Show in the output: Could not add the task '@taskText' to your tracker: saveError as text.taskSaved is yesIf taskSaved is yestasksAdded.Add 1 to tasksAdded.ownerIsUnknown is yesIf ownerIsUnknown is yestaskText (from: meetingTitle) to the end of actionsNeedingAnOwner and save it as actionsNeedingAnOwner.Add - taskText (from: meetingTitle) to the end of actionsNeedingAnOwner and save it as actionsNeedingAnOwner.tasksAdded is greater than 0If tasksAdded is greater than 0recapBody to Added tasksAdded task(s) to your tracker from the latest meetings.Set recapBody to Added tasksAdded task(s) to your tracker from the latest meetings.actionsNeedingAnOwner isn't emptyIf actionsNeedingAnOwner isn't emptyrecapBody to recapBodyThese actions did not name an owner in the meeting. They are logged as Unassigned and someone needs to pick them up:Change recapBody to recapBodyThese actions did not name an owner in the meeting. They are logged as Unassigned and someone needs to pick them up:
actionsNeedingAnOwner joined by a new line
.recapBody to recapBodyEvery action found named an owner.Change recapBody to recapBodyEvery action found named an owner.recapBody to recapBodyOpen your task tracker to review them.Change recapBody to recapBodyOpen your task tracker to review them.recapEmail.Send an email to recapEmail.
Subject: Meeting actions added to your task trackerrecapBody