AutomationFlowsAI & RAG › Structure AI Meeting Notes with Gpt-4o-mini and Save to Google Drive

Structure AI Meeting Notes with Gpt-4o-mini and Save to Google Drive

ByisaWOW @isawow on n8n.io

Paste your raw meeting notes into a simple web form and submit. The workflow sends your notes to GPT-4o-mini, which converts them into a clean 6-section structured document. The finished document saves automatically to your Google Drive folder — ready to share with your team or…

Event trigger★★★★☆ complexityAI-powered13 nodesForm TriggerAgentOpenAI ChatOutput Parser StructuredGoogle Drive
AI & RAG Trigger: Event Nodes: 13 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #14895 — we link there as the canonical source.

This workflow follows the Agent → Form Trigger 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
{
  "nodes": [
    {
      "id": "20f08a03-ba9a-4aab-b2e5-8d6212e802be",
      "name": "Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -16,
        48
      ],
      "parameters": {
        "color": 4,
        "width": 460,
        "height": 736,
        "content": "## AI Meeting Notes Structurer \u2014 GPT-4o-mini + Google Drive\n\nFor agency teams, consultants, and project managers who want to automatically clean and structure messy meeting notes. Submit raw notes via a web form \u2014 the workflow extracts all details, passes them to GPT-4o-mini which writes a structured 6-section document, assembles it into a clean plain-text file, and saves it directly to your Google Drive folder.\n\n## How it works\n- **1. Form \u2014 Meeting Notes Submission** collects client name, date, attendees, raw notes, your name, and a Drive folder ID\n- **2. Set \u2014 Extract Form Fields** maps all form inputs into clean named variables and builds the document title\n- **3. AI Agent \u2014 Structure Meeting Notes** uses GPT-4o-mini to convert raw notes into 6 structured sections\n- **6. Code \u2014 Assemble Full Document** combines all 6 sections into one complete plain-text document\n- **7. Google Drive \u2014 Save Notes Document** creates a new file in your specified Drive folder\n\n## Set up steps\n1. In **4. OpenAI \u2014 GPT-4o-mini Model** \u2014 connect your OpenAI API credential\n2. In **7. Google Drive \u2014 Save Notes Document** \u2014 connect your Google Drive OAuth2 credential\n3. Activate the workflow and copy the Form URL from node 1\n4. Open the Form URL in a browser, fill in all fields, and submit\n5. To find your Google Drive Folder ID \u2014 open the folder in your browser and copy the ID from the URL after /folders/"
      },
      "typeVersion": 1
    },
    {
      "id": "7d9343a9-83a9-490b-8e43-a9df1e383878",
      "name": "Section \u2014 Form Input",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        512,
        64
      ],
      "parameters": {
        "color": 5,
        "width": 260,
        "height": 388,
        "content": "## Form Input\nUser submits client name, meeting date, attendees, raw notes, their name, and a Google Drive folder ID. Submitting the form triggers the workflow."
      },
      "typeVersion": 1
    },
    {
      "id": "2ef1b323-4f1e-44e1-a564-bc1a47be2ed0",
      "name": "Section \u2014 Data Preparation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        784,
        64
      ],
      "parameters": {
        "color": 6,
        "width": 244,
        "height": 388,
        "content": "## Data Preparation\nMaps all form inputs into clean named variables and auto-builds the document title from client name and meeting date."
      },
      "typeVersion": 1
    },
    {
      "id": "4d41b43c-a95e-4ae9-b46c-ae66aacae3e4",
      "name": "Section \u2014 AI Notes Structuring",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1056,
        64
      ],
      "parameters": {
        "color": 6,
        "width": 324,
        "height": 580,
        "content": "## AI Notes Structuring\nGPT-4o-mini reads the raw meeting notes and returns a structured 6-section JSON: header, overview, key discussion points, decisions, action items, and next steps."
      },
      "typeVersion": 1
    },
    {
      "id": "b72f54d9-0a4a-459e-b3c5-b65bff5604dd",
      "name": "Section \u2014 Document Assembly and Save",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1392,
        64
      ],
      "parameters": {
        "color": 4,
        "width": 420,
        "height": 420,
        "content": "## Document Assembly and Save\nAssembles all 6 sections into one clean plain-text document, then creates a new file in the Google Drive folder specified in the form."
      },
      "typeVersion": 1
    },
    {
      "id": "ad0f266b-7d83-460b-86bc-d3ca0aa67505",
      "name": "Note \u2014 Google Drive Credential Required",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1392,
        496
      ],
      "parameters": {
        "color": 3,
        "width": 652,
        "height": 144,
        "content": "## \u26a0\ufe0f Google Drive Credential Required\nThis node has no credential connected. Connect your Google Drive OAuth2 credential before activating. Without it the workflow will fail at the final step and the document will not be saved."
      },
      "typeVersion": 1
    },
    {
      "id": "01a168f5-1370-44dc-853b-4e42908a69d6",
      "name": "1. Form \u2014 Meeting Notes Submission",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        560,
        256
      ],
      "parameters": {
        "options": {},
        "formTitle": "Meeting Notes Submitter",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Client or Project Name",
              "placeholder": "e.g. Sadrian Plastic Surgery",
              "requiredField": true
            },
            {
              "fieldLabel": "Meeting Date",
              "placeholder": "e.g. 08 April 2026",
              "requiredField": true
            },
            {
              "fieldLabel": "Attendees",
              "placeholder": "e.g. Rahul, Deepak, Client",
              "requiredField": true
            },
            {
              "fieldType": "textarea",
              "fieldLabel": "Raw Meeting Notes",
              "placeholder": "Paste your rough notes here. Can be bullet points, sentences, or messy text.",
              "requiredField": true
            },
            {
              "fieldLabel": "Your Name",
              "placeholder": "e.g. Rahul Dutt",
              "requiredField": true
            },
            {
              "fieldLabel": "Google Drive Folder ID",
              "placeholder": "Paste your Google Drive folder ID here (from folder URL)",
              "requiredField": true
            }
          ]
        },
        "formDescription": "Fill in your meeting details and raw notes. AI will clean and structure them automatically."
      },
      "typeVersion": 2.2
    },
    {
      "id": "9e3e849d-2521-453b-856d-f3a859b4caa7",
      "name": "2. Set \u2014 Extract Form Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        880,
        256
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "cfg-001",
              "name": "clientName",
              "type": "string",
              "value": "={{ $json['Client or Project Name'] }}"
            },
            {
              "id": "cfg-002",
              "name": "meetingDate",
              "type": "string",
              "value": "={{ $json['Meeting Date'] }}"
            },
            {
              "id": "cfg-003",
              "name": "attendees",
              "type": "string",
              "value": "={{ $json['Attendees'] }}"
            },
            {
              "id": "cfg-004",
              "name": "rawNotes",
              "type": "string",
              "value": "={{ $json['Raw Meeting Notes'] }}"
            },
            {
              "id": "cfg-005",
              "name": "submittedBy",
              "type": "string",
              "value": "={{ $json['Your Name'] }}"
            },
            {
              "id": "cfg-006",
              "name": "folderId",
              "type": "string",
              "value": "={{ $json['Google Drive Folder ID'] }}"
            },
            {
              "id": "cfg-007",
              "name": "docTitle",
              "type": "string",
              "value": "=Meeting Notes \u2014 {{ $json['Client or Project Name'] }} \u2014 {{ $json['Meeting Date'] }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "6ef0d4f5-3188-49c6-bb1f-67cafa980a86",
      "name": "3. AI Agent \u2014 Structure Meeting Notes",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1104,
        256
      ],
      "parameters": {
        "text": "=You are a professional meeting notes formatter for a digital marketing agency.\n\nYour job is to take raw messy meeting notes and convert them into a clean structured document.\n\nMEETING DETAILS:\nClient or Project: {{ $json.clientName }}\nDate: {{ $json.meetingDate }}\nAttendees: {{ $json.attendees }}\nSubmitted by: {{ $json.submittedBy }}\n\nRAW NOTES:\n{{ $json.rawNotes }}\n\nYou must return a JSON object with exactly these 6 fields:\n\noverview \u2014 2 to 3 plain sentences summarizing what the meeting was about.\n\nkeyDiscussionPoints \u2014 a plain text list of major topics discussed. Number each point. Use full sentences. Minimum 3 points maximum 8 points. Separate each point with a newline.\n\ndecisionsMade \u2014 a plain text list of decisions finalized in the meeting. If none are clear write: No formal decisions recorded.\n\nactionItems \u2014 a plain text list of tasks and follow-ups. For each item write the task description then a pipe symbol then the owner then a pipe symbol then the deadline. If owner or deadline is not mentioned write Not assigned or Not specified. Separate each item with a newline.\n\nnextSteps \u2014 2 to 3 plain sentences about what happens next after this meeting.\n\nheaderBlock \u2014 a plain text block with exactly these 4 lines:\nClient: [client name]\nDate: [meeting date]\nAttendees: [attendees]\nPrepared by: [submitted by name]\n\nRULES:\n- Plain text only inside every field. No markdown. No asterisks. No hashtags.\n- Do not add anything not present in the raw notes.\n- If a section has no data from notes write: Not discussed in this meeting.",
        "options": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.7
    },
    {
      "id": "1f0ed5fa-c8b4-4876-80a2-282bfd063e68",
      "name": "4. OpenAI \u2014 GPT-4o-mini Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1104,
        496
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {
          "maxTokens": 1200,
          "temperature": 0.3
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "c8b0d3a8-9ad3-4576-a176-964d9086446e",
      "name": "5. Parser \u2014 Structured Notes Output",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        1248,
        448
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"headerBlock\": {\n      \"type\": \"string\",\n      \"description\": \"Plain text block with Client, Date, Attendees, Prepared by lines\"\n    },\n    \"overview\": {\n      \"type\": \"string\",\n      \"description\": \"2 to 3 sentence plain text summary of the meeting\"\n    },\n    \"keyDiscussionPoints\": {\n      \"type\": \"string\",\n      \"description\": \"Numbered plain text list of major topics discussed, each on a new line\"\n    },\n    \"decisionsMade\": {\n      \"type\": \"string\",\n      \"description\": \"Plain text list of decisions. If none write: No formal decisions recorded.\"\n    },\n    \"actionItems\": {\n      \"type\": \"string\",\n      \"description\": \"Plain text list of tasks. Format: Task | Owner | Deadline. Each item on new line.\"\n    },\n    \"nextSteps\": {\n      \"type\": \"string\",\n      \"description\": \"2 to 3 sentences about what happens after this meeting\"\n    }\n  },\n  \"required\": [\"headerBlock\", \"overview\", \"keyDiscussionPoints\", \"decisionsMade\", \"actionItems\", \"nextSteps\"]\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "911b12b9-1dbe-455b-b88c-431dc238691a",
      "name": "6. Code \u2014 Assemble Full Document",
      "type": "n8n-nodes-base.code",
      "position": [
        1456,
        256
      ],
      "parameters": {
        "jsCode": "const out = $input.first().json.output;\n\n// Safely read each field with fallback\nconst headerBlock    = out.headerBlock         || 'Client: N/A\\nDate: N/A\\nAttendees: N/A\\nPrepared by: N/A';\nconst overview       = out.overview             || 'Not available.';\nconst keyPoints      = out.keyDiscussionPoints  || 'Not discussed in this meeting.';\nconst decisions      = out.decisionsMade        || 'No formal decisions recorded.';\nconst actionItems    = out.actionItems          || 'No action items recorded.';\nconst nextSteps      = out.nextSteps            || 'Not discussed in this meeting.';\n\n// Assemble full plain text document\nconst fullDoc = `MEETING SUMMARY\n${headerBlock}\n\nOVERVIEW\n${overview}\n\nKEY DISCUSSION POINTS\n${keyPoints}\n\nDECISIONS MADE\n${decisions}\n\nACTION ITEMS\n${actionItems}\n\nNEXT STEPS\n${nextSteps}\n\n---\nThis document was auto-generated by n8n + GPT-4o-mini`;\n\nreturn [{\n  json: {\n    formattedNotes: fullDoc,\n    docTitle: $('2. Set \u2014 Extract Form Fields').item.json.docTitle,\n    folderId: $('2. Set \u2014 Extract Form Fields').item.json.folderId\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "43ce7dd6-fde4-492d-a1ac-ddcf63225148",
      "name": "7. Google Drive \u2014 Save Notes Document",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        1664,
        256
      ],
      "parameters": {
        "operation": "create"
      },
      "typeVersion": 3
    }
  ],
  "connections": {
    "2. Set \u2014 Extract Form Fields": {
      "main": [
        [
          {
            "node": "3. AI Agent \u2014 Structure Meeting Notes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4. OpenAI \u2014 GPT-4o-mini Model": {
      "ai_languageModel": [
        [
          {
            "node": "3. AI Agent \u2014 Structure Meeting Notes",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "6. Code \u2014 Assemble Full Document": {
      "main": [
        [
          {
            "node": "7. Google Drive \u2014 Save Notes Document",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1. Form \u2014 Meeting Notes Submission": {
      "main": [
        [
          {
            "node": "2. Set \u2014 Extract Form Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5. Parser \u2014 Structured Notes Output": {
      "ai_outputParser": [
        [
          {
            "node": "3. AI Agent \u2014 Structure Meeting Notes",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "3. AI Agent \u2014 Structure Meeting Notes": {
      "main": [
        [
          {
            "node": "6. Code \u2014 Assemble Full Document",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

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

About this workflow

Paste your raw meeting notes into a simple web form and submit. The workflow sends your notes to GPT-4o-mini, which converts them into a clean 6-section structured document. The finished document saves automatically to your Google Drive folder — ready to share with your team or…

Source: https://n8n.io/workflows/14895/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

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

AI & RAG

🎯 Create viral TikToks, Shorts, Reels, podcasts, and ASMR videos in minutes — all on autopilot.

OpenAI, HTTP Request, Form Trigger +7
AI & RAG

This workflow transforms product images into professional marketing visuals by combining AI background generation, intelligent copywriting, and automated design templating. Upload a product photo, des

HTTP Request, Agent, OpenAI Chat +3
AI & RAG

HR Job Posting and Evaluation with AI. Uses formTrigger, airtable, googleDrive, stickyNote. Event-driven trigger; 36 nodes.

Form Trigger, Airtable, Google Drive +8
AI & RAG

HR Job Posting and Evaluation with AI. Uses formTrigger, airtable, googleDrive, stickyNote. Event-driven trigger; 36 nodes.

Form Trigger, Airtable, Google Drive +8
AI & RAG

The HR Job Posting and Evaluation with AI workflow is designed to streamline and enhance recruitment for technical roles, such as Automation Specialists. By automating key stages in the hiring process

Form Trigger, Airtable, Google Drive +8