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
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 meetingIdErrorTry
meeting.id and save it as meetingId.Trim meeting.id and save it as meetingId.On error
meetingIdError as text.Show in the output: Skipped a meeting that came back without an id: meetingIdError as text.meetingId is emptyIf meetingId is emptyYes
No
No steps
tasksAlreadyLogged to -1.Set tasksAlreadyLogged to -1.lookupErrorIf a step below fails, save the error as lookupErrorTry
tasksAlreadyLogged.Count the items in the records from the Airtable “List records” step and save it as tasksAlreadyLogged.On error
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 0Yes
meetingId was skipped - its actions are already in the tracker.Show in the output: Meeting meetingId was skipped - its actions are already in the tracker.No
No steps
meetingNotes to blank.Set meetingNotes to blank.notesErrorIf a step below fails, save the error as notesErrorTry
meetingNotes.Trim the text from the Fireflies.ai “Get meeting transcript” step and save it as meetingNotes.On error
meetingId: notesError as text.Show in the output: Could not read the notes for meeting meetingId: notesError as text.meetingNotes is emptyIf meetingNotes is emptyYes
No
No steps
meetingTitle to blank.Set meetingTitle to blank.titleErrorIf a step below fails, save the error as titleErrorTry
meeting.title and save it as meetingTitle.Trim meeting.title and save it as meetingTitle.On error
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 emptyYes
meetingTitle to Untitled meeting.Change meetingTitle to Untitled meeting.No
No steps
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 modelErrorTry
agreedActions.Trim the response text from the OpenAI “Ask OpenAI” step and save it as agreedActions.On error
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 emptyYes
No
No steps
agreedActions 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 emptyYes
No
No steps
actionText in lowercase is noneIf actionText in lowercase is noneYes
No
No steps
actionText doesn't contain |If actionText doesn't contain |Yes
actionText.Show in the output: Ignored a line that was not in the 'task | owner | due' form: actionText.No
No steps
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 emptyYes
actionText.Show in the output: Ignored a line with no task in it: actionText.No
No steps
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 noYes
ownerField to ownerText.Change ownerField to ownerText.taskStatus to To do.Change taskStatus to To do.No
No steps
dueText to Not stated.Set dueText to Not stated.actionParts is greater than 2If the length of actionParts is greater than 2Yes
actionParts[2] and save it as statedDue.Trim actionParts[2] and save it as statedDue.statedDue isn't emptyIf statedDue isn't emptyYes
dueText to statedDue.Change dueText to statedDue.No
No steps
No
No steps
taskSaved to false.Set taskSaved to false.saveErrorIf a step below fails, save the error as saveErrorTry
taskTableName.Add a record to taskTableName.taskSaved to true.Change taskSaved to true.On error
saveError as text.Show in the output: Could not add the task '@taskText' to your tracker: saveError as text.taskSaved is yesIf taskSaved is yesYes
tasksAdded.Add 1 to tasksAdded.ownerIsUnknown is yesIf ownerIsUnknown is yesYes
taskText (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.No
No steps
No
No steps
tasksAdded is greater than 0If tasksAdded is greater than 0Yes
recapBody 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 emptyYes
recapBody 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
.No
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 trackerrecapBodyNo
No steps