{
  "id": "9qZgMgOwa7OHsIuw",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Client Meeting Notes",
  "tags": [],
  "nodes": [
    {
      "id": "6d514387-7f59-4305-9453-882fcb530144",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3088,
        -1024
      ],
      "parameters": {
        "width": 512,
        "height": 1024,
        "content": "# Client Meeting Notes \u2192 Action Items Automation\n# How It Works\n\nThis workflow automates the processing of meeting notes from Google Sheets by identifying and handling only unprocessed records. It prepares the notes and sends them to an AI model, which extracts key insights such as action items, follow-ups and risks in a structured format. The extracted data is then formatted for readability and stored in an output sheet for tracking.\n\nFinally, the workflow marks the original record as processed to avoid duplication and sends a summary email containing all extracted details to the user. This ensures efficient meeting follow-up, clear task tracking and quick communication without manual effort.\n\n# Setup Steps\n\n## 1. Connect Google Sheets\nAuthenticate input and output sheets\n\n## 2. Configure Processing Logic\nEnsure only unprocessed rows are handled\n\n## 3. Configure AI Model\nConnect OpenAI/Groq and set extraction prompt\n\n## 4. Configure Output Storage\nMap extracted fields to output sheet\n\n## 5. Set Email Notification\nAdd recipient and email format\n\n## 6. Test Workflow\nRun and verify extraction and email output"
      },
      "typeVersion": 1
    },
    {
      "id": "1ebf108b-fd2a-4dfd-937d-7b7830deb750",
      "name": "Groq Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "position": [
        -1696,
        -96
      ],
      "parameters": {
        "model": "openai/gpt-oss-120b",
        "options": {}
      },
      "credentials": {
        "groqApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "400e38b9-87f0-4eb2-831d-f544d0d28403",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2544,
        -480
      ],
      "parameters": {
        "color": 7,
        "width": 368,
        "height": 416,
        "content": "## Input & Data Fetch\n\nFetches meeting notes from Google Sheets and triggers the workflow. Ensures only unprocessed records are considered for automation."
      },
      "typeVersion": 1
    },
    {
      "id": "db730d21-4c05-415d-b3f1-02b476344769",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2128,
        -480
      ],
      "parameters": {
        "color": 7,
        "width": 368,
        "height": 336,
        "content": "## Data Preparation\n\nPrepares and structures raw meeting notes and user details for AI processing, ensuring clean and usable input data."
      },
      "typeVersion": 1
    },
    {
      "id": "f028228c-2975-4aa2-9eb1-9c32f0409344",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1728,
        -480
      ],
      "parameters": {
        "color": 7,
        "width": 560,
        "height": 496,
        "content": "## AI Processing, Extraction & Data Transformation\n\nUses AI to extract action items, follow-ups and risks from meeting notes in structured JSON format. The output is then parsed and formatted into readable text fields for storage and reporting."
      },
      "typeVersion": 1
    },
    {
      "id": "8002a565-cf10-42bc-8c11-a29a84803fb8",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1120,
        -448
      ],
      "parameters": {
        "color": 7,
        "width": 688,
        "height": 336,
        "content": "## Data Storage & Notification\n\nStores extracted action items, follow-ups and risks in the output sheet, marks records as processed to avoid duplication and sends a summary email for quick review and follow-up actions."
      },
      "typeVersion": 1
    },
    {
      "id": "1fca1aad-1095-44fc-b6cf-52e9fcae3298",
      "name": "Starting Trigger",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -2496,
        -304
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "cb240eec-2299-4c13-9dcd-b757bbb4c047",
      "name": "Fetch Meeting Notes",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -2304,
        -304
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Z9JlUPMr00U9k385p64yZbj4VKMDcQVd9AKa6FVXE60/edit#gid=0",
          "cachedResultName": "meeting notes"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1Z9JlUPMr00U9k385p64yZbj4VKMDcQVd9AKa6FVXE60",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Z9JlUPMr00U9k385p64yZbj4VKMDcQVd9AKa6FVXE60/edit?usp=drivesdk",
          "cachedResultName": "n8n meeting notes automation"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "a2530370-f748-4e09-a78e-9f0f534a9e87",
      "name": "Check Unprocessed Records",
      "type": "n8n-nodes-base.if",
      "position": [
        -2096,
        -304
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "2583704c-e863-43d5-99f4-57a5231cb0f1",
              "operator": {
                "type": "string",
                "operation": "empty",
                "singleValue": true
              },
              "leftValue": "={{ $json.Processed }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "15f87602-252f-4670-afcd-2e83fce04281",
      "name": "Prepare Notes Data",
      "type": "n8n-nodes-base.set",
      "position": [
        -1888,
        -304
      ],
      "parameters": {
        "options": {
          "dotNotation": true
        },
        "assignments": {
          "assignments": [
            {
              "id": "2a0058b2-b273-475b-baee-d9e74dee303b",
              "name": "raw_notes",
              "type": "string",
              "value": "={{$json[\"Notes\"]}}"
            },
            {
              "id": "ea69d162-abd6-4908-a9ec-952d2d996e59",
              "name": "user_name ",
              "type": "string",
              "value": "={{ $json.user }}"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "5a090d5f-21b6-4465-828b-0a7ee1386a64",
      "name": "Extract Insights using AI",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -1664,
        -304
      ],
      "parameters": {
        "text": "=You are a meeting assistant.\n\nExtract:\n\n- Action Items\n- Follow-ups\n- Risks\n\nMeeting Notes:\n{{$json[\"raw_notes\"]}}\n\nIMPORTANT:\n- Return ONLY valid JSON\n- Do NOT add quotes around JSON\n- Do NOT add \\n or formatting\n- Do NOT add any explanation\n\nReturn exactly like this:\n\n{\n  \"action_items\": [\"item1\", \"item2\"],\n  \"follow_ups\": [\"item1\"],\n  \"risks\": [\"item1\"]\n}",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 3.1
    },
    {
      "id": "f7e93545-85ae-4b23-b46e-1d7d5860381d",
      "name": "Format Extracted Data",
      "type": "n8n-nodes-base.code",
      "position": [
        -1344,
        -304
      ],
      "parameters": {
        "jsCode": "let output = $json.output;\n\n// If output is string \u2192 convert to JSON\nif (typeof output === \"string\") {\n  output = JSON.parse(output);\n}\n\nreturn [{\n  json: {\n    ...$json,\n    action_items: (output.action_items || []).join(\", \"),\n    follow_ups: (output.follow_ups || []).join(\", \"),\n    risks: (output.risks || []).join(\", \")\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "60e3605a-4377-41e9-a892-18851b8f3d6f",
      "name": "Mark Record as Processed",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -1088,
        -304
      ],
      "parameters": {
        "columns": {
          "value": {
            "Processed": "Yes",
            "row_number": "={{ $('Prepare Notes Data').item.json.row_number }}"
          },
          "schema": [
            {
              "id": "Notes",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Notes",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "user",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "user",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Processed",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Processed",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "row_number"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Z9JlUPMr00U9k385p64yZbj4VKMDcQVd9AKa6FVXE60/edit#gid=0",
          "cachedResultName": "meeting notes"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1Z9JlUPMr00U9k385p64yZbj4VKMDcQVd9AKa6FVXE60",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Z9JlUPMr00U9k385p64yZbj4VKMDcQVd9AKa6FVXE60/edit?usp=drivesdk",
          "cachedResultName": "n8n meeting notes automation"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "22f15c86-3aed-445d-8d79-9c90de51737d",
      "name": "Store Extracted Insights",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -864,
        -304
      ],
      "parameters": {
        "columns": {
          "value": {
            "Risks": "={{ $('Format Extracted Data').item.json.risks }}",
            "Folllow-ups": "={{ $('Format Extracted Data').item.json.follow_ups }}",
            "Action items": "={{ $('Format Extracted Data').item.json.action_items }}"
          },
          "schema": [
            {
              "id": "Action items",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Action items",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Folllow-ups",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Folllow-ups",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Risks",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Risks",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 784492941,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Z9JlUPMr00U9k385p64yZbj4VKMDcQVd9AKa6FVXE60/edit#gid=784492941",
          "cachedResultName": "output"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1Z9JlUPMr00U9k385p64yZbj4VKMDcQVd9AKa6FVXE60",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Z9JlUPMr00U9k385p64yZbj4VKMDcQVd9AKa6FVXE60/edit?usp=drivesdk",
          "cachedResultName": "n8n meeting notes automation"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "ef8b6492-635c-4f4a-95eb-5cd3316cfcfa",
      "name": "Summary Email",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -640,
        -304
      ],
      "parameters": {
        "message": "=Hi,\n\nHere is your meeting summary:\n\nAction Items:\n{{ $json['Action items'] }}\n\nFollow-ups:\n{{ $json['Folllow-ups'] }}\n\nRisks:\n{{ $json.Risks }}\n\nThanks,\n{{ $('Prepare Notes Data').item.json.user }}",
        "options": {},
        "subject": "Meeting Summary",
        "emailType": "text"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    }
  ],
  "active": false,
  "settings": {
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "f4b61a8f-19a6-43f6-beb6-c64faa9d4fff",
  "connections": {
    "Summary Email": {
      "main": [
        []
      ]
    },
    "Groq Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Extract Insights using AI",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Starting Trigger": {
      "main": [
        [
          {
            "node": "Fetch Meeting Notes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Notes Data": {
      "main": [
        [
          {
            "node": "Extract Insights using AI",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Meeting Notes": {
      "main": [
        [
          {
            "node": "Check Unprocessed Records",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Extracted Data": {
      "main": [
        [
          {
            "node": "Mark Record as Processed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Mark Record as Processed": {
      "main": [
        [
          {
            "node": "Store Extracted Insights",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Store Extracted Insights": {
      "main": [
        [
          {
            "node": "Summary Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Unprocessed Records": {
      "main": [
        [
          {
            "node": "Prepare Notes Data",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Extract Insights using AI": {
      "main": [
        [
          {
            "node": "Format Extracted Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}