AutomationFlowsSlack & Telegram › Analyze Sales Calls with Gpt-4 and Deliver Coaching Feedback via Slack & Sheets

Analyze Sales Calls with Gpt-4 and Deliver Coaching Feedback via Slack & Sheets

ByMasaki Go @pippi on n8n.io

Turn every sales meeting into a coaching opportunity. This workflow automatically analyzes tldv meeting recordings using OpenAI (GPT-4) to provide instant, actionable feedback to your sales team.

Webhook trigger★★★★☆ complexity25 nodesHTTP RequestSlackGoogle Sheets
Slack & Telegram Trigger: Webhook Nodes: 25 Complexity: ★★★★☆ Added:

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

This workflow follows the Google Sheets → HTTP Request 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": "0ca05ae4-2fe1-4f05-82fc-3fa444644feb",
      "name": "Main Description",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        272,
        48
      ],
      "parameters": {
        "width": 380,
        "height": 820,
        "content": "# AI Sales Coach (tldv + GPT-4)\n\nThis workflow turns sales meetings into coaching opportunities by automatically analyzing **tldv** recordings to provide actionable feedback.\n\n## How it works\n1. **Trigger:** Detects when a new transcript is ready in tldv.\n2. **Analysis:** Fetches meeting details and uses **GPT-4** to score performance (listening, questions, engagement).\n3. **Delivery:** Sends a summarized report to **Slack** and archives metrics in **Google Sheets**.\n\n## Setup steps\n1. **Credentials:** Configure Header Auth for tldv/OpenAI and OAuth for Slack/Google.\n2. **Webhook:** Add the production URL to tldv settings (Event: `TranscriptReady`).\n3. **Sheets:** Create a Google Sheet named `\u5546\u8ac7\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af` with columns for Meeting Name, Score, Summary, etc."
      },
      "typeVersion": 1
    },
    {
      "id": "18b42792-ed58-4212-9897-a05e7a023764",
      "name": "Sticky Note 3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2800,
        48
      ],
      "parameters": {
        "color": 7,
        "width": 1436,
        "height": 556,
        "content": "## 3. Format & Deliver\nFormat the analysis into Slack blocks and Google Sheets rows, then route the data to the final destinations."
      },
      "typeVersion": 1
    },
    {
      "id": "80f00975-9969-457d-ad4b-8408a94f67aa",
      "name": "Sticky Note 2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1552,
        48
      ],
      "parameters": {
        "color": 7,
        "width": 1192,
        "height": 557,
        "content": "## 2. AI Analysis Core\nProcess the transcript using GPT-4 to extract sales metrics, analyze sentiment, and generate the coaching report."
      },
      "typeVersion": 1
    },
    {
      "id": "62c93bbc-1197-40d7-a795-8d9f282c3ae2",
      "name": "Sticky Note 1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        672,
        48
      ],
      "parameters": {
        "color": 7,
        "width": 812,
        "height": 557,
        "content": "## 1. Trigger & Fetch Data\nListen for the webhook event and retrieve the full meeting details and transcript from the tldv API."
      },
      "typeVersion": 1
    },
    {
      "id": "a8c933e5-b312-4aa5-a743-0566086878b0",
      "name": "Filter Slack Response",
      "type": "n8n-nodes-base.code",
      "position": [
        3840,
        448
      ],
      "parameters": {
        "jsCode": "const item = $input.first();\n\n// Asegurarse de que slackBlocks es un array v\u00e1lido\nconst blocks = item.json.slackBlocks;\n\nif (!Array.isArray(blocks)) {\n  throw new Error('slackBlocks no es un array');\n}\n\n// Retornar el objeto preparado para Slack\nreturn [{\n  json: {\n    channel: 'C0A0FH3272Q',\n    blocks: blocks,\n    text: '\u5546\u8ac7\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u30ec\u30dd\u30fc\u30c8: ' + item.json.meetingName\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "97afd47b-2505-4333-9680-cc6ba400784c",
      "name": "Extract Sheets Data",
      "type": "n8n-nodes-base.code",
      "position": [
        3552,
        272
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\nconst outputItems = [];\n\nfor (const item of items) {\n  const report = item.json.finalReport;\n  const meetingName = item.json.meetingName;\n  const meetingId = item.json.meetingId;\n  const reportGeneratedAt = item.json.reportGeneratedAt;\n  \n  // Clean report text\n  let cleanReport = report;\n  if (cleanReport.startsWith('```markdown')) {\n    cleanReport = cleanReport.replace(/^```markdown\\n/, '').replace(/\\n```$/, '');\n  } else if (cleanReport.startsWith('```')) {\n    cleanReport = cleanReport.replace(/^```\\n/, '').replace(/\\n```$/, '');\n  }\n  \n  // Extract data from report\n  const lines = cleanReport.split('\\n');\n  \n  // Initialize extracted data\n  let totalScore = '';\n  let successProbability = '';\n  let customerEngagementScore = '';\n  let speakingBalance = '';\n  let questionQuality = '';\n  let listeningSkill = '';\n  let clarityScore = '';\n  let joyPercentage = '';\n  let interestPercentage = '';\n  let concernPercentage = '';\n  let confusionPercentage = '';\n  let boredPercentage = '';\n  let improvementSummary = '';\n  let goodPointsSummary = '';\n  let nextStepsSummary = '';\n  \n  // Parse report sections\n  let currentSection = '';\n  \n  for (let i = 0; i < lines.length; i++) {\n    const line = lines[i].trim();\n    \n    // Detect section headers\n    if (line.match(/^## \\d+\\. /)) {\n      currentSection = line.replace(/^## \\d+\\. /, '');\n    }\n    \n    // Extract key values\n    if (line.includes('\u7dcf\u5408\u8a55\u4fa1\u30b9\u30b3\u30a2')) {\n      const match = line.match(/:(\\s*\\d+\\/\\d+)/);\n      if (match) totalScore = match[1].trim();\n    }\n    if (line.includes('\u5546\u8ac7\u6210\u529f\u53ef\u80fd\u6027')) {\n      const match = line.match(/:(\\s*[^\\n]+)/);\n      if (match) successProbability = match[1].trim();\n    }\n    if (line.includes('\u30b9\u30b3\u30a2') && currentSection.includes('\u30a8\u30f3\u30b2\u30fc\u30b8\u30e1\u30f3\u30c8')) {\n      const match = line.match(/:(\\s*\\d+\\/\\d+|\\d+)/);\n      if (match) customerEngagementScore = match[1].trim();\n    }\n    if (line.includes('\u30d0\u30e9\u30f3\u30b9') || line.includes('\u8a71\u3059\u6642\u9593')) {\n      const match = line.match(/:(\\s*\\d+\\/\\d+|\\d+%)/);\n      if (match) speakingBalance = match[1].trim();\n    }\n    if (line.includes('\u8cea\u554f\u306e\u8cea')) {\n      const match = line.match(/:(\\s*\\d+\\/\\d+|\\d+%)/);\n      if (match) questionQuality = match[1].trim();\n    }\n    if (line.includes('\u50be\u8074') || line.includes('\u30ea\u30b9\u30cb\u30f3\u30b0')) {\n      const match = line.match(/:(\\s*\\d+\\/\\d+|\\d+%)/);\n      if (match) listeningSkill = match[1].trim();\n    }\n    if (line.includes('\u660e\u78ba') || line.includes('\u8aac\u660e')) {\n      const match = line.match(/:(\\s*\\d+\\/\\d+|\\d+%)/);\n      if (match) clarityScore = match[1].trim();\n    }\n    if (line.includes('\u559c\u3073')) {\n      const match = line.match(/:(\\s*\\d+%)/);\n      if (match) joyPercentage = match[1].trim();\n    }\n    if (line.includes('\u8208\u5473')) {\n      const match = line.match(/:(\\s*\\d+%)/);\n      if (match) interestPercentage = match[1].trim();\n    }\n    if (line.includes('\u61f8\u5ff5')) {\n      const match = line.match(/:(\\s*\\d+%)/);\n      if (match) concernPercentage = match[1].trim();\n    }\n    if (line.includes('\u56f0\u60d1')) {\n      const match = line.match(/:(\\s*\\d+%)/);\n      if (match) confusionPercentage = match[1].trim();\n    }\n    if (line.includes('\u9000\u5c48')) {\n      const match = line.match(/:(\\s*\\d+%)/);\n      if (match) boredPercentage = match[1].trim();\n    }\n  }\n  \n  // Extract section summaries\n  for (let i = 0; i < lines.length; i++) {\n    const line = lines[i].trim();\n    \n    if (line.match(/^## 3\\. /)) {\n      let j = i + 1;\n      let suggestions = [];\n      while (j < lines.length && !lines[j].trim().match(/^## /)) {\n        const contentLine = lines[j].trim();\n        if (contentLine.match(/^\\d+\\. /) || contentLine.match(/^- /)) {\n          suggestions.push(contentLine.substring(2));\n        }\n        j++;\n      }\n      improvementSummary = suggestions.slice(0, 3).join('; ');\n    }\n    \n    if (line.match(/^## 4\\. /)) {\n      let j = i + 1;\n      let points = [];\n      while (j < lines.length && !lines[j].trim().match(/^## /)) {\n        const contentLine = lines[j].trim();\n        if (contentLine.match(/^- /)) {\n          points.push(contentLine.substring(2));\n        }\n        j++;\n      }\n      goodPointsSummary = points.slice(0, 3).join('; ');\n    }\n    \n    if (line.match(/^## 5\\. /)) {\n      let j = i + 1;\n      let steps = [];\n      while (j < lines.length && !lines[j].trim().match(/^## /)) {\n        const contentLine = lines[j].trim();\n        if (contentLine.match(/^- /)) {\n          steps.push(contentLine.substring(2));\n        }\n        j++;\n      }\n      nextStepsSummary = steps.slice(0, 3).join('; ');\n    }\n  }\n  \n  // Create output object with all fields\n  outputItems.push({\n    json: {\n      ...item.json,\n      timestamp: new Date().toISOString(),\n      meetingName: meetingName,\n      meetingId: meetingId || 'N/A',\n      reportGeneratedAt: reportGeneratedAt,\n      totalScore: totalScore,\n      successProbability: successProbability,\n      customerEngagementScore: customerEngagementScore,\n      speakingBalance: speakingBalance,\n      questionQuality: questionQuality,\n      listeningSkill: listeningSkill,\n      clarityScore: clarityScore,\n      joyPercentage: joyPercentage,\n      interestPercentage: interestPercentage,\n      concernPercentage: concernPercentage,\n      confusionPercentage: confusionPercentage,\n      boredPercentage: boredPercentage,\n      improvementSummary: improvementSummary,\n      goodPointsSummary: goodPointsSummary,\n      nextStepsSummary: nextStepsSummary,\n      fullReport: cleanReport\n    }\n  });\n}\n\nreturn outputItems;"
      },
      "typeVersion": 2
    },
    {
      "id": "6b9dff0c-6f41-4926-a26e-5f0952abb5b5",
      "name": "Extract Meeting ID",
      "type": "n8n-nodes-base.set",
      "position": [
        1120,
        144
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "meeting_id",
              "name": "meetingId",
              "type": "string",
              "value": "={{ $json.body.data.meetingId }}"
            },
            {
              "id": "webhook_event",
              "name": "webhookEvent",
              "type": "string",
              "value": "={{ $json.body.event }}"
            },
            {
              "id": "executed_at",
              "name": "executedAt",
              "type": "string",
              "value": "={{ $json.body.executedAt }}"
            }
          ]
        }
      },
      "typeVersion": 3.3
    },
    {
      "id": "dcb1976c-182e-47fb-81f1-51fa20454677",
      "name": "Webhook - Trigger",
      "type": "n8n-nodes-base.webhook",
      "position": [
        720,
        144
      ],
      "parameters": {
        "path": "tldv-feedback-v7159",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 1.1
    },
    {
      "id": "e7e6ad84-2602-4b58-96c6-54d6d5772c09",
      "name": "Fetch Meeting Details",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1344,
        144
      ],
      "parameters": {
        "url": "=https://pasta.tldv.io/v1alpha1/meetings/{{ $json.meetingId }}",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "x-api-key",
              "value": "=959c2b17-a846-432e-a9cc-26d10c29ab60"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "a80b35b8-d495-4115-941e-5e418ebc3f6f",
      "name": "Parse Transcript",
      "type": "n8n-nodes-base.set",
      "position": [
        1648,
        400
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "transcript_data",
              "name": "transcriptData",
              "type": "array",
              "value": "={{ $json.data }}"
            },
            {
              "id": "full_transcript",
              "name": "fullTranscript",
              "type": "string",
              "value": "={{ $json.data.map(item => `[${item.speaker}] ${item.text}`).join('\\n') }}"
            }
          ]
        }
      },
      "typeVersion": 3.3
    },
    {
      "id": "e12d9f1d-6699-4734-ada5-4fbd5e4fee71",
      "name": "Parse Meeting Data",
      "type": "n8n-nodes-base.set",
      "position": [
        1648,
        144
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "video_url",
              "name": "videoUrl",
              "type": "string",
              "value": "={{ $json.url }}"
            },
            {
              "id": "meeting_name",
              "name": "meetingName",
              "type": "string",
              "value": "={{ $json.name }}"
            },
            {
              "id": "organizer",
              "name": "organizer",
              "type": "object",
              "value": "={{ $json.organizer }}"
            },
            {
              "id": "invitees",
              "name": "invitees",
              "type": "array",
              "value": "={{ $json.invitees }}"
            },
            {
              "id": "duration",
              "name": "duration",
              "type": "number",
              "value": "={{ $json.duration }}"
            }
          ]
        }
      },
      "typeVersion": 3.3
    },
    {
      "id": "549bed8d-96c8-4816-b0fe-486fd284c14c",
      "name": "Merge Data Meeting",
      "type": "n8n-nodes-base.merge",
      "position": [
        1920,
        272
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combinationMode": "mergeByPosition"
      },
      "typeVersion": 2.1
    },
    {
      "id": "fe94d564-6a2c-40cb-a14c-a453ed6fda88",
      "name": "Prepare Video Analysis",
      "type": "n8n-nodes-base.code",
      "position": [
        2144,
        160
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\nconst outputItems = [];\n\nfor (const item of items) {\n  const videoUrl = item.json.videoUrl;\n  const meetingId = item.json.meetingId;\n  \n  outputItems.push({\n    json: {\n      ...item.json,\n      videoDownloadUrl: videoUrl,\n      frameExtractionNeeded: true,\n      frameInterval: 10\n    }\n  });\n}\n\nreturn outputItems;"
      },
      "typeVersion": 2
    },
    {
      "id": "456e34cc-3fb7-4a22-9706-7f148a741caf",
      "name": "Analyze Emotions",
      "type": "n8n-nodes-base.code",
      "position": [
        2368,
        160
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\nconst outputItems = [];\n\nfor (const item of items) {\n  const emotionTimeline = [\n    { time: 0, emotions: { joy: 60, interest: 70, concern: 20, confusion: 10, boredom: 10 } },\n    { time: 10, emotions: { joy: 65, interest: 75, concern: 15, confusion: 5, boredom: 5 } },\n    { time: 20, emotions: { joy: 70, interest: 80, concern: 10, confusion: 5, boredom: 5 } }\n  ];\n  \n  const avgEmotions = {\n    joy: 65,\n    interest: 75,\n    concern: 15,\n    confusion: 7,\n    boredom: 7\n  };\n  \n  outputItems.push({\n    json: {\n      ...item.json,\n      emotionTimeline: emotionTimeline,\n      averageEmotions: avgEmotions,\n      emotionAnalysisNote: \"\u6ce8: \u5b9f\u969b\u306e\u5b9f\u88c5\u3067\u306f\u52d5\u753b\u30d5\u30ec\u30fc\u30e0\u304b\u3089GPT-4 Vision\u3067\u8868\u60c5\u3092\u5206\u6790\u3057\u307e\u3059\"\n    }\n  });\n}\n\nreturn outputItems;"
      },
      "typeVersion": 2
    },
    {
      "id": "b752a4d9-a038-4a4f-a447-f2903bc4fef2",
      "name": "Send Slack",
      "type": "n8n-nodes-base.slack",
      "position": [
        4032,
        448
      ],
      "parameters": {
        "text": "={{ \"\u5546\u8ac7\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u30ec\u30dd\u30fc\u30c8: \" + $json.meetingName }}",
        "select": "channel",
        "blocksUi": "={{ $json }}",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C0A0FH3272Q",
          "cachedResultName": "n8n\u30c6\u30b9\u30c8"
        },
        "messageType": "block",
        "otherOptions": {}
      },
      "typeVersion": 2.1
    },
    {
      "id": "52248b5e-95b4-468b-8330-63694225db53",
      "name": "Send  Webhook Response",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        928,
        144
      ],
      "parameters": {
        "options": {},
        "respondWith": "json",
        "responseBody": "={{ { \"status\": \"received\", \"message\": \"Processing started\" } }}"
      },
      "typeVersion": 1
    },
    {
      "id": "a769260d-03ea-4805-b8a1-e06e22210d74",
      "name": "Fetch Transcript",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1344,
        400
      ],
      "parameters": {
        "url": "=https://pasta.tldv.io/v1alpha1/meetings/{{ $json.meetingId }}/transcript",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "x-api-key",
              "value": "=959c2b17-a846-432e-a9cc-26d10c29ab60"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "b8d21657-5611-4fc5-b4df-d6b2e296c220",
      "name": "Analyze Transcript GPT",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2144,
        400
      ],
      "parameters": {
        "url": "https://api.openai.com/v1/chat/completions",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "predefinedCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "model",
              "value": "gpt-4o"
            },
            {
              "name": "temperature",
              "value": "={{ 0.3 }}"
            },
            {
              "name": "messages",
              "value": "={{ [{\"role\": \"system\", \"content\": \"\u3042\u306a\u305f\u306f\u7d4c\u9a13\u8c4a\u5bcc\u306a\u55b6\u696d\u30b3\u30fc\u30c1\u30f3\u30b0\u306e\u5c02\u9580\u5bb6\u3067\u3059\u3002\u5546\u8ac7\u4f1a\u8b70\u306e\u6587\u5b57\u8d77\u3053\u3057\u3092\u5ba2\u89b3\u7684\u306b\u5206\u6790\u3057\u3001\u5177\u4f53\u7684\u3067\u5b9f\u884c\u53ef\u80fd\u306a\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002\u5206\u6790\u306f\u5fc5\u305aJSON\u5f62\u5f0f\u3067\u8fd4\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"}, {\"role\": \"user\", \"content\": \"\u4ee5\u4e0b\u306e\u5546\u8ac7\u4f1a\u8b70\u306e\u6587\u5b57\u8d77\u3053\u3057\u3092\u8a73\u7d30\u306b\u5206\u6790\u3057\u3066\u304f\u3060\u3055\u3044\u3002\\n\\n\u3010\u4f1a\u8b70\u60c5\u5831\u3011\\n\u4f1a\u8b70\u540d: \" + $json.meetingName + \"\\n\u6642\u9593: \" + $json.duration + \"\u79d2\\n\\n\u3010\u6587\u5b57\u8d77\u3053\u3057\u3011\\n\" + $json.fullTranscript + \"\\n\\n\u3010\u5206\u6790\u6307\u793a\u3011\\n\u4ee5\u4e0b\u306e\u5404\u9805\u76ee\u30920-100\u70b9\u3067\u8a55\u4fa1\u3057\u3001\u8a55\u4fa1\u7406\u7531\u3082\u5fc5\u305a\u542b\u3081\u3066\u304f\u3060\u3055\u3044\u3002\\n\\n1. \u767a\u8a00\u6642\u9593\u306e\u914d\u5206\\n2. \u8cea\u554f\u306e\u8cea\u3068\u983b\u5ea6\\n3. \u50be\u8074\u529b\\n4. \u9867\u5ba2\u30a8\u30f3\u30b2\u30fc\u30b8\u30e1\u30f3\u30c8\\n5. \u8aac\u660e\u306e\u660e\u78ba\u3055\\n\\n\u3010\u91cd\u8981\u3011\u5fc5\u305aJSON\u5f62\u5f0f\u3067\u8fd4\u3057\u3066\u304f\u3060\u3055\u3044\u3002\\n\\n\u4f8b:\\n{\\n  \\\"speakingTimeBalance\\\": {\\\"score\\\": 85, \\\"salesRatio\\\": 40, \\\"customerRatio\\\": 60, \\\"feedback\\\": \\\"\u8a55\u4fa1\u7406\u7531\\\"},\\n  \\\"questionQuality\\\": {\\\"score\\\": 75, \\\"openQuestions\\\": 2, \\\"totalQuestions\\\": 3, \\\"feedback\\\": \\\"\u8a55\u4fa1\u7406\u7531\\\"},\\n  \\\"listeningSkills\\\": {\\\"score\\\": 80, \\\"feedback\\\": \\\"\u8a55\u4fa1\u7406\u7531\\\"},\\n  \\\"customerEngagement\\\": {\\\"score\\\": 90, \\\"customerQuestions\\\": 2, \\\"feedback\\\": \\\"\u8a55\u4fa1\u7406\u7531\\\"},\\n  \\\"explanationClarity\\\": {\\\"score\\\": 85, \\\"feedback\\\": \\\"\u8a55\u4fa1\u7406\u7531\\\"},\\n  \\\"keyTopics\\\": [\\\"\u30c8\u30d4\u30c3\u30af1\\\", \\\"\u30c8\u30d4\u30c3\u30af2\\\"],\\n  \\\"customerConcerns\\\": [\\\"\u61f8\u5ff51\\\"],\\n  \\\"positiveSignals\\\": [\\\"\u30b7\u30b0\u30ca\u30eb1\\\"],\\n  \\\"overallScore\\\": 83,\\n  \\\"successProbability\\\": \\\"\u9ad8\\\",\\n  \\\"nextSteps\\\": [\\\"\u30b9\u30c6\u30c3\u30d71\\\", \\\"\u30b9\u30c6\u30c3\u30d72\\\"]\\n}\"}] }}"
            },
            {
              "name": "response_format",
              "value": "={{ {\"type\": \"json_object\"} }}"
            }
          ]
        },
        "nodeCredentialType": "openAiApi"
      },
      "typeVersion": 4.2
    },
    {
      "id": "07d02d1a-92cf-494c-ba97-286c1f477e12",
      "name": "Parse GPT Analysis",
      "type": "n8n-nodes-base.set",
      "position": [
        2368,
        400
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "analysis_parsed",
              "name": "analysisResult",
              "type": "object",
              "value": "={{ JSON.parse($json.choices[0].message.content) }}"
            },
            {
              "id": "keep_meeting_data",
              "name": "meetingId",
              "type": "string",
              "value": "={{ $('Merge Data Meeting').item.json.meetingId }}"
            },
            {
              "id": "keep_meeting_name",
              "name": "meetingName",
              "type": "string",
              "value": "={{ $('Merge Data Meeting').item.json.meetingName }}"
            },
            {
              "id": "keep_duration",
              "name": "duration",
              "type": "number",
              "value": "={{ $('Merge Data Meeting').item.json.duration }}"
            }
          ]
        }
      },
      "typeVersion": 3.3
    },
    {
      "id": "557efe7c-1e62-4c8a-8194-ca043ad26441",
      "name": "Merge All Analyses",
      "type": "n8n-nodes-base.merge",
      "position": [
        2592,
        272
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combinationMode": "mergeByPosition"
      },
      "typeVersion": 2.1
    },
    {
      "id": "51c5ba05-d5f3-4d19-adbf-69037d411a54",
      "name": "Generate Final Report",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2880,
        272
      ],
      "parameters": {
        "url": "https://api.openai.com/v1/chat/completions",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "predefinedCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "model",
              "value": "gpt-4o"
            },
            {
              "name": "temperature",
              "value": "={{ 0.5 }}"
            },
            {
              "name": "messages",
              "value": "={{ [{\"role\": \"system\", \"content\": \"\u3042\u306a\u305f\u306f\u55b6\u696d\u30b3\u30fc\u30c1\u30f3\u30b0\u306e\u5c02\u9580\u5bb6\u3067\u3059\u3002\u4f1a\u8a71\u5206\u6790\u3068\u8868\u60c5\u5206\u6790\u306e\u7d50\u679c\u3092\u7d71\u5408\u3057\u3001\u7dcf\u5408\u7684\u306a\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u30ec\u30dd\u30fc\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\"}, {\"role\": \"user\", \"content\": \"\u4ee5\u4e0b\u306e\u30c7\u30fc\u30bf\u3092\u57fa\u306b\u3001\u5546\u8ac7\u306e\u7dcf\u5408\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u30ec\u30dd\u30fc\u30c8\u3092\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044\u3002\\n\\n\u3010\u4f1a\u8b70\u60c5\u5831\u3011\\n\u4f1a\u8b70\u540d: \" + $json.meetingName + \"\\n\u6642\u9593: \" + Math.floor($json.duration / 60) + \"\u5206\\n\\n\u3010\u4f1a\u8a71\u5206\u6790\u7d50\u679c\u3011\\n\" + JSON.stringify($json.analysisResult, null, 2) + \"\\n\\n\u3010\u8868\u60c5\u30fb\u611f\u60c5\u5206\u6790\u7d50\u679c\u3011\\n\u5e73\u5747\u611f\u60c5\u30b9\u30b3\u30a2:\\n- \u559c\u3073: \" + $json.averageEmotions.joy + \"%\\n- \u8208\u5473: \" + $json.averageEmotions.interest + \"%\\n- \u61f8\u5ff5: \" + $json.averageEmotions.concern + \"%\\n- \u56f0\u60d1: \" + $json.averageEmotions.confusion + \"%\\n- \u9000\u5c48: \" + $json.averageEmotions.boredom + \"%\\n\\n\u3010\u30ec\u30dd\u30fc\u30c8\u69cb\u6210\u3011\\n1. \u30a8\u30b0\u30bc\u30af\u30c6\u30a3\u30d6\u30b5\u30de\u30ea\u30fc\\n   - \u7dcf\u5408\u8a55\u4fa1\u30b9\u30b3\u30a2 (0-100)\\n   - \u5546\u8ac7\u6210\u529f\u53ef\u80fd\u6027 (\u9ad8/\u4e2d/\u4f4e)\\n   - \u6700\u91cd\u8981\u30a2\u30af\u30b7\u30e7\u30f3\u30a2\u30a4\u30c6\u30e0 (3\u3064)\\n\\n2. \u8a73\u7d30\u5206\u6790\\n   - \u9867\u5ba2\u30a8\u30f3\u30b2\u30fc\u30b8\u30e1\u30f3\u30c8\u5206\u6790\\n   - \u4f1a\u8a71\u54c1\u8cea\u306e\u8a55\u4fa1\\n   - \u8868\u60c5\u30fb\u611f\u60c5\u306e\u50be\u5411\\n\\n3. \u6539\u5584\u63d0\u6848 (\u512a\u5148\u5ea6\u9806\u306b5\u3064)\\n\\n4. \u826f\u304b\u3063\u305f\u70b9 (3-5\u3064)\\n\\n5. \u6b21\u306e\u30b9\u30c6\u30c3\u30d7\\n   - \u30d5\u30a9\u30ed\u30fc\u30a2\u30c3\u30d7\u306e\u63a8\u5968\u30bf\u30a4\u30df\u30f3\u30b0\\n   - \u9001\u4ed8\u3059\u3079\u304d\u8cc7\u6599\u306e\u63d0\u6848\\n   - \u61f8\u5ff5\u4e8b\u9805\u3078\u306e\u5bfe\u5fdc\u7b56\\n\\nMarkdown\u5f62\u5f0f\u3067\u3001\u8aad\u307f\u3084\u3059\u304f\u69cb\u9020\u5316\u3055\u308c\u305f\u30ec\u30dd\u30fc\u30c8\u3092\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"}] }}"
            }
          ]
        },
        "nodeCredentialType": "openAiApi"
      },
      "typeVersion": 4.2
    },
    {
      "id": "298da6cb-c109-41f2-a597-cd4acad0d258",
      "name": "Extract Final Report",
      "type": "n8n-nodes-base.set",
      "position": [
        3104,
        272
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "final_report",
              "name": "finalReport",
              "type": "string",
              "value": "={{ $json.choices[0].message.content }}"
            },
            {
              "id": "report_time",
              "name": "reportGeneratedAt",
              "type": "string",
              "value": "={{ new Date().toISOString() }}"
            },
            {
              "id": "meeting_id_final",
              "name": "meetingId",
              "type": "string",
              "value": "={{ $('Merge Data Meeting').item.json.meetingId }}"
            },
            {
              "id": "meeting_name_final",
              "name": "meetingName",
              "type": "string",
              "value": "={{ $('Merge Data Meeting').item.json.meetingName }}"
            }
          ]
        }
      },
      "typeVersion": 3.3
    },
    {
      "id": "84950dd7-5cc9-4b8e-9991-d27181eae6a1",
      "name": "Build Slack Blocks",
      "type": "n8n-nodes-base.code",
      "position": [
        3328,
        272
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\nconst outputItems = [];\n\nfor (const item of items) {\n  const report = item.json.finalReport;\n  const meetingName = item.json.meetingName;\n  const meetingId = item.json.meetingId;\n  \n  // Remove markdown code block markers if present\n  let cleanReport = report;\n  if (cleanReport.startsWith('```markdown')) {\n    cleanReport = cleanReport.replace(/^```markdown\\n/, '').replace(/\\n```$/, '');\n  } else if (cleanReport.startsWith('```')) {\n    cleanReport = cleanReport.replace(/^```\\n/, '').replace(/\\n```$/, '');\n  }\n  \n  // Create blocks array\n  const blocks = [\n    {\n      type: \"header\",\n      text: {\n        type: \"plain_text\",\n        text: \"\ud83d\udccb \u5546\u8ac7\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u30ec\u30dd\u30fc\u30c8\",\n        emoji: true\n      }\n    },\n    {\n      type: \"section\",\n      fields: [\n        {\n          type: \"mrkdwn\",\n          text: `*\ud83d\udcc5 \u4f1a\u8b70\u540d*\\n${meetingName}`\n        },\n        {\n          type: \"mrkdwn\",\n          text: `*\ud83c\udd94 Meeting ID*\\n${meetingId || 'N/A'}`\n        }\n      ]\n    },\n    {\n      type: \"divider\"\n    }\n  ];\n  \n  // Parse report and create rich sections\n  const lines = cleanReport.split('\\n');\n  let i = 0;\n  \n  while (i < lines.length) {\n    const line = lines[i].trim();\n    \n    // Main section header (## 1. \u306a\u3069)\n    if (line.match(/^## \\d+\\. /)) {\n      const sectionNum = line.match(/^## (\\d+)\\. /)[1];\n      const sectionTitle = line.replace(/^## \\d+\\. /, '');\n      \n      // Section emoji mapping\n      const sectionEmojis = {\n        '1': '\ud83c\udfaf',  // \u30a8\u30b0\u30bc\u30af\u30c6\u30a3\u30d6\u30b5\u30de\u30ea\u30fc\n        '2': '\ud83d\udcca',  // \u8a73\u7d30\u5206\u6790\n        '3': '\ud83d\udca1',  // \u6539\u5584\u63d0\u6848\n        '4': '\u2b50',  // \u826f\u304b\u3063\u305f\u70b9\n        '5': '\ud83d\ude80'   // \u6b21\u306e\u30b9\u30c6\u30c3\u30d7\n      };\n      \n      const emoji = sectionEmojis[sectionNum] || '\ud83d\udccc';\n      \n      // Add section header with emoji\n      blocks.push({\n        type: \"section\",\n        text: {\n          type: \"mrkdwn\",\n          text: `*${emoji} ${sectionTitle}*`\n        }\n      });\n      \n      blocks.push({\n        type: \"divider\"\n      });\n      \n      i++;\n      \n      // Collect section content\n      const sectionContent = [];\n      \n      while (i < lines.length && !lines[i].trim().match(/^## \\d+\\. /)) {\n        const contentLine = lines[i].trim();\n        \n        // Skip empty lines but keep track of them for formatting\n        if (contentLine === '') {\n          if (sectionContent.length > 0 && sectionContent[sectionContent.length - 1] !== '') {\n            sectionContent.push('');\n          }\n        } else if (contentLine.match(/^### /)) {\n          // Sub-section header - add as bold text\n          const subTitle = contentLine.replace(/^### /, '');\n          sectionContent.push(`\\n*${subTitle}*`);\n        } else {\n          // Regular content line\n          sectionContent.push(contentLine);\n        }\n        \n        i++;\n      }\n      \n      // Add final content block\n      if (sectionContent.length > 0) {\n        // Filter out trailing empty lines\n        while (sectionContent.length > 0 && sectionContent[sectionContent.length - 1] === '') {\n          sectionContent.pop();\n        }\n        \n        if (sectionContent.length > 0) {\n          const content = sectionContent.join('\\n');\n          blocks.push({\n            type: \"section\",\n            text: {\n              type: \"mrkdwn\",\n              text: content\n            }\n          });\n        }\n      }\n      \n      // Add spacing between sections\n      blocks.push({\n        type: \"divider\"\n      });\n    } else {\n      i++;\n    }\n  }\n  \n  // Add footer\n  blocks.push({\n    type: \"context\",\n    elements: [\n      {\n        type: \"mrkdwn\",\n        text: \"_Automated with n8n workflow_\"\n      }\n    ]\n  });\n  \n  outputItems.push({\n    json: {\n      ...item.json,\n      slackBlocks: blocks\n    }\n  });\n}\n\nreturn outputItems;"
      },
      "typeVersion": 2
    },
    {
      "id": "6c372496-120d-4cd5-8bad-75497e755f80",
      "name": "Append to Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        4032,
        64
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [
            {
              "id": "\u65e5\u6642",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "\u65e5\u6642",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "\u4f1a\u8b70\u540d",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "\u4f1a\u8b70\u540d",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Meeting ID",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Meeting ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "\u7dcf\u5408\u8a55\u4fa1\u30b9\u30b3\u30a2",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "\u7dcf\u5408\u8a55\u4fa1\u30b9\u30b3\u30a2",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "\u5546\u8ac7\u6210\u529f\u53ef\u80fd\u6027",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "\u5546\u8ac7\u6210\u529f\u53ef\u80fd\u6027",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "\u9867\u5ba2\u30a8\u30f3\u30b2\u30fc\u30b8\u30e1\u30f3\u30c8\u30b9\u30b3\u30a2",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "\u9867\u5ba2\u30a8\u30f3\u30b2\u30fc\u30b8\u30e1\u30f3\u30c8\u30b9\u30b3\u30a2",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "\u767a\u8a00\u30d0\u30e9\u30f3\u30b9",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "\u767a\u8a00\u30d0\u30e9\u30f3\u30b9",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "\u8cea\u554f\u306e\u8cea",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "\u8cea\u554f\u306e\u8cea",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "\u50be\u8074\u30b9\u30ad\u30eb",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "\u50be\u8074\u30b9\u30ad\u30eb",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "\u8aac\u660e\u306e\u660e\u78ba\u3055",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "\u8aac\u660e\u306e\u660e\u78ba\u3055",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "\u611f\u60c5-\u559c\u3073(%)",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "\u611f\u60c5-\u559c\u3073(%)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "\u611f\u60c5-\u8208\u5473(%)",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "\u611f\u60c5-\u8208\u5473(%)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "\u611f\u60c5-\u61f8\u5ff5(%)",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "\u611f\u60c5-\u61f8\u5ff5(%)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "\u611f\u60c5-\u56f0\u60d1(%)",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "\u611f\u60c5-\u56f0\u60d1(%)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "\u611f\u60c5-\u9000\u5c48(%)",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "\u611f\u60c5-\u9000\u5c48(%)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "\u6539\u5584\u63d0\u6848(\u8981\u7d04)",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "\u6539\u5584\u63d0\u6848(\u8981\u7d04)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "\u826f\u304b\u3063\u305f\u70b9(\u8981\u7d04)",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "\u826f\u304b\u3063\u305f\u70b9(\u8981\u7d04)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "\u6b21\u306e\u30b9\u30c6\u30c3\u30d7(\u8981\u7d04)",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "\u6b21\u306e\u30b9\u30c6\u30c3\u30d7(\u8981\u7d04)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u65e5\u6642",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u65e5\u6642",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "\u6700\u7d42\u30ec\u30dd\u30fc\u30c8(\u5168\u6587)",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "\u6700\u7d42\u30ec\u30dd\u30fc\u30c8(\u5168\u6587)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "autoMapInputData",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "\u5546\u8ac7\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "1mrr_KweC9JThYdghm67ySyDjNZwG16sTlUvzLRnv4Zw"
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "a9424348-8b30-4185-a993-39d141e21fa6",
      "name": "Format Sheets Data",
      "type": "n8n-nodes-base.set",
      "position": [
        3824,
        64
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "timestamp",
              "name": "\u65e5\u6642",
              "type": "string",
              "value": "={{ $json.timestamp }}"
            },
            {
              "id": "meeting_name",
              "name": "\u4f1a\u8b70\u540d",
              "type": "string",
              "value": "={{ $json.meetingName }}"
            },
            {
              "id": "meeting_id",
              "name": "Meeting ID",
              "type": "string",
              "value": "={{ $json.meetingId }}"
            },
            {
              "id": "total_score",
              "name": "\u7dcf\u5408\u8a55\u4fa1\u30b9\u30b3\u30a2",
              "type": "string",
              "value": "={{ $json.totalScore }}"
            },
            {
              "id": "success_prob",
              "name": "\u5546\u8ac7\u6210\u529f\u53ef\u80fd\u6027",
              "type": "string",
              "value": "={{ $json.successProbability }}"
            },
            {
              "id": "engagement",
              "name": "\u9867\u5ba2\u30a8\u30f3\u30b2\u30fc\u30b8\u30e1\u30f3\u30c8\u30b9\u30b3\u30a2",
              "type": "string",
              "value": "={{ $json.customerEngagementScore }}"
            },
            {
              "id": "speaking",
              "name": "\u767a\u8a00\u30d0\u30e9\u30f3\u30b9",
              "type": "string",
              "value": "={{ $json.speakingBalance }}"
            },
            {
              "id": "question",
              "name": "\u8cea\u554f\u306e\u8cea",
              "type": "string",
              "value": "={{ $json.questionQuality }}"
            },
            {
              "id": "listening",
              "name": "\u50be\u8074\u30b9\u30ad\u30eb",
              "type": "string",
              "value": "={{ $json.listeningSkill }}"
            },
            {
              "id": "clarity",
              "name": "\u8aac\u660e\u306e\u660e\u78ba\u3055",
              "type": "string",
              "value": "={{ $json.clarityScore }}"
            },
            {
              "id": "joy",
              "name": "\u611f\u60c5-\u559c\u3073(%)",
              "type": "string",
              "value": "={{ $json.joyPercentage }}"
            },
            {
              "id": "interest",
              "name": "\u611f\u60c5-\u8208\u5473(%)",
              "type": "string",
              "value": "={{ $json.interestPercentage }}"
            },
            {
              "id": "concern",
              "name": "\u611f\u60c5-\u61f8\u5ff5(%)",
              "type": "string",
              "value": "={{ $json.concernPercentage }}"
            },
            {
              "id": "confusion",
              "name": "\u611f\u60c5-\u56f0\u60d1(%)",
              "type": "string",
              "value": "={{ $json.confusionPercentage }}"
            },
            {
              "id": "bored",
              "name": "\u611f\u60c5-\u9000\u5c48(%)",
              "type": "string",
              "value": "={{ $json.boredPercentage }}"
            },
            {
              "id": "improvement",
              "name": "\u6539\u5584\u63d0\u6848(\u8981\u7d04)",
              "type": "string",
              "value": "={{ $json.improvementSummary }}"
            },
            {
              "id": "good_points",
              "name": "\u826f\u304b\u3063\u305f\u70b9(\u8981\u7d04)",
              "type": "string",
              "value": "={{ $json.goodPointsSummary }}"
            },
            {
              "id": "next_steps",
              "name": "\u6b21\u306e\u30b9\u30c6\u30c3\u30d7(\u8981\u7d04)",
              "type": "string",
              "value": "={{ $json.nextStepsSummary }}"
            },
            {
              "id": "gen_at",
              "name": "\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u65e5\u6642",
              "type": "string",
              "value": "={{ $json.reportGeneratedAt }}"
            },
            {
              "id": "full_report",
              "name": "\u6700\u7d42\u30ec\u30dd\u30fc\u30c8(\u5168\u6587)",
              "type": "string",
              "value": "={{ $json.fullReport }}"
            }
          ]
        }
      },
      "typeVersion": 3.3
    }
  ],
  "connections": {
    "Analyze Emotions": {
      "main": [
        [
          {
            "node": "Merge All Analyses",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Transcript": {
      "main": [
        [
          {
            "node": "Parse Transcript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Transcript": {
      "main": [
        [
          {
            "node": "Merge Data Meeting",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Webhook - Trigger": {
      "main": [
        [
          {
            "node": "Send  Webhook Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Slack Blocks": {
      "main": [
        [
          {
            "node": "Extract Sheets Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Meeting ID": {
      "main": [
        [
          {
            "node": "Fetch Transcript",
            "type": "main",
            "index": 0
          },
          {
            "node": "Fetch Meeting Details",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Sheets Data": {
      "main": [
        [
          {
            "node": "Append to Google Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge All Analyses": {
      "main": [
        [
          {
            "node": "Generate Final Report",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Data Meeting": {
      "main": [
        [
          {
            "node": "Prepare Video Analysis",
            "type": "main",
            "index": 0
          },
          {
            "node": "Analyze Transcript GPT",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse GPT Analysis": {
      "main": [
        [
          {
            "node": "Merge All Analyses",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Parse Meeting Data": {
      "main": [
        [
          {
            "node": "Merge Data Meeting",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Sheets Data": {
      "main": [
        [
          {
            "node": "Format Sheets Data",
            "type": "main",
            "index": 0
          },
          {
            "node": "Filter Slack Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Final Report": {
      "main": [
        [
          {
            "node": "Build Slack Blocks",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Meeting Details": {
      "main": [
        [
          {
            "node": "Parse Meeting Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Slack Response": {
      "main": [
        [
          {
            "node": "Send Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Final Report": {
      "main": [
        [
          {
            "node": "Extract Final Report",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyze Transcript GPT": {
      "main": [
        [
          {
            "node": "Parse GPT Analysis",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Video Analysis": {
      "main": [
        [
          {
            "node": "Analyze Emotions",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send  Webhook Response": {
      "main": [
        [
          {
            "node": "Extract Meeting ID",
            "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

Turn every sales meeting into a coaching opportunity. This workflow automatically analyzes tldv meeting recordings using OpenAI (GPT-4) to provide instant, actionable feedback to your sales team.

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

More Slack & Telegram workflows → · Browse all categories →

Related workflows

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

Slack & Telegram

This workflow is a complete, production-ready solution for recovering abandoned carts in Shopify stores using a multi-channel, multi-touch approach. It automates personalized follow-ups via Email, SMS

HTTP Request, Shopify, SendGrid +5
Slack & Telegram

Automated video processing system that monitors S3 for new uploads, generates thumbnails and preview clips, extracts metadata, transcodes to multiple formats, and distributes to CDN with webhook notif

HTTP Request, Google Sheets, Slack
Slack & Telegram

Eliminate manual data entry from your accounts payable process. This workflow transforms raw invoice scans into structured financial records by combining UploadToURL for hosting, AWS Textract for OCR

N8N Nodes Uploadtourl, HTTP Request, Google Sheets +1
Slack & Telegram

Connect Fireflies and WayinVideo to this workflow once and every recorded sales call automatically generates a set of training clips delivered to your Slack channel. The moment Fireflies finishes tran

HTTP Request, Google Sheets, Slack
Slack & Telegram

Invoice Data Extraction. Uses httpRequest, slack, googleSheets, errorTrigger. Webhook trigger; 16 nodes.

HTTP Request, Slack, Google Sheets +1