{
  "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
          }
        ]
      ]
    }
  }
}