{
  "id": "STYgmx1IQLxQcLcA",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Auto-generate blog posts from YouTube videos to WordPress and Webflow (TEMPLATE)",
  "tags": [
    {
      "id": "T3xhK1cIuPex0boX",
      "name": "Templates",
      "createdAt": "2025-09-03T11:06:03.839Z",
      "updatedAt": "2025-09-03T11:06:03.839Z"
    }
  ],
  "nodes": [
    {
      "id": "f33a19fb-1da8-434e-a6f4-aaa8e346f510",
      "name": "Extract Video Data",
      "type": "n8n-nodes-base.set",
      "position": [
        96,
        48
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "video_title",
              "name": "videoTitle",
              "type": "string",
              "value": "={{ $json.snippet.title }}"
            },
            {
              "id": "video_url",
              "name": "videoUrl",
              "type": "string",
              "value": "={{ $('Monitor YouTube Feed').item.json.link }}"
            },
            {
              "id": "video_id",
              "name": "videoId",
              "type": "string",
              "value": "={{ $json.id }}"
            },
            {
              "id": "thumbnail_url",
              "name": "thumbnailUrl",
              "type": "string",
              "value": "={{ $json.snippet.thumbnails.maxres.url }}"
            },
            {
              "id": "4125ae80-9be8-4281-9012-c217ee413c05",
              "name": "videoDescription",
              "type": "string",
              "value": "={{ $json.snippet.description }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "92ed5826-54c7-4f20-b017-62fa6cb3f5cc",
      "name": "Format Blog Post",
      "type": "n8n-nodes-base.set",
      "position": [
        672,
        48
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "blog_title",
              "name": "blogTitle",
              "type": "string",
              "value": "={{ $json.message.content.match(/#\\s*(.+)/)[1].trim() }}\n"
            },
            {
              "id": "blog_content",
              "name": "blogContent",
              "type": "string",
              "value": "={{ $json.message.content.replace(/```(?:\\w+)?\\n?/, '').replace(/```$/, '').trim() }}"
            },
            {
              "id": "blog_slug",
              "name": "blogSlug",
              "type": "string",
              "value": "={{ $('Extract Video Data').item.json.videoTitle.toLowerCase().replace(/[^a-z0-9]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '') }}"
            },
            {
              "id": "featured_image",
              "name": "featuredImage",
              "type": "string",
              "value": "={{ $('Extract Video Data').item.json.thumbnailUrl }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "492fca15-3711-4357-b5d1-8d68e4b11ee5",
      "name": "Publish to WordPress",
      "type": "n8n-nodes-base.wordpress",
      "onError": "continueErrorOutput",
      "maxTries": 2,
      "position": [
        1136,
        -112
      ],
      "parameters": {
        "title": "={{ $json.blogTitle }}",
        "additionalFields": {
          "slug": "={{ $json.blogSlug }}",
          "tags": [
            6
          ],
          "content": "={{ $json.data }}",
          "categories": [
            5
          ]
        }
      },
      "credentials": {
        "wordpressApi": {
          "name": "<your credential>"
        }
      },
      "notesInFlow": false,
      "retryOnFail": false,
      "typeVersion": 1,
      "alwaysOutputData": false
    },
    {
      "id": "886d2a08-c897-4b6e-a517-71a30acc5230",
      "name": "Publish to Webflow",
      "type": "n8n-nodes-base.webflow",
      "onError": "continueErrorOutput",
      "position": [
        1120,
        240
      ],
      "parameters": {
        "siteId": "653a17a1b31a397763f3ce40",
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldId": "name",
              "fieldValue": "={{ $json.blogTitle }}"
            },
            {
              "fieldId": "page-content",
              "fieldValue": "={{ $json.data }}"
            },
            {
              "fieldId": "slug",
              "fieldValue": "={{ $json.blogSlug }}"
            },
            {
              "fieldId": "featured-image",
              "fieldValue": "={{ $json.featuredImage }}"
            }
          ]
        },
        "operation": "create",
        "collectionId": "68c01d34f15ae8b8c30ead31"
      },
      "credentials": {
        "webflowOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "d3f9bbb3-5eb6-4b87-9e0d-8ea7001e139a",
      "name": "Workflow Info",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1296,
        -496
      ],
      "parameters": {
        "width": 350,
        "height": 1072,
        "content": "# Information\n\n**Who's it for:** Content creators, marketers, and businesses who publish on both YouTube and blog platforms.\n\n**What it does:** Monitors your YouTube channel for new videos and automatically creates SEO-optimized blog posts using AI, then publishes to WordPress or Webflow.\n\n**How it works:**\n1. RSS Feed Trigger polls YouTube every X amount of time\n2. Extracts video metadata (title, description, thumbnail)\n3. YouTube node extracts full description for extra context\n4. Uses OpenAI (you can choose any model) to generate 600-800 word blog post\n5. Publishes to WordPress AND/OR Webflow with error handling\n6. Sends notifications to Telegram if publishing fails\n\n**Requirements:**\n- YouTube channel ID (avoid tutorial channels for better results)\n- OpenAI API key\n- WordPress OR Webflow credentials\n- Telegram bot (optional, for error notifications)\n\n**Setup steps:**\n1. Replace `YOUR_CHANNEL_ID` in RSS Feed Trigger\n2. Add OpenAI credentials in AI generation node\n3. Configure WordPress and/or Webflow credentials\n4. Add Telegram bot for error notifications (optional)\n5. Test with manual execution first\n\n**Customization:**\n- Modify AI prompt for different content styles\n- Adjust polling frequency (30-60 minutes recommended)\n- Add more CMS platforms\n- Add content verification (is content larger than 600 characters? if not, improve)"
      },
      "typeVersion": 1
    },
    {
      "id": "b01b6aac-9da4-4be7-bcdd-0b4d9d833679",
      "name": "Extract Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        64,
        -112
      ],
      "parameters": {
        "color": 7,
        "width": 180,
        "height": 320,
        "content": "Extracts video title, description, URL, thumbnail. Creates clean slug for blog post."
      },
      "typeVersion": 1
    },
    {
      "id": "e691bd51-6c31-4b1a-9d84-284a034bc10c",
      "name": "AI Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        304,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 260,
        "height": 336,
        "content": "Uses OpenAI to create comprehensive blog post with proper structure and engaging content."
      },
      "typeVersion": 1
    },
    {
      "id": "3a24524a-7ef9-468c-a962-e8875da10540",
      "name": "Format Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        640,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 180,
        "height": 368,
        "content": "Cleans up AI response and prepares final blog post structure."
      },
      "typeVersion": 1
    },
    {
      "id": "7dce235b-13dc-4d69-8914-387642105549",
      "name": "Publish Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1088,
        -256
      ],
      "parameters": {
        "color": 7,
        "width": 200,
        "height": 692,
        "content": "Publishes to WordPress and/or Webflow. Error handling ensures workflow continues if one platform fails."
      },
      "typeVersion": 1
    },
    {
      "id": "b9d5764a-2718-4c15-888f-4908ee35ef1c",
      "name": "Send Error Notification",
      "type": "n8n-nodes-base.telegram",
      "position": [
        1456,
        -208
      ],
      "parameters": {
        "text": "=\u274c Blog post creation failed on Wordpress!\n\nVideo: {{ $('Get video details').item.json.snippet.title }}\nError: {{ $json.error }}\nTime: {{ $now }}",
        "chatId": "=CHAT_ID",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "7118630c-981e-4103-ac8b-acd62d3d084c",
      "name": "Extract Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -176,
        -96
      ],
      "parameters": {
        "color": 7,
        "width": 180,
        "height": 320,
        "content": "Uses Video ID to extract full description for extra context"
      },
      "typeVersion": 1
    },
    {
      "id": "284f96ec-094b-416b-8e51-22bba9190b14",
      "name": "Format Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        848,
        -64
      ],
      "parameters": {
        "color": 7,
        "width": 180,
        "height": 304,
        "content": "Formats Markdown to HTML for Webflow and WordPress"
      },
      "typeVersion": 1
    },
    {
      "id": "9223ad51-d408-4348-964c-778f1efeea56",
      "name": "Weekly RSS Check",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -800,
        128
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                1
              ],
              "triggerAtHour": 21
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "4b99efde-5648-4962-a0ef-e97f34b1283e",
      "name": "Monitor YouTube Feed",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        -576,
        128
      ],
      "parameters": {
        "url": "https://www.youtube.com/feeds/videos.xml?channel_id=UXXXXXXXXX",
        "options": {}
      },
      "executeOnce": false,
      "typeVersion": 1.2
    },
    {
      "id": "152dffb6-38bb-4f83-bbf6-bfd7d1736969",
      "name": "Get video details",
      "type": "n8n-nodes-base.youTube",
      "position": [
        -128,
        48
      ],
      "parameters": {
        "options": {},
        "videoId": "={{ $json.link.split('=')[1] }}",
        "resource": "video",
        "operation": "get"
      },
      "credentials": {
        "youTubeOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "dd501db5-689c-47b3-94f1-c4c3d1bcd181",
      "name": "Process Each Video",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -352,
        128
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "4e0a8146-ed68-4301-b698-ea539c83382b",
      "name": "AI Blog Generator",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        320,
        48
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini",
          "cachedResultName": "GPT-4.1-MINI"
        },
        "options": {
          "temperature": 0.7
        },
        "messages": {
          "values": [
            {
              "content": "=Write a comprehensive blog post about this YouTube video:\n\nVideo Title: {{ $json.videoTitle }}\nVideo Description: {{ $json.videoDescription }}\nVideo URL: {{ $json.videoUrl }}\n\nCreate a blog post that:\n1. Has an engaging headline (different from video title)\n2. Includes compelling introduction\n3. Summarizes key points from the video\n4. Adds valuable insights and context\n5. Uses relevant subheadings (## for H2)\n6. Ends with call-to-action to watch the video\n7. Is 600-800 words\n8. Uses conversational, engaging tone\n9. Targets no-code developers and Bubble.io users\n\nImportant: Format in markdown with proper structure."
            },
            {
              "role": "system",
              "content": "=You are an expert content writer who creates engaging blog posts from YouTube videos across all topics and industries. \n\nWrite in a conversational, accessible tone that educates and engages readers regardless of subject matter. Focus on extracting key insights, providing context, and making complex topics understandable.\n\nAlways structure content with clear headings, actionable takeaways, and encourage readers to watch the original video for the complete experience."
            }
          ]
        }
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "eb5d8c55-3806-4e7f-bbc7-7d41879a0ad1",
      "name": "Convert to HTML",
      "type": "n8n-nodes-base.markdown",
      "position": [
        896,
        48
      ],
      "parameters": {
        "mode": "markdownToHtml",
        "options": {},
        "markdown": "={{ $json.blogContent }}"
      },
      "typeVersion": 1
    },
    {
      "id": "9313716b-396f-417d-a0de-3dc8b6921c2f",
      "name": "Rate Limit Delay",
      "type": "n8n-nodes-base.wait",
      "position": [
        1712,
        96
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "375eae45-91ea-4057-b704-768a862137f4",
      "name": "Send Error Alert",
      "type": "n8n-nodes-base.telegram",
      "position": [
        1472,
        464
      ],
      "parameters": {
        "text": "=\u274c Blog post creation failed on Webflow!\n\nVideo: {{ $('Get video details').item.json.snippet.title }}\nError: {{ $json.error }}\nTime: {{ $now }}",
        "chatId": "=CHAT_ID",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "e4d69452-8b9c-48c4-bb64-0af2bc4e9e51",
      "name": "Publish Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1408,
        -368
      ],
      "parameters": {
        "color": 7,
        "width": 216,
        "height": 1012,
        "content": "Optional: You can just leave one notification node"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "35df95f2-f10f-4625-aafe-6a09a9a0dcda",
  "connections": {
    "Convert to HTML": {
      "main": [
        [
          {
            "node": "Publish to WordPress",
            "type": "main",
            "index": 0
          },
          {
            "node": "Publish to Webflow",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Blog Post": {
      "main": [
        [
          {
            "node": "Convert to HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Rate Limit Delay": {
      "main": [
        [
          {
            "node": "Process Each Video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Weekly RSS Check": {
      "main": [
        [
          {
            "node": "Monitor YouTube Feed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Blog Generator": {
      "main": [
        [
          {
            "node": "Format Blog Post",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get video details": {
      "main": [
        [
          {
            "node": "Extract Video Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Video Data": {
      "main": [
        [
          {
            "node": "AI Blog Generator",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process Each Video": {
      "main": [
        [],
        [
          {
            "node": "Get video details",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Publish to Webflow": {
      "main": [
        [
          {
            "node": "Rate Limit Delay",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send Error Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Monitor YouTube Feed": {
      "main": [
        [
          {
            "node": "Process Each Video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Publish to WordPress": {
      "main": [
        [
          {
            "node": "Rate Limit Delay",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send Error Notification",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}