AutomationFlowsEmail & Gmail › Summarize Youtube Videos Into Actionable Notes with Supadata, Claude and Gmail

Summarize Youtube Videos Into Actionable Notes with Supadata, Claude and Gmail

ByNocode Expert @iamrup on n8n.io

This workflow takes a YouTube URL, fetches the video transcript via Supadata, summarizes it into a TL;DR, takeaways, notes, and action items using Anthropic Claude, and emails the formatted results to you via Gmail. Runs manually when you click Test workflow. Reads the YouTube…

Event trigger★★★★☆ complexity11 nodesHTTP RequestGmail
Email & Gmail Trigger: Event Nodes: 11 Complexity: ★★★★☆ Added:

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

This workflow follows the Gmail → 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
{
  "id": "yt17live",
  "name": "Turn any YouTube video into notes and takeaways with AI",
  "tags": [],
  "nodes": [
    {
      "id": "overview",
      "name": "Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1120,
        0
      ],
      "parameters": {
        "width": 812,
        "height": 828,
        "content": "## YouTube to notes: drop in a link, get the notes\n\nSkip the video. Put a YouTube link in the config node, run it, and get a clean set of notes, a TL;DR, key takeaways and action items emailed to you, so you get the value without watching 40 minutes.\n\n### How it works\nThe config node holds the YouTube URL (and optionally what you care about). The transcript is fetched through a transcript API (this works where a plain request is blocked, because YouTube serves an empty transcript to servers). An AI Agent turns the transcript into a title, a two to three sentence TL;DR, key takeaways, structured notes and action items, and emails them to you.\n\n### Setup\n- Paste the YouTube URL, your transcript API key (Supadata has a free tier) and your delivery email into the config node.\n- Add an Anthropic credential on the chat model node and pick a model.\n- Add Gmail on the send node, then click Test workflow to run it.\n\n### Why an API and not a plain fetch\nYouTube returns an empty transcript to non-browser requests, and the free transcript sites are bot-protected. A transcript API maintains the proxy and token handling, so this stays reliable. It also does something ChatGPT cannot: fetch the transcript for you.\n\n### Customization\nSwap the Manual Trigger for a Schedule or a webhook to run it automatically, save notes to Notion or Google Docs, or feed a list of links for a batch.\n\nBuilt by **nocode.expert** \u2014 done-for-you automation and AI workflows. https://nocode.expert"
      },
      "typeVersion": 1
    },
    {
      "id": "section-input",
      "name": "Section: Input",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -256,
        160
      ],
      "parameters": {
        "color": 7,
        "width": 780,
        "height": 624,
        "content": "## 1. URL in config\nPut the YouTube URL in the config node and run. The transcript is fetched via a transcript API (Supadata) - reliable where a plain fetch is blocked."
      },
      "typeVersion": 1
    },
    {
      "id": "section-summarize",
      "name": "Section: Summarize",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        560,
        160
      ],
      "parameters": {
        "color": 7,
        "width": 912,
        "height": 624,
        "content": "## 2. Summarize with an AI Agent\nThe Agent turns the transcript into a TL;DR, key takeaways, structured notes and action items. Add your Anthropic credential on the chat model node."
      },
      "typeVersion": 1
    },
    {
      "id": "section-deliver",
      "name": "Section: Deliver",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1616,
        160
      ],
      "parameters": {
        "color": 7,
        "width": 616,
        "height": 624,
        "content": "## 3. Email the notes\nThe notes are emailed to you. Add Notion or Google Docs to keep a library, or a Schedule trigger to automate."
      },
      "typeVersion": 1
    },
    {
      "id": "when-clicking-test-workflow",
      "name": "When clicking Test workflow",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -176,
        560
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "set-config-video-url-key-email",
      "name": "Set config: video URL, key & email",
      "type": "n8n-nodes-base.set",
      "position": [
        128,
        560
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a1",
              "name": "youtubeUrl",
              "type": "string",
              "value": "https://www.youtube.com/watch?v=R9c_JQrEtu8"
            },
            {
              "id": "a2",
              "name": "focus",
              "type": "string",
              "value": ""
            },
            {
              "id": "a3",
              "name": "supadataApiKey",
              "type": "string",
              "value": ""
            },
            {
              "id": "a4",
              "name": "email",
              "type": "string",
              "value": "you@example.com"
            },
            {
              "id": "a5",
              "name": "maxChars",
              "type": "string",
              "value": "45000"
            },
            {
              "id": "ak",
              "name": "anthropicKey",
              "type": "string",
              "value": ""
            },
            {
              "id": "am",
              "name": "model",
              "type": "string",
              "value": "claude-haiku-4-5"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "fetch-transcript-supadata",
      "name": "Fetch transcript (Supadata)",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        624,
        560
      ],
      "parameters": {
        "url": "=https://api.supadata.ai/v1/youtube/transcript?text=true&url={{ encodeURIComponent($('Set config: video URL, key & email').first().json.youtubeUrl) }}",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "x-api-key",
              "value": "={{ $('Set config: video URL, key & email').first().json.supadataApiKey }}"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "build-notes-prompt",
      "name": "Build notes prompt",
      "type": "n8n-nodes-base.code",
      "position": [
        816,
        560
      ],
      "parameters": {
        "jsCode": "const cfg = $('Set config: video URL, key & email').first().json;\nconst focus = cfg.focus || '';\nlet transcript = $json.content;\nif (Array.isArray(transcript)) transcript = transcript.map((s) => s.text).join(' ');\ntranscript = String(transcript || '').slice(0, Number(cfg.maxChars) || 45000);\nconst schema = { type: 'object', additionalProperties: false, required: ['title','tldr','key_takeaways','notes','action_items'], properties: {\n  title: { type: 'string' }, tldr: { type: 'string' },\n  key_takeaways: { type: 'array', items: { type: 'string' } },\n  notes: { type: 'string' }, action_items: { type: 'array', items: { type: 'string' } } } };\nconst system = 'You are an expert note-taker. Turn this YouTube transcript into notes a busy person can act on WITHOUT watching the video. Be faithful to the transcript; do not invent facts not present.';\nconst user = 'Return: title (best guess of the video topic), tldr (2-3 sentences), key_takeaways (5-8 crisp bullets), notes (well-structured markdown with subheadings), action_items (concrete things to do, or empty).'\n  + (focus ? ' The reader especially cares about: ' + focus + '. Weight the notes toward that.' : '')\n  + '\\n\\n=== TRANSCRIPT ===\\n' + transcript;\nreturn [{ json: { body: {\n  model: cfg.model || 'claude-haiku-4-5', max_tokens: 2000, system,\n  messages: [{ role: 'user', content: user }],\n  output_config: { format: { type: 'json_schema', schema } },\n} } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "format-the-notes",
      "name": "Format the notes",
      "type": "n8n-nodes-base.code",
      "position": [
        1696,
        560
      ],
      "parameters": {
        "jsCode": "const cfg = $('Set config: video URL, key & email').first().json;\nconst blocks = $json.content || [];\nlet out = {};\ntry { out = JSON.parse((blocks.find((b) => b.type === 'text') || {}).text || '{}'); } catch (e) {}\nconst esc = (s) => String(s || '').replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\nconst md = (s) => esc(s)\n  .replace(/^### (.*)$/gm, '<h4>$1</h4>').replace(/^## (.*)$/gm, '<h3>$1</h3>').replace(/^# (.*)$/gm, '<h3>$1</h3>')\n  .replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n  .replace(/^\\s*[-*] (.*)$/gm, '<li>$1</li>').replace(/(<li>[\\s\\S]*?<\\/li>)/g, '<ul>$1</ul>')\n  .replace(/\\n{2,}/g, '<br><br>').replace(/\\n/g, '<br>');\nconst list = (a) => Array.isArray(a) && a.length ? '<ul>' + a.map((x) => '<li>' + esc(x) + '</li>').join('') + '</ul>' : '';\nconst html =\n  '<div style=\"font-family:system-ui,Arial;max-width:760px;margin:0 auto;text-align:left\">' +\n  '<h2>' + esc(out.title) + '</h2>' +\n  (out.tldr ? '<p style=\"font-size:15px;color:#333\"><strong>TL;DR:</strong> ' + esc(out.tldr) + '</p>' : '') +\n  (out.key_takeaways && out.key_takeaways.length ? '<h3>Key takeaways</h3>' + list(out.key_takeaways) : '') +\n  (out.notes ? '<h3>Notes</h3><div>' + md(out.notes) + '</div>' : '') +\n  (out.action_items && out.action_items.length ? '<h3>Action items</h3>' + list(out.action_items) : '') +\n  '<p style=\"color:#999;font-size:12px;margin-top:20px\">Generated from the video transcript via nocode.expert.</p></div>';\nreturn [{ json: { title: out.title || 'Video notes', html, deliverTo: cfg.email } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "email-the-notes",
      "name": "Email the notes",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1904,
        560
      ],
      "parameters": {
        "sendTo": "={{ $('Format the notes').first().json.deliverTo }}",
        "message": "={{ $('Format the notes').first().json.html }}",
        "options": {},
        "subject": "=Notes: {{ $('Format the notes').first().json.title }}"
      },
      "typeVersion": 2.1
    },
    {
      "id": "summarize-http-anthropic",
      "name": "Summarize with Claude",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1136,
        560
      ],
      "parameters": {
        "url": "https://api.anthropic.com/v1/messages",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ JSON.stringify($json.body) }}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "x-api-key",
              "value": "={{ $('Set config: video URL, key & email').first().json.anthropicKey }}"
            },
            {
              "name": "anthropic-version",
              "value": "2023-06-01"
            },
            {
              "name": "content-type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.2
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1"
  },
  "versionId": "1c0227dd-04b6-4442-8c41-7a5f4f356821",
  "nodeGroups": [],
  "connections": {
    "Format the notes": {
      "main": [
        [
          {
            "node": "Email the notes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build notes prompt": {
      "main": [
        [
          {
            "node": "Summarize with Claude",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Summarize with Claude": {
      "main": [
        [
          {
            "node": "Format the notes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch transcript (Supadata)": {
      "main": [
        [
          {
            "node": "Build notes prompt",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking Test workflow": {
      "main": [
        [
          {
            "node": "Set config: video URL, key & email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set config: video URL, key & email": {
      "main": [
        [
          {
            "node": "Fetch transcript (Supadata)",
            "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

This workflow takes a YouTube URL, fetches the video transcript via Supadata, summarizes it into a TL;DR, takeaways, notes, and action items using Anthropic Claude, and emails the formatted results to you via Gmail. Runs manually when you click Test workflow. Reads the YouTube…

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

More Email & Gmail workflows → · Browse all categories →

Related workflows

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

Email & Gmail

Gmail Workflow. Uses gmail, googleCalendar, executeWorkflowTrigger, whatsApp. Event-driven trigger; 61 nodes.

Gmail, Google Calendar, Execute Workflow Trigger +2
Email & Gmail

This workflow ingests proof-of-delivery and completion documents from Gmail or a webhook, extracts key fields with an OpenRouter vision model, reconciles them against Google Sheets dispatch data, arch

Gmail Trigger, HTTP Request, Google Sheets +2
Email & Gmail

Splitout Code. Uses manualTrigger, httpRequest, stickyNote, splitOut. Event-driven trigger; 46 nodes.

HTTP Request, Execute Workflow Trigger, Gmail +1
Email & Gmail

Automate CSV imports into HubSpot without the mess. Powered by n8n. Supercharged by Pollup AI.

HTTP Request, Execute Workflow Trigger, Gmail +1
Email & Gmail

Echo Brand Voice Analysis (Processor) - TASK-074 Dec 10 Fix. Uses formTrigger, httpRequest, executeWorkflowTrigger, moveBinaryData. Event-driven trigger; 40 nodes.

Form Trigger, HTTP Request, Execute Workflow Trigger +2