YouTube video → blog post + social posts

Every new video becomes a blog draft, a LinkedIn post and an X post — saved to Notion for review.

Medium Saves ~8 hours/month Content & SocialBy Flowngn team

Works with n8n · Make · Zapier

How it works

Trigger: RSS — new video on your channel
  1. Detect the new video from your channel's feed.
  2. AI writes a blog post, a LinkedIn post and an X post from the title and description.
  3. Save everything to your Notion content database as "Needs review".

Diagram

RNew videoRSS Feed TriggerWrite content packBasic LLM ChainClaude modelAnthropic Chat Mo…{ }Read content packCodeNSave drafts to Noti…Notion
Trigger App Code AI

Code

JavaScript used in the Code step — already included in the template below.

Read content pack · Code node
// Mode: Run Once for Each Item
// The AI was asked for JSON like {"blog": "...", "linkedin": "...", "x": "..."}.
const match = $json.text.match(/\{[\s\S]*\}/);
const pack = match ? JSON.parse(match[0]) : { blog: $json.text, linkedin: "", x: "" };
const video = $("New video").item.json;

return {
  json: {
    title: video.title,
    link: video.link,
    blog: pack.blog,
    linkedin: pack.linkedin,
    x: pack.x,
  },
};

Build it

Pick your tool — same automation, step by step.

Copy and paste straight into an n8n canvas (Ctrl+V), or download and use Import from File. Then connect your own credentials and replace every YOUR_… placeholder. AI steps use a Claude model node — swap it for OpenAI, Gemini or Ollama if you prefer.

Workflow JSON
Show code (189 lines)
{
  "name": "YouTube video → blog post + social posts (Flowngn)",
  "nodes": [
    {
      "parameters": {
        "content": "## YouTube video → blog post + social posts\nEvery new video becomes a blog draft, a LinkedIn post and an X post — saved to Notion for review.\n\n**Setup**\n1. Open each node and connect your own credentials.\n2. Replace every YOUR_… placeholder.\n3. Test once, then activate.\n\nFree template from Flowngn",
        "height": 260,
        "width": 340
      },
      "id": "4ef499cc-0161-45a2-a7c1-ca5257bbd61d",
      "name": "Setup notes",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -420,
        -60
      ]
    },
    {
      "parameters": {
        "pollTimes": {
          "item": [
            {
              "mode": "everyHour"
            }
          ]
        },
        "feedUrl": "https://www.youtube.com/feeds/videos.xml?channel_id=YOUR_CHANNEL_ID"
      },
      "id": "4ef499cc-0161-45a2-a7c1-ca5257bbd61d",
      "name": "New video",
      "type": "n8n-nodes-base.rssFeedReadTrigger",
      "typeVersion": 1,
      "position": [
        0,
        0
      ]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Turn this YouTube video into a content pack in the creator's voice.\n\nTitle: {{ $json.title }}\nLink: {{ $json.link }}\nDescription: {{ $json.contentSnippet || $json.content }}\n\nReply ONLY with JSON: {\"blog\": \"<600-word blog post in Markdown with headings, embedding the video link>\", \"linkedin\": \"<LinkedIn post under 1200 chars>\", \"x\": \"<X post under 270 chars with the link>\"}"
      },
      "id": "4ef499cc-0161-45a2-a7c1-ca5257bbd61d",
      "name": "Write content pack",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.5,
      "position": [
        300,
        0
      ]
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "claude-sonnet-5",
          "mode": "list"
        },
        "options": {}
      },
      "id": "4ef499cc-0161-45a2-a7c1-ca5257bbd61d",
      "name": "Claude model",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "typeVersion": 1.3,
      "position": [
        300,
        220
      ]
    },
    {
      "parameters": {
        "jsCode": "// Mode: Run Once for Each Item\n// The AI was asked for JSON like {\"blog\": \"...\", \"linkedin\": \"...\", \"x\": \"...\"}.\nconst match = $json.text.match(/\\{[\\s\\S]*\\}/);\nconst pack = match ? JSON.parse(match[0]) : { blog: $json.text, linkedin: \"\", x: \"\" };\nconst video = $(\"New video\").item.json;\n\nreturn {\n  json: {\n    title: video.title,\n    link: video.link,\n    blog: pack.blog,\n    linkedin: pack.linkedin,\n    x: pack.x,\n  },\n};",
        "mode": "runOnceForEachItem"
      },
      "id": "4ef499cc-0161-45a2-a7c1-ca5257bbd61d",
      "name": "Read content pack",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        600,
        0
      ]
    },
    {
      "parameters": {
        "resource": "databasePage",
        "operation": "create",
        "databaseId": {
          "__rl": true,
          "value": "YOUR_CONTENT_DATABASE_ID",
          "mode": "id"
        },
        "title": "={{ $json.title }}",
        "propertiesUi": {
          "propertyValues": [
            {
              "key": "LinkedIn|rich_text",
              "textContent": "={{ $json.linkedin }}"
            },
            {
              "key": "X|rich_text",
              "textContent": "={{ $json.x }}"
            },
            {
              "key": "Video|url",
              "urlValue": "={{ $json.link }}"
            },
            {
              "key": "Status|select",
              "selectValue": "Needs review"
            }
          ]
        },
        "blockUi": {
          "blockValues": [
            {
              "type": "paragraph",
              "textContent": "={{ $json.blog }}"
            }
          ]
        },
        "options": {}
      },
      "id": "4ef499cc-0161-45a2-a7c1-ca5257bbd61d",
      "name": "Save drafts to Notion",
      "type": "n8n-nodes-base.notion",
      "typeVersion": 2.2,
      "position": [
        900,
        0
      ]
    }
  ],
  "connections": {
    "New video": {
      "main": [
        [
          {
            "node": "Write content pack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Write content pack": {
      "main": [
        [
          {
            "node": "Read content pack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read content pack": {
      "main": [
        [
          {
            "node": "Save drafts to Notion",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude model": {
      "ai_languageModel": [
        [
          {
            "node": "Write content pack",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "tags": []
}

Open in the playground to edit →

Tips

  • Write detailed video descriptions — or add a transcript service — for much better posts.

Related flows