AutomationFlowsAI & RAG › Create Meeting Minutes From Telegram Messages with Gpt-5 to Airtable Slack Gmail

Create Meeting Minutes From Telegram Messages with Gpt-5 to Airtable Slack Gmail

ByBaptiste Fort @baptistefort on n8n.io

Send a message or a voice note on Telegram right after the meeting. n8n transcribes (if it's a voice note) and sends the text to GPT. GPT generates a structured and professional meeting minutes report. The report is automatically stored in Airtable. Your team is instantly…

Event trigger★★★★☆ complexityAI-powered29 nodesOpenAI ChatGmailTelegram TriggerTelegramOpenAIAgentAirtableSlack
AI & RAG Trigger: Event Nodes: 29 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Agent → Airtable 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
{
  "id": "VbaVgnhJ7phMHTY9",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Automatic meeting records sent from Telegram to Airtable, Slack and Gmail",
  "tags": [],
  "nodes": [
    {
      "id": "af08414c-6227-4af0-831a-5832d7a2833c",
      "name": "GPT-4 Email Generator Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -560,
        1552
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "98f24854-770a-45c7-b2b4-4be331d64ecc",
      "name": "Send Email",
      "type": "n8n-nodes-base.gmail",
      "position": [
        752,
        1456
      ],
      "parameters": {
        "sendTo": "={{ $('Create a record').item.json.fields.Email }}",
        "message": "={{ $('Create a record').item.json.fields.Report }}",
        "options": {},
        "subject": "={{ $('Create a record').item.json.fields.subject }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "dfd67f2c-f977-4ef6-98c2-1433eca110dc",
      "name": "If",
      "type": "n8n-nodes-base.if",
      "position": [
        -1888,
        1280
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "5c15ee72-c6b1-438e-aa5c-97d268cbb2cb",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{$json.type}}",
              "rightValue": "voice"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "118fc989-2485-4e53-b2d3-17dfed0afe2a",
      "name": "Wait",
      "type": "n8n-nodes-base.wait",
      "position": [
        -1472,
        1184
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "b1c2fa2b-2d71-40c4-a36f-a086cce865ff",
      "name": "Telegram Trigger",
      "type": "n8n-nodes-base.telegramTrigger",
      "position": [
        -2304,
        1280
      ],
      "parameters": {
        "updates": [
          "message"
        ],
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "dbc0240b-13ef-49ba-8da4-4677a27b8a0a",
      "name": "Voice note",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -1696,
        1184
      ],
      "parameters": {
        "fileId": "={{$json.file_id}}",
        "resource": "file",
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "5ba230a3-bebe-4ee8-b160-8d0108adb6a8",
      "name": "Voice note download",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -1280,
        1184
      ],
      "parameters": {
        "fileId": "={{$json.result.file_id}}",
        "resource": "file",
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "8cfbe3e0-aad3-4ca8-95cd-654b9ad29605",
      "name": "Transcription of voice notes to text",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        -1072,
        1184
      ],
      "parameters": {
        "options": {},
        "resource": "audio",
        "operation": "transcribe"
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "0ec4455b-d8c7-433d-abb6-9767fdc0f0b4",
      "name": "WAIT",
      "type": "n8n-nodes-base.wait",
      "position": [
        -880,
        1184
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "7b77efa8-1a8b-48f5-a821-e0e7a6d57a41",
      "name": "Content",
      "type": "n8n-nodes-base.code",
      "position": [
        -1696,
        1376
      ],
      "parameters": {
        "jsCode": "return [{ text: $json.content }]\n"
      },
      "typeVersion": 2
    },
    {
      "id": "9626d70e-4123-4f13-b77c-dadb936669e5",
      "name": "Message or Voice ?",
      "type": "n8n-nodes-base.code",
      "position": [
        -2096,
        1280
      ],
      "parameters": {
        "jsCode": "const updates = $json;\n\nif (updates.message?.text) {\n\treturn [\n\t\t{\n\t\t\tjson: {\n\t\t\t\ttype: \"text\",\n\t\t\t\tcontent: updates.message.text\n\t\t\t}\n\t\t}\n\t];\n}\n\nif (updates.message?.voice) {\n\treturn [\n\t\t{\n\t\t\tjson: {\n\t\t\t\ttype: \"voice\",\n\t\t\t\tfile_id: updates.message.voice.file_id\n\t\t\t}\n\t\t}\n\t];\n}\n\nreturn [];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "8cbf2f84-adfa-4877-b59d-31dad7a4a23d",
      "name": "Generate Meeting Message",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -480,
        1264
      ],
      "parameters": {
        "text": "==You are an assistant specialized in writing **meeting minutes to be sent by email**.\n\nFrom the text provided below (coming from a voice note or message):  \n\n{{ $json.input.text }}\n\n**Goals:**\n1) **Detect the recipient's email address** in the text (or a similar form like \"send to firstname.lastname\").  \n   - If the address is incomplete, complete it with `@gmail.com`.  \n   - If no address is found, use `contact@gmail.com`.\n\n2) **Understand the meeting context** and extract structured elements:  \n   - **Title/Topic** (project, client, subject)  \n   - **Date** (if missing, use today\u2019s date in Europe/Paris timezone)  \n   - **Participants** (names or roles if mentioned)  \n   - **Decisions made**  \n   - **Action items** (with owners + deadlines if available)  \n   - **Next steps**  \n   - **Risks / blockers** (if present)  \n   - **Open questions / follow-ups** (if present)\n\n3) **Generate a clear and informative email subject**, for example:  \n   - \"Meeting Minutes \u2014 {Topic} \u2014 {Date}\"  \n   - \"Summary {Project/Client} \u2014 {Date}\"\n\n4) **Write the email body in HTML**, professional and easy to read:  \n   - Greeting  \n   - Context reminder (date, topic, participants)  \n   - Sections with bold titles: Decisions, Action Items (with owners & deadlines), Next Steps, Risks/Blockers, Open Questions/Follow-up  \n   - Conclusion + invitation to reply if corrections are needed  \n   - Signature with \"Best regards,\" (do not sign with a specific name)\n\n**Output constraints:**  \n- No spelling or grammar mistakes.  \n- Always return the result in the **strict JSON format below**, without any text around it:\n\n```json\n{\n  \"email\": \"address@gmail.com\",\n  \"subject\": \"Email subject\",\n  \"body\": \"<p>Email body in HTML</p>\"\n}\n\n{{ $json.input.text }}",
        "options": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.1
    },
    {
      "id": "70d6a4e6-3197-4f9b-9fd5-dea831e0dc21",
      "name": "Create a record",
      "type": "n8n-nodes-base.airtable",
      "position": [
        256,
        1456
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "app71jEl2tmr4VBrJ",
          "cachedResultUrl": "https://airtable.com/app71jEl2tmr4VBrJ",
          "cachedResultName": "Call report"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblcHaHToALXG4qjH",
          "cachedResultUrl": "https://airtable.com/app71jEl2tmr4VBrJ/tblcHaHToALXG4qjH",
          "cachedResultName": "Table 1"
        },
        "columns": {
          "value": {
            "Email": "={{ $json.Email }}",
            "Report": "={{ $json.Report }}",
            "subject": "={{ $json.subject }}"
          },
          "schema": [
            {
              "id": "Email",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "subject",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "subject",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Report",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Report",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date",
              "type": "dateTime",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "create"
      },
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "bb193e7c-6511-453f-a782-5ab19119d3b7",
      "name": "Code",
      "type": "n8n-nodes-base.code",
      "position": [
        16,
        1504
      ],
      "parameters": {
        "jsCode": "const src = $json.output ?? $json;\nconst email = String(src.email || \"user@example.com\").trim();\nconst subject = String(src.subject || \"Compte rendu de r\u00e9union\").trim();\nconst body = String(src.body || \"\").trim();\n\n// Nettoyer le HTML et le transformer en texte lisible\nconst clean = body\n  .replace(/<br\\s*\\/?>/gi, \"\\n\")\n  .replace(/<\\/p>/gi, \"\\n\\n\")\n  .replace(/<\\/?[^>]+(>|$)/g, \"\")\n  .trim();\n\nreturn [{\n  Email: email,\n  subject: subject,\n  Report: clean\n}];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "45d090e1-1ba9-4324-bf34-3f3fe1a1b0a3",
      "name": "Send a message",
      "type": "n8n-nodes-base.slack",
      "position": [
        496,
        1424
      ],
      "parameters": {
        "text": "={{ $json.fields.subject}}\n\n{{ $json.fields.Report }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "=YOUR CHANNEL"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "830ff5e8-0dd7-4167-9878-b0c4826f5b56",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2368,
        896
      ],
      "parameters": {
        "width": 1792,
        "height": 864,
        "content": "## Message sent to Telegram as voice note or text?  "
      },
      "typeVersion": 1
    },
    {
      "id": "fbe9a6e9-f37f-4099-9795-320d96bea14d",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2384,
        1504
      ],
      "parameters": {
        "width": 336,
        "height": 288,
        "content": "![Alt text](https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExaXpjaWY5ajhyN3Zvc3U2aDhqOGkzOWg4M3hvdjl1ZHRzMGxwYTVrNCZlcD12MV9naWZzX3NlYXJjaCZjdD1n/ya4eevXU490Iw/giphy.gif)\n"
      },
      "typeVersion": 1
    },
    {
      "id": "7aa66a3d-6731-4e4f-9145-2ca40b4240d1",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -592,
        1072
      ],
      "parameters": {
        "color": 2,
        "width": 544,
        "height": 688,
        "content": "## Generate meeting minutes\n- **Node**: Agent (\u201cGenerate Meeting Message\u201d)  \n- **Prompt**: specialized for \u201cmeeting minutes\u201d  \n- **Model**: GPT-4.1-mini  \n- **Output**: `{ email, subject, body }`  \n\ud83d\udc49 GPT creates a clean and structured meeting report.  "
      },
      "typeVersion": 1
    },
    {
      "id": "dc3f7261-2467-403a-be7c-11c5b696f209",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -432,
        1504
      ],
      "parameters": {
        "width": 384,
        "height": 256,
        "content": "## Enforce clean JSON\n\n- **Node**: Output Parser Structured  \n- **JSON Example**:  \njson {\"email\": \"address@gmail.com\",\"subject\":\"Subject\",\"body\":Email\"}\n\n\ud83d\udc49 Ensures the output is always valid JSON."
      },
      "typeVersion": 1
    },
    {
      "id": "3901f82e-b400-424a-9a51-bff0212e0a04",
      "name": "Enforce Email JSON",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        -176,
        1536
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"email\": \"user@example.com\",\n  \"subject\": \"Email subject\",\n  \"body\": \"<p>Email body in HTML</p>\"\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "ab43f248-cef7-4591-8b15-37faa102f8bd",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        1216
      ],
      "parameters": {
        "color": 4,
        "height": 544,
        "content": "## Cleanup / Airtable mapping\n- **Node**: Code  \n- **Return**: `{ Email, subject, Report }`  \n\ud83d\udc49 Prepares the correct fields aligned with your Airtable table.  "
      },
      "typeVersion": 1
    },
    {
      "id": "076f6b32-e788-4bb7-85c4-0afb0caff168",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        192,
        1136
      ],
      "parameters": {
        "color": 6,
        "height": 624,
        "content": "## Store in Airtable\n- **Node**: Airtable (Create Record)  \n- **Mapping**:  \n  - Email = `{{$json.Email}}`  \n  - subject = `{{$json.subject}}`  \n  - Report = `{{$json.Report}}`  \n\ud83d\udc49 Archives each meeting report in your Airtable base.  "
      },
      "typeVersion": 1
    },
    {
      "id": "e8bd763c-58de-458a-961b-96d66536dff0",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        432,
        1232
      ],
      "parameters": {
        "color": 7,
        "height": 528,
        "content": "## Notify in Slack\n- **Node**: Slack (Send Message)  \n- **Channel**: your team channel  \n- **Message**:  {{$json.fields.subject}}{{$json.fields.Report}}"
      },
      "typeVersion": 1
    },
    {
      "id": "3e97aa2f-e270-4896-842d-f0db6bdf713e",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        672,
        1120
      ],
      "parameters": {
        "color": 5,
        "height": 640,
        "content": "## Send the email\n- **Node**: Gmail (Send Email)  \n- **sendTo**: `{{$('Create a record').item.json.fields.Email}}`  \n- **subject**: `{{$('Create a record').item.json.fields.subject}}`  \n- **message**: `{{$('Create a record').item.json.fields.Report}}`  \n\ud83d\udc49 Sends the complete meeting minutes to the recipients.  "
      },
      "typeVersion": 1
    },
    {
      "id": "2d6d9fdf-9473-42ea-ab9e-4ac1993e9648",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -592,
        912
      ],
      "parameters": {
        "color": 2,
        "width": 182,
        "content": "![Alt text](https://media1.tenor.com/m/y98Q1SkqLCAAAAAd/chat-gpt.gif)\n"
      },
      "typeVersion": 1
    },
    {
      "id": "46a6e02b-bc0e-43fa-925c-7165a0153d42",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        192,
        1600
      ],
      "parameters": {
        "color": 5,
        "width": 246,
        "content": "![Alt text](https://media1.tenor.com/m/WW0Y9Urm5yoAAAAC/airtable-project-management.gif)\n"
      },
      "typeVersion": 1
    },
    {
      "id": "3a92f0d9-8221-4c53-931a-0745bd76eef7",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        448,
        1600
      ],
      "parameters": {
        "color": 7,
        "width": 198,
        "height": 192,
        "content": "![Alt text](https://media.tenor.com/go-I8u5XWoAAAAAi/slack-slackhq.gif)\n"
      },
      "typeVersion": 1
    },
    {
      "id": "f934e87f-2486-4701-b3f3-38fd1fa37c2f",
      "name": "Sticky Note11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        736,
        1616
      ],
      "parameters": {
        "color": 7,
        "width": 150,
        "height": 144,
        "content": "![Alt text](https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExOGk3YThucTEycGtvZ3piaWlheW41aXlwYWo0MTllMWpqaWs0c2tnbCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/aOften89vRbG/giphy.gif)\n"
      },
      "typeVersion": 1
    },
    {
      "id": "2f570729-0e5a-4b3a-aaff-4fd182ad5b2f",
      "name": "Code structure",
      "type": "n8n-nodes-base.code",
      "position": [
        -768,
        1376
      ],
      "parameters": {
        "jsCode": "const text = String($json.text || \"\").trim();\nconst lower = text.toLowerCase();\n\n// 1) Direct email in message\nconst emailMatch = text.match(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/i);\nlet email = emailMatch ? emailMatch[0].toLowerCase() : null;\n\n// 2) Extract a domain hint from the message (fallback for building email)\nlet domainHint = null;\nconst domainRegex = /\\b([a-z0-9][a-z0-9-]{0,63}\\.)+[a-z]{2,}\\b/i;\nconst domainMatch = text.match(domainRegex);\nif (domainMatch) {\n  const parts = domainMatch[0].toLowerCase().split('.').filter(Boolean);\n  if (parts.length >= 2) {\n    domainHint = `${parts[parts.length - 2]}.${parts[parts.length - 1]}`;\n  }\n}\n\n// 3) If no direct email, try to build one from a \"send to / envoyer \u00e0\" style mention\nif (!email) {\n  // Capture after signals like \"envoyer \u00e0\", \"envoie \u00e0\", \"\u00e0 envoyer \u00e0\", \"send to\", \"to\"\n  const toCue =\n    /(\u00e0 envoyer \u00e0|envoyer \u00e0|envoie \u00e0|envois \u00e0|envoi \u00e0|send to|to)\\s+([^\\n,;:]+)/i;\n  const labelCue = /(mail|email|courriel|adresse)\\s*[:\\-]\\s*([^\\n,;:]+)/i;\n\n  let target = null;\n  const m1 = lower.match(toCue);\n  const m2 = lower.match(labelCue);\n  if (m1 && m1[2]) target = m1[2];\n  else if (m2 && m2[2]) target = m2[2];\n\n  if (target) {\n    target = target\n      .replace(/^[\u00ab\"'\\(\\[]+|[\u00bb\"'\\)\\]]+$/g, \"\") // trim quotes/brackets\n      .trim();\n\n    // If target already contains an email, use it\n    const tEmail = target.match(/[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,}/i);\n    if (tEmail) {\n      email = tEmail[0].toLowerCase();\n    } else {\n      // If target looks like \"firstname.lastname\" or \"firstname lastname\", normalize it\n      // Remove common filler words\n      target = target\n        .replace(/\\b(chez|\u00e0|au|pour|de|du|la|le|l'|mr|mme|m\\.)\\b/g, \" \")\n        .replace(/\\s+/g, \" \")\n        .trim();\n\n      // Keep only letters, spaces, dots, hyphens, underscores\n      target = target.replace(/[^a-z\u00e0\u00e2\u00e4\u00e7\u00e9\u00e8\u00ea\u00eb\u00ee\u00ef\u00f4\u00f6\u00f9\u00fb\u00fc\u00ff\\s._-]/g, \"\");\n\n      // Build local part\n      const ascii = target\n        .normalize(\"NFD\")\n        .replace(/\\p{Diacritic}/gu, \"\")\n        .toLowerCase();\n\n      // Split by spaces, dots, underscores, hyphens\n      const tokens = ascii.split(/[\\s._-]+/).filter(Boolean);\n\n      let local = null;\n      if (tokens.length >= 2) {\n        local = `${tokens[0]}.${tokens[tokens.length - 1]}`;\n      } else if (tokens.length === 1) {\n        local = tokens[0];\n      }\n\n      if (local) {\n        // If target contains something like \".com\" we treat it as a domain hint\n        let domainFromTarget = null;\n        const tDomain = target.match(domainRegex);\n        if (tDomain) {\n          const p = tDomain[0].split(\".\").filter(Boolean);\n          if (p.length >= 2)\n            domainFromTarget = `${p[p.length - 2]}.${p[p.length - 1]}`.toLowerCase();\n        }\n\n        const finalDomain = domainFromTarget || domainHint || \"gmail.com\";\n        email = `${local}@${finalDomain}`.replace(/\\.{2,}/g, \".\");\n      }\n    }\n  }\n}\n\n// 4) Final fallback\nif (!email) {\n  email = \"user@example.com\";\n}\n\n// Preserve your previous outputs too\nlet foundDomain = null;\nif (domainHint) foundDomain = domainHint;\n\nreturn [{\n  input: { text },\n  email,\n  domain: foundDomain,\n  domainUrl: foundDomain ? `https://${foundDomain}` : null\n}];\n"
      },
      "typeVersion": 2
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "f3969a89-1668-4520-9ea6-9d66642ada23",
  "connections": {
    "If": {
      "main": [
        [
          {
            "node": "Voice note",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code": {
      "main": [
        [
          {
            "node": "Create a record",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "WAIT": {
      "main": [
        [
          {
            "node": "Code structure",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait": {
      "main": [
        [
          {
            "node": "Voice note download",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Content": {
      "main": [
        [
          {
            "node": "Code structure",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Voice note": {
      "main": [
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code structure": {
      "main": [
        [
          {
            "node": "Generate Meeting Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send a message": {
      "main": [
        [
          {
            "node": "Send Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create a record": {
      "main": [
        [
          {
            "node": "Send a message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Telegram Trigger": {
      "main": [
        [
          {
            "node": "Message or Voice ?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Enforce Email JSON": {
      "ai_outputParser": [
        [
          {
            "node": "Generate Meeting Message",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Message or Voice ?": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Voice note download": {
      "main": [
        [
          {
            "node": "Transcription of voice notes to text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Meeting Message": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "GPT-4 Email Generator Model": {
      "ai_languageModel": [
        [
          {
            "node": "Generate Meeting Message",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Transcription of voice notes to text": {
      "main": [
        [
          {
            "node": "WAIT",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

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

Send a message or a voice note on Telegram right after the meeting. n8n transcribes (if it's a voice note) and sends the text to GPT. GPT generates a structured and professional meeting minutes report. The report is automatically stored in Airtable. Your team is instantly…

Source: https://n8n.io/workflows/7582/ — 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

Generate AI viral videos with NanoBanana & VEO3, shared on socials via Blotato 2. Uses @blotato/n8n-nodes-blotato, googleSheets, lmChatOpenAi, toolThink. Event-driven trigger; 94 nodes.

@Blotato/N8N Nodes Blotato, Google Sheets, OpenAI Chat +9
AI & RAG

Digital marketers, content creators, social media managers, and businesses who want to use AI marketing automation for YouTube Shorts without spending hours on production. This AI workflow helps anyon

OpenAI, HTTP Request, OpenAI Chat +7
AI & RAG

This template is designed for marketers, content creators, and e-commerce brands who want to automate the creation of professional ad videos at scale. It’s ideal for teams looking to generate consiste

Telegram, Telegram Trigger, Google Drive +8
AI & RAG

Unlock the Power of Language with Personalized AI Learning! MOTION TUTOR is a revolutionary AI-powered language learning platform that adapts to your progress and guides you from basic vocabulary to c

Agent, Airtable Tool, OpenAI Chat +6
AI & RAG

Automate your personal productivity with this intelligent n8n workflow that integrates Telegram, Google Sheets, and OpenAI (GPT-4o). This system uses multiple AI agents to manage work hours, tasks, fi

Agent, OpenAI Chat, Telegram +9