{
  "id": "uWXfAKNr8y3eNGPN",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Fireflies Meeting Summary Generator",
  "tags": [],
  "nodes": [
    {
      "id": "e85d42cb-2d0c-4ef3-bf74-8da917225114",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -496,
        1440
      ],
      "parameters": {
        "path": "437a1a60-35af-4c81-9058-176d825b7173",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2.1
    },
    {
      "id": "5e60de8c-9768-4596-8cf2-6fca402597d0",
      "name": "Retrieve an existing folder",
      "type": "n8n-nodes-dart.dart",
      "position": [
        752,
        1456
      ],
      "parameters": {
        "id": "u4FhgTk3stn7",
        "resource": "Folder",
        "operation": "Get Folder",
        "requestOptions": {}
      },
      "credentials": {
        "dartApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4b35b0d9-4fa9-489d-a64a-77f388647de8",
      "name": "Create a new doc",
      "type": "n8n-nodes-dart.dart",
      "position": [
        1168,
        1472
      ],
      "parameters": {
        "item": "={\n  \"title\": \"{{ $('Get a transcript').item.json.data.title }}\",\n  \"text\": \"Overview:\\n\\n{{ $('Parsing stage for logic result').item.json.summary.overview }}\\n\\nSummary:\\n\\n{{ $('Parsing stage for logic result').item.json.summary.summary }}\\n\\nKey items:\\n\\n{{ $('Parsing stage for logic result').item.json.summary.key_items }}\\n\\nAction Items:\\n\\n{{ $('Parsing stage for logic result').item.json.summary.action_items }}\"\n}\n",
        "resource": "Doc",
        "operation": "Create Doc",
        "requestOptions": {}
      },
      "credentials": {
        "dartApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "20b69417-1bfc-46aa-9248-cef1bacccf5c",
      "name": "Create a new task",
      "type": "n8n-nodes-dart.dart",
      "position": [
        2240,
        1488
      ],
      "parameters": {
        "item": "={\n  \"title\": \"Review recent meeting: {{ $('Get a transcript').item.json.data.title }}\",\n\n  \"description\": \"View meeting summary here: {{ $json.item.htmlUrl }} \\n \\n [Fireflies meeting link]({{ $('Get a transcript').item.json.data.transcript_url }})\"\n}\n",
        "resource": "Task",
        "operation": "Create Task",
        "requestOptions": {}
      },
      "credentials": {
        "dartApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "56073419-d61f-4ba3-ab34-3a0570404e00",
      "name": "Retrieve an existing dartboard",
      "type": "n8n-nodes-dart.dart",
      "position": [
        1616,
        1456
      ],
      "parameters": {
        "id": "K7jRC0JC2Wxz",
        "resource": "Dartboard",
        "operation": "Get Dartboard",
        "requestOptions": {}
      },
      "credentials": {
        "dartApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "f3ea69f3-cbd3-47b4-a321-4b2e0f39645b",
      "name": "Retrieve an existing doc",
      "type": "n8n-nodes-dart.dart",
      "position": [
        2048,
        1488
      ],
      "parameters": {
        "id": "={{ $('Create a new doc').item.json.item.id }}",
        "resource": "Doc",
        "operation": "Get Doc",
        "requestOptions": {}
      },
      "credentials": {
        "dartApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "aa95f65d-5812-4d3d-879d-ffaf4cf8692c",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1056,
        1136
      ],
      "parameters": {
        "width": 448,
        "height": 576,
        "content": "## Meeting Summary Generator (Fireflies.AI \u2192 Dart)  \nAutomatically generate a meeting summary from your meetings through Fathom, save it to a Dart document, and create a review task with the Fathom link attached.  \n\n### Who\u2019s It For  \n- Teams or individuals needing automatic meeting notes  \n- Project managers tracking reviews and actions  \n- Users of Fireflies + Dart for streamlined documentation  \n\n### How to Set Up  \n- Connect your Dart account (workspace + folder access)  \n- Add your PROD webhook link in the webhook node to Fireflies API settings ([Docs](https://docs.fireflies.ai/graphql-api/webhooks)) \n- Add your [API key](https://docs.fireflies.ai/fundamentals/authorization) on the Fireflies Transcript node\n- Replace dummy Folder ID and Dartboard ID with your targets  \n- Choose your preferred AI model for summaries  \n\n### Customizing the Workflow  \n- Edit the AI prompt to adjust tone or style  \n- Add or change summary sections (e.g., Key takeaways, Action Items, Summary)  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "022adf2d-b07b-400a-b3fa-f15ed2e08881",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -336,
        1072
      ],
      "parameters": {
        "color": 7,
        "width": 512,
        "height": 672,
        "content": "## 1. Workflow launch through Fireflies AI webhook trigger\nTriggered by an online meeting completion connected to Fireflies\n\n**Summary categorization**\nAI generates summary from fireflies transcript node with these categories in mind:\n- Overview\n- Summary\n- Key items \n- Action items\n\n\n**Model selection**\nTest and use any AI chat model. (Results could vary by model quality)"
      },
      "typeVersion": 1
    },
    {
      "id": "6d97e704-98fb-412c-b11a-536c62e95dc0",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        240,
        1200
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 416,
        "content": "## 2. Parsing the AI output\nParse output into a usable format for the next nodes.\n\n### JSON formatting\n- **Parse:** AI output into structured JSON  \n- **Extract:** Key takeaways, Topics covered, Next items, Action items\n- **Ensure:** Clean, consistent, taggable data"
      },
      "typeVersion": 1
    },
    {
      "id": "4d739392-bcb0-4305-92a9-f17b47e77082",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        624,
        1200
      ],
      "parameters": {
        "color": 7,
        "width": 352,
        "height": 432,
        "content": "## 3. Retrieve target folder\nSelect the Folder in your workspace where new meeting documents will be created.\n\n### Folder targeting\n- Locate your Folder ID in the workspace  \n- Replace the placeholder ID in this node\n- Confirms all generated documents route to the correct folder\n"
      },
      "typeVersion": 1
    },
    {
      "id": "0a46bf0e-76da-4bc1-971c-8f9a6ad162fc",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1040,
        1200
      ],
      "parameters": {
        "color": 7,
        "width": 368,
        "height": 432,
        "content": "## 4. Create new document\nThis step creates a new document in your selected folder containing the generated meeting summary.\n\n### Document creation includes\n- Document title\n- Key takeaways\n- Topics covered\n- Next items\n- Action items \n"
      },
      "typeVersion": 1
    },
    {
      "id": "5cea5d1b-c220-44cb-96af-52f1c5d026ae",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1472,
        1200
      ],
      "parameters": {
        "color": 7,
        "width": 400,
        "height": 432,
        "content": "## 5. Retrieve target dartboard\nSelect the Dartboard in your workspace where new tasks will be created.\n\n### Dartboard targeting\n- Locate your Dartboard ID in the workspace  \n- Replace the placeholder ID in this node\n- Confirms all generated tasks route to the correct board\n"
      },
      "typeVersion": 1
    },
    {
      "id": "2af85a1d-db82-4e7e-896b-f260e40d3f4c",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1936,
        1168
      ],
      "parameters": {
        "color": 7,
        "width": 496,
        "height": 496,
        "content": "## 6. Create a review task in Dart  \nCreate a task in Dart to review the summary of your recent online meeting through your newly linked document.  \n\n### Task creation includes  \n- **CTA to view meeting summary** + linked newly generated document  \n- **CTA to view Fireflies meeting recording** + Fathom recording link  \n\n### Outcome  \nA review task is automatically generated in Dart, connecting both your meeting summary and Fireflies recording for seamless follow-up.  "
      },
      "typeVersion": 1
    },
    {
      "id": "2b001f3c-1024-4f9b-8bbd-9149e58a27bf",
      "name": "Get a transcript",
      "type": "@firefliesai/n8n-nodes-fireflies.fireflies",
      "position": [
        -272,
        1440
      ],
      "parameters": {
        "transcriptId": "={{ $json.body.meetingId }}"
      },
      "credentials": {
        "firefliesApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "718dbe93-e008-42eb-97e3-ecd0351cb3ca",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        -128,
        1600
      ],
      "parameters": {
        "options": {},
        "modelName": "models/gemini-2.5-pro"
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4a68f164-43bb-45bf-bd7a-6a329b63ed07",
      "name": "Parsing stage for logic result",
      "type": "n8n-nodes-base.code",
      "position": [
        336,
        1456
      ],
      "parameters": {
        "jsCode": "// Get raw input\nlet rawString = $input.first().json.output;\n\n// Clean up markdown formatting if present\nrawString = rawString\n  .trim()\n  .replace(/^```(json)?/i, '')  // remove leading ``` or ```json\n  .replace(/```$/i, '')         // remove trailing ```\n  .trim();\n\n// Try parsing the cleaned string\nlet parsed;\ntry {\n  parsed = JSON.parse(rawString);\n} catch (error) {\n  throw new Error(`Failed to parse JSON. Cleaned input was:\\n${rawString}\\n\\nError: ${error.message}`);\n}\n\nreturn parsed;"
      },
      "typeVersion": 2
    },
    {
      "id": "4d5c9cab-ee63-4731-a702-625f28b4e0a8",
      "name": "Fireflies auto-summary",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -96,
        1440
      ],
      "parameters": {
        "text": "=You are a silent, automated JSON-generating AI. Your only purpose is to analyze a meeting transcript and return a single, valid JSON object.\n\nCRITICAL RULES:\n\n- Your entire response MUST be a valid JSON object.\n- Do NOT include any text, greetings, or explanations before or after the JSON.\n- Do NOT wrap the JSON in Markdown code fences.\n- Do NOT output any characters before `{` or after `}`.\n\nTask:\nAnalyze the following input transcript and generate a JSON object according to the schema defined below.\n\nInput Transcript:\n{{ $json.data.summary.overview }}\n{{ $json.data.summary.short_summary }}\n{{ $json.data.summary.bullet_gist }}\n{{ $json.data.summary.action_items }}\n\nJSON Output Schema (you MUST follow EXACTLY):\n\n{\n  \"summary\": {\n    \"overview\": \"\",\n    \"summary\": \"\",\n    \"key_items\": \"\",\n    \"action_items\": \"\"\n  }\n}\n\nSchema Details:\n\n- summary.overview: (String) A brief, one-sentence overview of the meeting.\n- summary.summary: (String) A concise, one-paragraph summary of the discussion.\n- summary.key_items: (String) A single string containing all major decisions or key points. If multiple items exist, join them with semicolons.\n- summary.action_items: (String) A single string containing all action items. If multiple items exist, join them with semicolons. Each item should follow this format:\n\n  description - assigned_to - due_date\n\n  Example:\n  \"Prepare budget report - Sarah Lee - 2025-01-15\"\n\nData Handling Rules:\n\n- If no information is found for any field, return an empty string.\n- Do NOT omit any keys.\n- Ensure all text is in plain English and properly escaped for JSON.\n- Convert key items and action items to plain STRING output (not arrays).\n",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 3
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "6d335d70-508c-4d20-8de6-462ef48bd9ee",
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "Get a transcript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create a new doc": {
      "main": [
        [
          {
            "node": "Retrieve an existing dartboard",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get a transcript": {
      "main": [
        [
          {
            "node": "Fireflies auto-summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fireflies auto-summary": {
      "main": [
        [
          {
            "node": "Parsing stage for logic result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Fireflies auto-summary",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Retrieve an existing doc": {
      "main": [
        [
          {
            "node": "Create a new task",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Retrieve an existing folder": {
      "main": [
        [
          {
            "node": "Create a new doc",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parsing stage for logic result": {
      "main": [
        [
          {
            "node": "Retrieve an existing folder",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Retrieve an existing dartboard": {
      "main": [
        [
          {
            "node": "Retrieve an existing doc",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}