AutomationFlowsData & Sheets › Meeting Minutes Processor

Meeting Minutes Processor

Meeting Minutes Processor. Uses googleSheetsTrigger, chainLlm, lmChatGroq. Event-driven trigger; 16 nodes.

Event trigger★★★★☆ complexityAI-powered16 nodesGoogle Sheets TriggerChain LlmGroq Chat
Data & Sheets Trigger: Event Nodes: 16 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow follows the Chainllm → Groq Chat recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "name": "Meeting Minutes Processor",
  "nodes": [
    {
      "parameters": {
        "pollTimes": {
          "item": [
            {
              "mode": "everyHour"
            }
          ]
        },
        "documentId": {
          "__rl": true,
          "value": "REPLACE_WITH_INPUT_SHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Sheet1",
          "mode": "name"
        },
        "event": "rowAdded",
        "options": {}
      },
      "id": "node-trigger-001",
      "name": "New Meeting Minutes",
      "type": "n8n-nodes-base.googleSheetsTrigger",
      "typeVersion": 4,
      "position": [
        260,
        540
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=You are a professional meeting minutes processor.\n\nAnalyze the raw meeting notes below and extract:\n1. The meeting date (look for explicit date mentions; if none found, derive it from this timestamp: {{ $json.Timestamp }}).\n2. A comma-separated list of all meeting participants.\n3. An executive summary of exactly 3\u20135 concise bullet points.\n\nReturn ONLY a valid JSON object \u2014 no markdown fences, no explanation:\n{\n  \"date\": \"YYYY-MM-DD\",\n  \"participants\": \"Name1, Name2, Name3\",\n  \"summary_bullets\": [\"Bullet 1\", \"Bullet 2\", \"Bullet 3\"]\n}\n\nRaw meeting notes:\n{{ $json['Meeting Minutes'] }}"
      },
      "id": "node-chain-summary-002",
      "name": "Chain: Summary, Date & Participants",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.4,
      "position": [
        560,
        100
      ]
    },
    {
      "parameters": {
        "model": "llama-3.1-8b-instant",
        "options": {}
      },
      "id": "node-groq-summary-003",
      "name": "Groq (Summary)",
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "typeVersion": 1,
      "position": [
        560,
        260
      ],
      "credentials": {
        "groqApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=You are a professional meeting minutes processor.\n\nAnalyze the raw meeting notes below and extract every action item \u2014 specific tasks assigned to or committed to by any participant.\n\nReturn ONLY a valid JSON object \u2014 no markdown fences, no explanation:\n{\n  \"action_items\": [\n    {\n      \"action\": \"Clear description of the task\",\n      \"owner\": \"Person responsible, or Unknown if not stated\",\n      \"due_date\": \"YYYY-MM-DD or null if not stated\"\n    }\n  ]\n}\n\nRaw meeting notes:\n{{ $json['Meeting Minutes'] }}"
      },
      "id": "node-chain-actions-004",
      "name": "Chain: Action Items",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.4,
      "position": [
        560,
        420
      ]
    },
    {
      "parameters": {
        "model": "llama-3.1-8b-instant",
        "options": {}
      },
      "id": "node-groq-actions-005",
      "name": "Groq (Actions)",
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "typeVersion": 1,
      "position": [
        560,
        580
      ],
      "credentials": {
        "groqApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=You are a professional meeting minutes processor.\n\nAnalyze the raw meeting notes below and extract every formal decision that was made or agreed upon during the meeting.\n\nReturn ONLY a valid JSON object \u2014 no markdown fences, no explanation:\n{\n  \"decisions\": [\n    \"Concise statement of decision 1\",\n    \"Concise statement of decision 2\"\n  ]\n}\n\nRaw meeting notes:\n{{ $json['Meeting Minutes'] }}"
      },
      "id": "node-chain-decisions-006",
      "name": "Chain: Decisions",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.4,
      "position": [
        560,
        740
      ]
    },
    {
      "parameters": {
        "model": "llama-3.1-8b-instant",
        "options": {}
      },
      "id": "node-groq-decisions-007",
      "name": "Groq (Decisions)",
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "typeVersion": 1,
      "position": [
        560,
        900
      ],
      "credentials": {
        "groqApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=You are a professional meeting minutes processor.\n\nAnalyze the raw meeting notes below and extract all open questions, blockers, and dependencies (QBD) raised during the meeting.\n\n- question: something asked but not yet resolved\n- blocker: something actively preventing progress\n- dependency: something the team is waiting on or relies on externally\n\nReturn ONLY a valid JSON object \u2014 no markdown fences, no explanation:\n{\n  \"qbd_items\": [\n    {\"type\": \"question\", \"description\": \"...\"},\n    {\"type\": \"blocker\", \"description\": \"...\"},\n    {\"type\": \"dependency\", \"description\": \"...\"}\n  ]\n}\n\nRaw meeting notes:\n{{ $json['Meeting Minutes'] }}"
      },
      "id": "node-chain-qbd-008",
      "name": "Chain: QBD",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.4,
      "position": [
        560,
        1060
      ]
    },
    {
      "parameters": {
        "model": "llama-3.1-8b-instant",
        "options": {}
      },
      "id": "node-groq-qbd-009",
      "name": "Groq (QBD)",
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "typeVersion": 1,
      "position": [
        560,
        1220
      ],
      "credentials": {
        "groqApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "mode": "manual",
        "assignments": {
          "assignments": [
            {
              "id": "lbl-sum-01",
              "name": "summary",
              "value": "={{ $json.text }}",
              "type": "string"
            }
          ]
        },
        "includeOthers": false,
        "options": {}
      },
      "id": "node-label-summary-010",
      "name": "Label: Summary",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        880,
        100
      ]
    },
    {
      "parameters": {
        "mode": "manual",
        "assignments": {
          "assignments": [
            {
              "id": "lbl-act-01",
              "name": "actions",
              "value": "={{ $json.text }}",
              "type": "string"
            }
          ]
        },
        "includeOthers": false,
        "options": {}
      },
      "id": "node-label-actions-011",
      "name": "Label: Actions",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        880,
        420
      ]
    },
    {
      "parameters": {
        "mode": "manual",
        "assignments": {
          "assignments": [
            {
              "id": "lbl-dec-01",
              "name": "decisions",
              "value": "={{ $json.text }}",
              "type": "string"
            }
          ]
        },
        "includeOthers": false,
        "options": {}
      },
      "id": "node-label-decisions-012",
      "name": "Label: Decisions",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        880,
        740
      ]
    },
    {
      "parameters": {
        "mode": "manual",
        "assignments": {
          "assignments": [
            {
              "id": "lbl-qbd-01",
              "name": "qbd",
              "value": "={{ $json.text }}",
              "type": "string"
            }
          ]
        },
        "includeOthers": false,
        "options": {}
      },
      "id": "node-label-qbd-013",
      "name": "Label: QBD",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        880,
        1060
      ]
    },
    {
      "parameters": {
        "mode": "append"
      },
      "id": "node-merge-014",
      "name": "Merge All Outputs",
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3,
      "position": [
        1140,
        540
      ]
    },
    {
      "parameters": {
        "aggregate": "aggregateAllItemData",
        "destinationFieldName": "data",
        "includeEmpty": false,
        "options": {}
      },
      "id": "node-aggregate-015",
      "name": "Aggregate Outputs",
      "type": "n8n-nodes-base.aggregate",
      "typeVersion": 1,
      "position": [
        1360,
        540
      ]
    },
    {
      "parameters": {
        "mode": "manual",
        "assignments": {
          "assignments": [
            {
              "id": "str-sum-01",
              "name": "summary",
              "value": "={{ $json.data.find(d => d.summary !== undefined)?.summary }}",
              "type": "string"
            },
            {
              "id": "str-act-01",
              "name": "actions",
              "value": "={{ $json.data.find(d => d.actions !== undefined)?.actions }}",
              "type": "string"
            },
            {
              "id": "str-dec-01",
              "name": "decisions",
              "value": "={{ $json.data.find(d => d.decisions !== undefined)?.decisions }}",
              "type": "string"
            },
            {
              "id": "str-qbd-01",
              "name": "qbd",
              "value": "={{ $json.data.find(d => d.qbd !== undefined)?.qbd }}",
              "type": "string"
            }
          ]
        },
        "includeOthers": false,
        "options": {}
      },
      "id": "node-structure-016",
      "name": "Structure Output",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1580,
        540
      ]
    }
  ],
  "connections": {
    "New Meeting Minutes": {
      "main": [
        [
          {
            "node": "Chain: Summary, Date & Participants",
            "type": "main",
            "index": 0
          },
          {
            "node": "Chain: Action Items",
            "type": "main",
            "index": 0
          },
          {
            "node": "Chain: Decisions",
            "type": "main",
            "index": 0
          },
          {
            "node": "Chain: QBD",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Groq (Summary)": {
      "ai_languageModel": [
        [
          {
            "node": "Chain: Summary, Date & Participants",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Groq (Actions)": {
      "ai_languageModel": [
        [
          {
            "node": "Chain: Action Items",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Groq (Decisions)": {
      "ai_languageModel": [
        [
          {
            "node": "Chain: Decisions",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Groq (QBD)": {
      "ai_languageModel": [
        [
          {
            "node": "Chain: QBD",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Chain: Summary, Date & Participants": {
      "main": [
        [
          {
            "node": "Label: Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Chain: Action Items": {
      "main": [
        [
          {
            "node": "Label: Actions",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Chain: Decisions": {
      "main": [
        [
          {
            "node": "Label: Decisions",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Chain: QBD": {
      "main": [
        [
          {
            "node": "Label: QBD",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Label: Summary": {
      "main": [
        [
          {
            "node": "Merge All Outputs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Label: Actions": {
      "main": [
        [
          {
            "node": "Merge All Outputs",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Label: Decisions": {
      "main": [
        [
          {
            "node": "Merge All Outputs",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Label: QBD": {
      "main": [
        [
          {
            "node": "Merge All Outputs",
            "type": "main",
            "index": 3
          }
        ]
      ]
    },
    "Merge All Outputs": {
      "main": [
        [
          {
            "node": "Aggregate Outputs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate Outputs": {
      "main": [
        [
          {
            "node": "Structure Output",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Meeting Minutes Processor. Uses googleSheetsTrigger, chainLlm, lmChatGroq. Event-driven trigger; 16 nodes.

Source: https://github.com/MDunn83/AI-Portfolio/blob/main/workflows/P01-meeting-minutes-automation/claude-code-build/P01-meeting-minutes-automation-claude-code.json — original creator credit. Request a take-down →

More Data & Sheets workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Data & Sheets

Smart-Table-Fill.N8N. Uses httpRequest, googleSheets, chainLlm, outputParserStructured. Event-driven trigger; 31 nodes.

HTTP Request, Google Sheets, Chain Llm +3
Data & Sheets

Smart-Folder2Table. Uses executeWorkflowTrigger, httpRequest, chainLlm, lmChatGroq. Event-driven trigger; 26 nodes.

Execute Workflow Trigger, HTTP Request, Chain Llm +4
Data & Sheets

Clean Optimized Workflow. Uses googleSheets, chainLlm, lmChatGroq, outputParserStructured. Event-driven trigger; 24 nodes.

Google Sheets, Chain Llm, Groq Chat +2
Data & Sheets

LinkedIn Leads Scraping & Enrichment (Main). Uses formTrigger, splitOut, googleSheetsTrigger, openAi. Event-driven trigger; 66 nodes.

Form Trigger, Google Sheets Trigger, OpenAI +2
Data & Sheets

This template is ideal for B2B founders, solopreneurs, growth marketers, SDRs, or anyone looking to scale their lead generation and enrichment with no-code tools to low-code tools.

Google Sheets, OpenRouter Chat, Chain Llm +4