Turns each new recording into a Notion page holding its summary and transcript, and never files the same one twice.
UsesFireflies.ai
Notion
OpenAI
File recordings in Notion as summaries and transcripts
Every six hours, the recordings Fireflies has transcribed for you are checked and any not yet filed become a page in your Notion database. Each page holds an AI summary, with an overview, the key points and the follow-ups people agreed to, then the transcript itself, so the conversation is searchable rather than only playable.
A recording is matched to its page by a reference tag in the page title, so re-running never files the same conversation twice. The summary is written strictly from the transcript, with no advice, no opinions and no facts the recording does not contain. A recording whose transcript or summary comes back empty is left for the next run, not filed half finished, and the transcript is capped so Notion accepts the page; a page that is cut short says so and links to the full recording.
You need a Fireflies account and a Notion database to file into. Nothing is written into the database's columns beyond the page title, so it needs no particular fields.
notionDatabaseId to blank.Set notionDatabaseId to blank.maxRecordings to 5.Set maxRecordings to 5.maxTranscriptLines to 60.Set maxTranscriptLines to 60.notionDatabaseId and save it as databaseId.Trim notionDatabaseId and save it as databaseId.lineBudget to maxTranscriptLines multiplied by 1.Set lineBudget to maxTranscriptLines multiplied by 1.lineBudget is greater than 80If lineBudget is greater than 80lineBudget to 80.Change lineBudget to 80.lineBudget is less than 1If lineBudget is less than 1lineBudget to 1.Change lineBudget to 1.recordingLimit to maxRecordings multiplied by 1.Set recordingLimit to maxRecordings multiplied by 1.recordingLimit is greater than 25If recordingLimit is greater than 25recordingLimit to 25.Change recordingLimit to 25.recordingLimit is less than 1If recordingLimit is less than 1recordingLimit to 1.Change recordingLimit to 1.recordings.List Fireflies meetings. Save it as recordings.filed to 0.Set filed to 0.skipped to 0.Set skipped to 0.recording in recordings.meetings:For each recording in recordings.meetings:filed is greater than or equal to recordingLimitIf filed is greater than or equal to recordingLimitrecording.id and save it as recordingId.Trim recording.id and save it as recordingId.recordingId is empty or recordingId is nullIf recordingId is empty or recordingId is nullskipped.Add 1 to skipped.A recording came back with no id, so it was skipped..Show in the output: A recording came back with no id, so it was skipped..marker to [ref: recordingId].Set marker to [ref: recordingId].recording.title and save it as recordingTitle.Trim recording.title and save it as recordingTitle.recordingTitle is empty or recordingTitle is nullIf recordingTitle is empty or recordingTitle is nullrecordingTitle to Untitled recording.Change recordingTitle to Untitled recording.filedAlready to false.Set filedAlready to false.dedupeChecked to false.Set dedupeChecked to false.existingPages to an empty list.Set existingPages to an empty list.searchErrorIf a step below fails, save the error as searchErrorexistingPages to the pages from the Notion “Search pages” step.Change existingPages to the pages from the Notion “Search pages” step.dedupeChecked to true.Change dedupeChecked to true.recordingTitle, so it was left for the next run.Show in the output: Could not check Notion for an existing page for recordingTitle, so it was left for the next run.dedupeChecked is noIf dedupeChecked is noskipped.Add 1 to skipped.existingPage in existingPages:For each existingPage in existingPages:existingPage.title contains marker (ignoring case)If existingPage.title contains marker (ignoring case)filedAlready to true.Change filedAlready to true.filedAlready is yesIf filedAlready is yestranscriptText to blank.Set transcriptText to blank.recordingLink to blank.Set recordingLink to blank.recordedOn to blank.Set recordedOn to blank.transcriptErrorIf a step below fails, save the error as transcriptErrorrecordingId. Save it as transcript.Get transcript for meeting recordingId. Save it as transcript.transcript.text and save it as transcriptText.Trim transcript.text and save it as transcriptText.transcript.transcript_url and save it as recordingLink.Trim transcript.transcript_url and save it as recordingLink.transcript.date and save it as recordedOn.Trim transcript.date and save it as recordedOn.recordingTitle, so nothing was filed for it.Show in the output: Could not read the transcript for recordingTitle, so nothing was filed for it.transcriptText is empty or transcriptText is nullIf transcriptText is empty or transcriptText is nullskipped.Add 1 to skipped.recordingTitle, so it was left for the next run.Show in the output: No transcript text came back for recordingTitle, so it was left for the next run.promptBody to Recording title: recordingTitleSet promptBody to Recording title: recordingTitle
Transcript:
.summaryPrompt to You are summarising one recorded conversation so it can be found again later.Set summaryPrompt to You are summarising one recorded conversation so it can be found again later.
Write three parts, in this order:
1. A two-sentence overview of what the conversation was about.
2. A line reading 'Key points:' followed by up to six short lines, one per point.
3. A line reading 'Follow-ups:' followed by the actions people agreed to, one per line, or the single line 'None stated.'
Rules you must follow:
- Use ONLY what the transcript below says. Do not add any name, figure, date or fact that does not appear in it.
- Do not give advice, opinions or recommendations of your own.
- Write plain text. Do not use markdown, asterisks or hash marks.
promptBody@transcriptText truncated to 12000 characters using as the ellipsis.summary to blank.Set summary to blank.summaryErrorIf a step below fails, save the error as summaryErrorsummary.Trim the response text from the OpenAI “Ask OpenAI” step and save it as summary.recordingTitle, so nothing was filed for it.Show in the output: Could not write a summary for recordingTitle, so nothing was filed for it.summary is empty or summary is nullIf summary is empty or summary is nullskipped.Add 1 to skipped.recordingTitle, so it was left for the next run.Show in the output: No summary came back for recordingTitle, so it was left for the next run.recordedLabel to recordedOn.Set recordedLabel to recordedOn.recordedLabel is empty or recordedLabel is nullIf recordedLabel is empty or recordedLabel is nullrecordedLabel to not stated.Change recordedLabel to not stated.linkLabel to recordingLink.Set linkLabel to recordingLink.linkLabel is empty or linkLabel is nullIf linkLabel is empty or linkLabel is nulllinkLabel to not available.Change linkLabel to not available.blocks to an empty list.Set blocks to an empty list.blocks and save it as blocks.Add a record of object, type, and paragraph to the end of blocks and save it as blocks.blocks and save it as blocks.Add a record of object, type, and paragraph to the end of blocks and save it as blocks.blocks and save it as blocks.Add a record of object, type, and paragraph to the end of blocks and save it as blocks.blocks and save it as blocks.Add a record of object, type, and paragraph to the end of blocks and save it as blocks.blocks and save it as blocks.Add a record of object, type, and paragraph to the end of blocks and save it as blocks.linesUsed to 0.Set linesUsed to 0.transcriptTruncated to false.Set transcriptTruncated to false.line in transcriptText split by a new line:For each line in transcriptText split by a new line:linesUsed is greater than or equal to lineBudgetIf linesUsed is greater than or equal to lineBudgettranscriptTruncated to true.Change transcriptTruncated to true.line and save it as lineText.Trim line and save it as lineText.lineText is emptyIf lineText is emptyblocks and save it as blocks.Add a record of object, type, and paragraph to the end of blocks and save it as blocks.linesUsed.Add 1 to linesUsed.transcriptTruncated is yesIf transcriptTruncated is yesblocks and save it as blocks.Add a record of object, type, and paragraph to the end of blocks and save it as blocks.pageTitle to recordingTitle truncated to 120 characters using as the ellipsis marker.Set pageTitle to recordingTitle truncated to 120 characters using as the ellipsis marker.notionErrorIf a step below fails, save the error as notionErrorpageTitle in databaseId.Create the page pageTitle in databaseId.filed.Add 1 to filed.skipped.Add 1 to skipped.recordingTitle, so it was left for the next run.Show in the output: Notion would not accept the page for recordingTitle, so it was left for the next run.filed recording(s) in Notion. Left for the next run: skipped.Show in the output: Filed filed recording(s) in Notion. Left for the next run: skipped.