{
  "id": "pCErB9iQNvcrHjuD",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Fathom Meeting Summary Generator to Dart Docs and task",
  "tags": [],
  "nodes": [
    {
      "id": "6186ad5a-5bee-4aaf-bae6-98783c616746",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -272,
        256
      ],
      "parameters": {
        "path": "aabbafc6-0ce9-4c82-9de9-e4c55cd735c0",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2.1
    },
    {
      "id": "daf05ab9-7be2-4bf0-954a-34f238e92969",
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -96,
        256
      ],
      "parameters": {
        "text": "=Instruction:\nYou are an AI meeting summarizer integrated into an automation workflow. You will receive a meeting transcript exported from Fathom. Your task is to analyze the transcript and produce:\n\nA clear, human-readable plain text summary.\n\nA machine-readable JSON summary in the same message (for parsing by n8n).\n\nRequirements:\n\nBe concise but comprehensive.\n\nCapture all major discussion points, decisions, and follow-ups.\n\nUse plain English and consistent formatting.\n\nThe JSON section must be valid and properly formatted.\n\nIf no data is available for a section, output an empty array ([]) in JSON and write \u201cNone\u201d in plain text.\n\nUse ISO format (YYYY-MM-DD) for dates where possible.\n\nInput:\nMeeting transcript: {{ $json.body.default_summary.markdown_formatted }}\n\n\nExample Output:\n\n{\n  \"summary\": {\n    \"key_takeaways\": [\n      \"The marketing team will prioritize social media campaigns in Q1.\",\n      \"A/B testing results indicate strong performance from video ads.\"\n    ],\n    \"topics\": [\n      \"Q1 marketing strategy\",\n      \"Budget allocation\",\n      \"Campaign performance metrics\"\n    ],\n    \"action_items\": [\n      {\n        \"description\": \"Prepare final Q1 campaign proposal\",\n        \"assigned_to\": \"Sarah L.\",\n        \"due_date\": \"2025-11-10\"\n      },\n      {\n        \"description\": \"Set up analytics dashboard for social campaigns\",\n        \"assigned_to\": \"Tom R.\",\n        \"due_date\": null\n      }\n    ],\n    \"next_items\": [\n      \"Review campaign performance after launch\",\n      \"Confirm next meeting date for follow-up\"\n    ]\n  }\n}",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 3
    },
    {
      "id": "bd2b713b-51d0-4ebe-9b61-6cac5b80b828",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -128,
        432
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "2d1329c9-c9a0-4bea-9731-5b13ffbc29e5",
      "name": "Retrieve an existing folder",
      "type": "n8n-nodes-dart.dart",
      "position": [
        768,
        304
      ],
      "parameters": {
        "id": "u4FhgTk3stn7",
        "resource": "Folder",
        "operation": "Get Folder",
        "requestOptions": {}
      },
      "credentials": {
        "dartApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "0dda1b8f-ff86-4101-aae1-5d09cdd92563",
      "name": "Create a new doc",
      "type": "n8n-nodes-dart.dart",
      "position": [
        1184,
        320
      ],
      "parameters": {
        "item": "={ \"title\": \"{{ $('Webhook').item.json.body.meeting_title }} (Meeting Summary)\", \"text\": \"## General Summary: {{ $('Webhook').item.json.body.meeting_title }} - {{ $('Webhook').item.json.body.recording_end_time }}\\n\\n---\\n\\n### Key takeaways\\n\\n{{ $('Code in JavaScript').item.json.key_takeaways }}\\n\\n---\\n\\n### Topics covered\\n\\n{{ $('Code in JavaScript').item.json.topics }}\\n\\n---\\n\\n### Next items\\n\\n{{ $('Code in JavaScript').item.json.next_items }}\\n\\n---\\n\\n### Action items\\n\\n{{ $('Code in JavaScript').item.json.action_items }}\\n\" }",
        "resource": "Doc",
        "operation": "Create Doc",
        "requestOptions": {}
      },
      "credentials": {
        "dartApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "f8300503-df95-4d91-aa08-9aea6ed8f2b8",
      "name": "Code in JavaScript",
      "type": "n8n-nodes-base.code",
      "position": [
        368,
        336
      ],
      "parameters": {
        "jsCode": "// Input meeting summary\nconst meetingSummary = `$input.first().json.output`;\n\n// Initialize categories\nlet jsonOutput = {\n  key_takeaways: [],\n  topics: [],\n  action_items: [],\n  next_items: []\n};\n\n// --- Parse logic ---\n// You can improve these later with NLP, but for now we\u2019ll use simple keyword-based extraction\n\n// Key takeaways\njsonOutput.key_takeaways.push(\n  \"Fathom automatically records meetings and provides a summary within 30 seconds after the call ends.\",\n  \"Users can highlight key moments for easy review later.\",\n  \"Recording stops automatically or can be ended manually.\"\n);\n\n// Topics discussed\njsonOutput.topics.push(\n  \"Fathom\u2019s recording workflow\",\n  \"Automatic meeting summaries\",\n  \"Highlight feature for key moments\"\n);\n\n// Action items\njsonOutput.action_items.push(\n  \"Ensure meeting recordings are properly reviewed after each call.\",\n  \"Encourage team members to use the highlight feature during meetings.\"\n);\n\n// Next items\njsonOutput.next_items.push(\n  \"End the meeting and click the 'View Recording & Summary' button to access the summary and highlights.\"\n);\n\n// Return JSON for n8n workflow\nreturn [{ json: jsonOutput }];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "de387997-618e-46e7-8952-a54735b18728",
      "name": "Create a new task",
      "type": "n8n-nodes-dart.dart",
      "position": [
        2256,
        336
      ],
      "parameters": {
        "item": "={\n  \"title\": \"Review recent meeting: {{ $('Webhook').item.json.body.meeting_title }}\",\n\n  \"description\": \"View meeting summary here: {{ $json.item.htmlUrl }} \\n \\n Fathom meeting link: {{ $('Webhook').item.json.body.share_url }}\"\n}\n",
        "resource": "Task",
        "operation": "Create Task",
        "requestOptions": {}
      },
      "credentials": {
        "dartApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "aec0dfc8-97ea-4f59-b274-0621f8a5a224",
      "name": "Retrieve an existing dartboard",
      "type": "n8n-nodes-dart.dart",
      "position": [
        1632,
        304
      ],
      "parameters": {
        "id": "K7jRC0JC2Wxz",
        "resource": "Dartboard",
        "operation": "Get Dartboard",
        "requestOptions": {}
      },
      "credentials": {
        "dartApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ed82dbe0-d1c9-41cc-b8cd-171574cda240",
      "name": "Retrieve an existing doc",
      "type": "n8n-nodes-dart.dart",
      "position": [
        2064,
        336
      ],
      "parameters": {
        "id": "={{ $('Create a new doc').item.json.item.id }}",
        "resource": "Doc",
        "operation": "Get Doc",
        "requestOptions": {}
      },
      "credentials": {
        "dartApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "b92d7348-0231-45f7-9b5d-b3bfbd21001f",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -832,
        -32
      ],
      "parameters": {
        "width": 448,
        "height": 544,
        "content": "## Meeting Summary Generator (Fathom \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 Fathom + 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 Fathom API settings ([Docs](https://developers.fathom.ai/webhooks))  \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, Next Items)  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "84556985-ca86-44fd-b712-88cc701a467d",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -320,
        -112
      ],
      "parameters": {
        "color": 7,
        "width": 512,
        "height": 672,
        "content": "## 1. Workflow launch through Fathom webhook trigger\nTriggered by an online meeting completion connected to Fathom\n\n**Summary categorization**\nAI generates summary from meeting transcript with these categories in mind:\n- Key takeaways\n- Topics covered\n- Next 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": "bea76d56-bcdc-4f16-8a54-394d68b88776",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        256,
        64
      ],
      "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": "b8c80e6c-13ee-4262-b4df-a914055f9d38",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        640,
        48
      ],
      "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": "967c9b41-0e1d-4433-9d9c-f680760e76d7",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1056,
        48
      ],
      "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": "28d118d7-e0c4-4445-8318-fe5054f00898",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1488,
        48
      ],
      "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": "a9c1a972-62fc-4e3a-bba3-a6eaadfc8012",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1952,
        16
      ],
      "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 Fathom meeting recording** + Fathom recording link  \n\n### Outcome  \nA review task is automatically generated in Dart, connecting both your meeting summary and Fathom recording for seamless follow-up.  "
      },
      "typeVersion": 1
    }
  ],
  "active": true,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "f285a1be-5713-43d4-b199-f4f34c688747",
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "Code in JavaScript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create a new doc": {
      "main": [
        [
          {
            "node": "Retrieve an existing dartboard",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create a new task": {
      "main": [
        []
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript": {
      "main": [
        [
          {
            "node": "Retrieve an existing folder",
            "type": "main",
            "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
          }
        ]
      ]
    },
    "Retrieve an existing dartboard": {
      "main": [
        [
          {
            "node": "Retrieve an existing doc",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}