This workflow corresponds to n8n.io template #15358 — we link there as the canonical source.
This workflow follows the Agent → Form Trigger 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 →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "2fce2331-d37d-4384-9ae1-6f53f5225eb7",
"name": "Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
-3184,
-768
],
"parameters": {
"color": 4,
"width": 524,
"height": 1060,
"content": "## Webinar Recording to Notion Knowledge Base Builder \u2014 WayinVideo + GPT-4o-mini + Notion + Sheets\n\nFor teams, educators, consultants, and agencies who run or attend webinars and want to build a searchable knowledge base without manually watching recordings or taking notes. Paste any webinar, training, or lecture recording URL via the form. WayinVideo transcribes the full session with speaker labels and timestamps. GPT-4o-mini reads the transcript and identifies 3 to 8 distinct topics covered \u2014 then for each topic writes a complete structured knowledge page with summary, key insights, action items, notable quotes, timestamps, and tags. One Notion page is created per topic. Every created page is also logged to Google Sheets with the Notion page URL for easy team access.\n\n## How it works\n- **1. Form \u2014 Webinar URL + Details** collects the recording URL, webinar title, speaker name, topic category, date, and target team\n- **2. WayinVideo \u2014 Submit Transcription** submits the URL for speaker-labeled transcription\n- **3. Wait \u2014 90 Seconds** gives the API longer initial processing time for webinar-length recordings\n- **4. WayinVideo \u2014 Get Transcript Results** polls for the task result\n- **5. IF \u2014 Transcription Complete?** checks for SUCCEEDED \u2014 if not, retries via 30-second wait\n- **7. Code \u2014 Format Transcript** formats each segment with speaker labels and timestamps\n- **8. AI Agent \u2014 Extract Knowledge Topics** uses GPT-4o-mini to extract 3\u20138 topics as a JSON array \u2014 each with summary, key insights, action items, notable quotes, timestamps, and tags\n- **10. Code \u2014 Parse Topics and Build Notion Content** parses the JSON array, adds webinar metadata, builds markdown content per topic, and returns one item per topic\n- **11. Notion \u2014 Create Topic Page** creates one Notion page per topic with full structured content\n- **12. Google Sheets \u2014 Log Created Pages** logs each page with the Notion page ID and URL\n\n## Set up steps\n1. In **2. WayinVideo \u2014 Submit Transcription** and **4. WayinVideo \u2014 Get Transcript Results** \u2014 replace YOUR_WAYINVIDEO_API_KEY\n2. In **9. OpenAI \u2014 GPT-4o-mini Model** \u2014 connect your OpenAI credential\n3. In **11. Notion \u2014 Create Topic Page** \u2014 connect your Notion OAuth credential and set the parent database ID\n4. In **12. Google Sheets \u2014 Log Created Pages** \u2014 connect your Google Sheets OAuth2 credential and replace YOUR_GOOGLE_SHEET_LOG_ID\n5. Create a Google Sheet tab named Knowledge Base Log with columns: Webinar Title, Topic Title, Speaker, Topic Category, Webinar Date, Notion Page ID, Notion Page URL, Tags, Created On, Status"
},
"typeVersion": 1
},
{
"id": "f1edf4fe-2f80-43e5-8480-62bce6dab8bb",
"name": "Section \u2014 Form Input",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2624,
-416
],
"parameters": {
"color": 5,
"width": 324,
"height": 308,
"content": "## Form Input\nUser submits webinar URL, title, speaker name, topic category, date, and optional target team. All fields feed into the transcript formatter and AI prompt."
},
"typeVersion": 1
},
{
"id": "7cd29961-648f-4601-a6b1-76ccb44cecb4",
"name": "Section \u2014 Transcription Submit and Poll",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2256,
-432
],
"parameters": {
"color": 6,
"width": 660,
"height": 356,
"content": "## WayinVideo Transcription Submit and Poll\nSubmits the webinar URL for speaker-labeled transcription. Waits 90 seconds for initial processing \u2014 longer than short videos. Polls the results endpoint until status equals SUCCEEDED."
},
"typeVersion": 1
},
{
"id": "31c012ef-e906-4ff2-86ca-ad1db9da5900",
"name": "Section \u2014 Status Check and Retry Loop",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1568,
-496
],
"parameters": {
"color": 6,
"width": 292,
"height": 628,
"content": "## Transcription Status Check and Retry Loop\nIF checks for SUCCEEDED status. TRUE proceeds to transcript formatting. FALSE waits 30 seconds and polls again. Loop continues until the transcript is ready."
},
"typeVersion": 1
},
{
"id": "7356d83e-faab-4784-924a-1034058a085e",
"name": "Section \u2014 Transcript Formatting and AI Knowledge Extraction",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1232,
-608
],
"parameters": {
"color": 6,
"width": 516,
"height": 884,
"content": "## Transcript Formatting and AI Knowledge Extraction\nFormats transcript with speaker labels and timestamps. GPT-4o-mini identifies 3\u20138 distinct topics and returns a JSON array \u2014 each topic includes summary, key insights, action items, notable quotes, timestamps, and tags."
},
"typeVersion": 1
},
{
"id": "fd9c1e5c-8ceb-4aa5-add4-35701581969d",
"name": "Section \u2014 Topic Parsing, Notion Creation, and Sheet Logging",
"type": "n8n-nodes-base.stickyNote",
"position": [
-672,
-432
],
"parameters": {
"color": 4,
"width": 756,
"height": 436,
"content": "## Topic Parsing, Notion Page Creation, and Sheet Logging\nParses the JSON array and returns one item per topic with full markdown content. Notion creates one page per topic. Google Sheets logs every created page with the Notion URL for easy team access."
},
"typeVersion": 1
},
{
"id": "7beefd82-26d7-4cf8-937d-51d4632035d6",
"name": "1. Form \u2014 Webinar URL + Details",
"type": "n8n-nodes-base.formTrigger",
"position": [
-2496,
-288
],
"parameters": {
"options": {},
"formTitle": "Webinar to Notion Knowledge Base Builder",
"formFields": {
"values": [
{
"fieldLabel": "Webinar / Recording URL",
"placeholder": "https://zoom.us/rec/xxxxxxx or YouTube/Vimeo link",
"requiredField": true
},
{
"fieldLabel": "Webinar Title",
"placeholder": "e.g. Advanced SEO Strategies for 2025 \u2014 Webinar",
"requiredField": true
},
{
"fieldLabel": "Speaker / Presenter Name",
"placeholder": "e.g. John Smith, Jane Doe",
"requiredField": true
},
{
"fieldLabel": "Topic Category",
"placeholder": "e.g. SEO, Marketing, AI, Leadership, Sales, Product",
"requiredField": true
},
{
"fieldLabel": "Webinar Date",
"placeholder": "e.g. 2025-04-28",
"requiredField": true
},
{
"fieldLabel": "Target Team / Department",
"placeholder": "e.g. Marketing Team, Sales Team, All Staff"
}
]
},
"formDescription": "Paste your webinar or training recording URL. AI will transcribe the full session and automatically build a structured knowledge base in Notion \u2014 one page per topic covered."
},
"typeVersion": 2.2
},
{
"id": "f10ebfae-7b0a-44b7-a8cf-86005212e44f",
"name": "2. WayinVideo \u2014 Submit Transcription",
"type": "n8n-nodes-base.httpRequest",
"position": [
-2208,
-288
],
"parameters": {
"url": "https://wayinvideo-api.wayin.ai/api/v2/transcripts",
"method": "POST",
"options": {},
"jsonBody": "={\n \"video_url\": \"{{ $json['Webinar / Recording URL'] }}\",\n \"target_lang\": \"en\"\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_TOKEN_HERE"
},
{
"name": "x-wayinvideo-api-version",
"value": "v2"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "00ecb380-5493-4ae2-ae89-b60a5f9a7ddc",
"name": "3. Wait \u2014 90 Seconds",
"type": "n8n-nodes-base.wait",
"position": [
-1968,
-288
],
"parameters": {
"amount": 90
},
"typeVersion": 1.1
},
{
"id": "69146826-aa68-4d7c-98e3-29f986bf3033",
"name": "4. WayinVideo \u2014 Get Transcript Results",
"type": "n8n-nodes-base.httpRequest",
"position": [
-1712,
-288
],
"parameters": {
"url": "=https://wayinvideo-api.wayin.ai/api/v2/transcripts/results/{{ $('2. WayinVideo \u2014 Submit Transcription').item.json.data.id }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_TOKEN_HERE"
},
{
"name": "x-wayinvideo-api-version",
"value": "v2"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "02894262-1e20-4c42-9cb7-fe2922bed7fd",
"name": "5. IF \u2014 Transcription Complete?",
"type": "n8n-nodes-base.if",
"position": [
-1488,
-288
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "status-check",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.status }}",
"rightValue": "SUCCEEDED"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "cac5a801-7c09-464c-8242-a2a2af2d460d",
"name": "6. Wait \u2014 30 Seconds Retry",
"type": "n8n-nodes-base.wait",
"position": [
-1488,
-80
],
"parameters": {
"amount": 30
},
"typeVersion": 1.1
},
{
"id": "44b30f43-e9de-4e6b-8ada-b04ca3b9fe64",
"name": "7. Code \u2014 Format Transcript",
"type": "n8n-nodes-base.code",
"position": [
-1200,
-304
],
"parameters": {
"jsCode": "// Get transcript segments from WayinVideo response\nconst segments = $('4. WayinVideo \u2014 Get Transcript Results').item.json.data.transcript || [];\n\nif (segments.length === 0) {\n throw new Error('Transcript is empty \u2014 check if the video URL is valid and publicly accessible.');\n}\n\n// Format transcript with speaker labels and timestamps for GPT\nconst formattedTranscript = segments\n .map(s => {\n const timeInSeconds = Math.floor(s.start / 1000);\n const minutes = Math.floor(timeInSeconds / 60);\n const seconds = timeInSeconds % 60;\n const timestamp = `${minutes}:${seconds.toString().padStart(2, '0')}`;\n return `[${s.speaker} | ${timestamp}] ${s.text.trim()}`;\n })\n .join('\\n');\n\n// Calculate duration\nconst lastSegment = segments[segments.length - 1];\nconst totalDurationMs = lastSegment?.end || 0;\nconst totalMinutes = Math.round(totalDurationMs / 60000);\n\n// Unique speakers\nconst speakers = [...new Set(segments.map(s => s.speaker))];\n\n// Word count\nconst wordCount = segments.map(s => s.text).join(' ').split(/\\s+/).length;\n\nreturn [{\n json: {\n formattedTranscript,\n wordCount,\n totalMinutes,\n speakerCount: speakers.length,\n speakers: speakers.join(', '),\n webinarTitle: $('1. Form \u2014 Webinar URL + Details').item.json['Webinar Title'],\n speakerName: $('1. Form \u2014 Webinar URL + Details').item.json['Speaker / Presenter Name'],\n topicCategory: $('1. Form \u2014 Webinar URL + Details').item.json['Topic Category'],\n webinarDate: $('1. Form \u2014 Webinar URL + Details').item.json['Webinar Date'],\n targetTeam: $('1. Form \u2014 Webinar URL + Details').item.json['Target Team / Department'] || 'All Teams',\n videoUrl: $('1. Form \u2014 Webinar URL + Details').item.json['Webinar / Recording URL']\n }\n}];"
},
"typeVersion": 2
},
{
"id": "83717c32-44d5-44ea-990a-e12061e3ff5a",
"name": "8. AI Agent \u2014 Extract Knowledge Topics",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-960,
-304
],
"parameters": {
"text": "={{ $json.formattedTranscript }}",
"options": {
"systemMessage": "=You are an expert knowledge manager who specializes in extracting structured knowledge from webinar and training transcripts.\n\nYour job is to read this webinar transcript and extract the key topics covered \u2014 then for each topic, write a detailed structured knowledge page ready to save in Notion.\n\n---\n\n## WEBINAR DETAILS\n- Webinar Title: {{ $json.webinarTitle }}\n- Speaker / Presenter: {{ $json.speakerName }}\n- Topic Category: {{ $json.topicCategory }}\n- Date: {{ $json.webinarDate }}\n- Duration: {{ $json.totalMinutes }} minutes\n- Target Team: {{ $json.targetTeam }}\n- Recording URL: {{ $json.videoUrl }}\n\n---\n\n## YOUR TASK\n1. First identify all the distinct topics covered in the webinar (minimum 3, maximum 8 topics)\n2. For each topic, write a complete structured knowledge page\n3. Base EVERYTHING only on what was actually said in the transcript \u2014 no invented content\n\n---\n\n## OUTPUT FORMAT\nReturn a valid JSON array only \u2014 no text before or after, no markdown backticks.\n\nEach item in the array represents one topic page:\n\n[\n {\n \"topic_title\": \"Short clear topic title (5-8 words)\",\n \"topic_summary\": \"2-3 sentence summary of what was covered on this topic. Write in plain English. No jargon.\",\n \"key_insights\": [\n \"First key insight from the transcript on this topic \u2014 one sentence each\",\n \"Second key insight\",\n \"Third key insight\",\n \"Fourth key insight (if applicable)\",\n \"Fifth key insight (if applicable)\"\n ],\n \"action_items\": [\n \"First specific action item or recommendation mentioned by the speaker\",\n \"Second action item\",\n \"Third action item (if mentioned)\"\n ],\n \"notable_quotes\": [\n \"Exact or near-exact quote from the speaker that best captures this topic\"\n ],\n \"timestamps\": \"Approximate time range where this topic was discussed \u2014 e.g. 5:00 - 15:30\",\n \"tags\": [\"tag1\", \"tag2\", \"tag3\"]\n }\n]\n\n---\n\n## RULES\n- Return ONLY the JSON array \u2014 nothing else\n- Do not invent content \u2014 extract only from transcript\n- Keep key_insights short and actionable \u2014 one clear idea per insight\n- Keep action_items practical \u2014 what should someone DO after watching this\n- Tags should be 2-4 lowercase single words relevant to the topic\n- If a notable quote cannot be found for a topic, use an empty array []\n\nNow read the transcript and return the JSON array:"
},
"promptType": "define"
},
"typeVersion": 3.1
},
{
"id": "b6b708f7-8f64-4af5-9a48-69fac0782e73",
"name": "9. OpenAI \u2014 GPT-4o-mini Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-960,
-96
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini"
},
"options": {},
"builtInTools": {}
},
"typeVersion": 1.3
},
{
"id": "7271ab3b-79ff-466f-bc6b-546aebf40fb8",
"name": "10. Code \u2014 Parse Topics and Build Notion Content",
"type": "n8n-nodes-base.code",
"position": [
-608,
-304
],
"parameters": {
"jsCode": "// Parse AI output \u2014 extract JSON array of topics\nconst output = $input.first().json.output || '';\n\nlet topics = [];\ntry {\n // Strip any markdown formatting if present\n const cleaned = output\n .replace(/```json/gi, '')\n .replace(/```/g, '')\n .trim();\n\n // Find JSON array in output\n const match = cleaned.match(/\\[\\s*\\{[\\s\\S]*\\}\\s*\\]/);\n if (match) {\n topics = JSON.parse(match[0]);\n } else {\n topics = JSON.parse(cleaned);\n }\n} catch (e) {\n throw new Error('Could not parse AI output as JSON. Check the AI prompt output: ' + output.substring(0, 200));\n}\n\nif (!Array.isArray(topics) || topics.length === 0) {\n throw new Error('No topics extracted from AI output.');\n}\n\n// Add webinar metadata to each topic\nconst webinarTitle = $('7. Code \u2014 Format Transcript').item.json.webinarTitle;\nconst speakerName = $('7. Code \u2014 Format Transcript').item.json.speakerName;\nconst topicCategory = $('7. Code \u2014 Format Transcript').item.json.topicCategory;\nconst webinarDate = $('7. Code \u2014 Format Transcript').item.json.webinarDate;\nconst targetTeam = $('7. Code \u2014 Format Transcript').item.json.targetTeam;\nconst videoUrl = $('7. Code \u2014 Format Transcript').item.json.videoUrl;\nconst totalMinutes = $('7. Code \u2014 Format Transcript').item.json.totalMinutes;\n\nreturn topics.map((topic, index) => ({\n json: {\n // Topic data\n topicTitle: topic.topic_title || `Topic ${index + 1}`,\n topicSummary: topic.topic_summary || '',\n keyInsights: Array.isArray(topic.key_insights) ? topic.key_insights : [],\n actionItems: Array.isArray(topic.action_items) ? topic.action_items : [],\n notableQuotes: Array.isArray(topic.notable_quotes) ? topic.notable_quotes : [],\n timestamps: topic.timestamps || '',\n tags: Array.isArray(topic.tags) ? topic.tags : [],\n\n // Webinar metadata\n webinarTitle,\n speakerName,\n topicCategory,\n webinarDate,\n targetTeam,\n videoUrl,\n totalMinutes,\n topicIndex: index + 1,\n\n // Build Notion page content in Markdown\n notionPageContent: [\n `## Summary`,\n topic.topic_summary || '',\n ``,\n `## Key Insights`,\n ...(topic.key_insights || []).map(insight => `- ${insight}`),\n ``,\n `## Action Items`,\n ...(topic.action_items || []).map(action => `- [ ] ${action}`),\n ``,\n ...(topic.notable_quotes && topic.notable_quotes.length > 0 ? [\n `## Notable Quotes`,\n ...topic.notable_quotes.map(quote => `> \"${quote}\"`),\n ``\n ] : []),\n `## Webinar Details`,\n `- **Webinar:** ${webinarTitle}`,\n `- **Speaker:** ${speakerName}`,\n `- **Date:** ${webinarDate}`,\n `- **Duration:** ${totalMinutes} minutes`,\n `- **Timestamps in recording:** ${topic.timestamps || 'N/A'}`,\n `- **Target Team:** ${targetTeam}`,\n `- **Recording URL:** ${videoUrl}`\n ].join('\\n')\n }\n}));"
},
"typeVersion": 2
},
{
"id": "acdd4623-c957-49fe-b6ac-3bbb1ef5f141",
"name": "11. Notion \u2014 Create Topic Page",
"type": "n8n-nodes-base.notion",
"position": [
-336,
-304
],
"parameters": {
"title": "={{ $json.webinarTitle }} \u2014 {{ $json.topicTitle }}",
"pageId": {
"__rl": true,
"mode": "url",
"value": ""
},
"blockUi": {
"blockValues": [
{
"textContent": "={{ $json.notionPageContent }}"
}
]
},
"options": {}
},
"typeVersion": 2.2
},
{
"id": "af26ec34-6fa6-4f61-8300-49f7ac40c489",
"name": "12. Google Sheets \u2014 Log Created Pages",
"type": "n8n-nodes-base.googleSheets",
"position": [
-96,
-304
],
"parameters": {
"columns": {
"value": {
"Tags": "={{ $('10. Code \u2014 Parse Topics and Build Notion Content').item.json.tags.join(', ') }}",
"Status": "Published",
"Speaker": "={{ $('10. Code \u2014 Parse Topics and Build Notion Content').item.json.speakerName }}",
"Created On": "={{ $now.toFormat('dd MMMM yyyy HH:mm') }}",
"Topic Title": "={{ $('10. Code \u2014 Parse Topics and Build Notion Content').item.json.topicTitle }}",
"Webinar Date": "={{ $('10. Code \u2014 Parse Topics and Build Notion Content').item.json.webinarDate }}",
"Webinar Title": "={{ $('10. Code \u2014 Parse Topics and Build Notion Content').item.json.webinarTitle }}",
"Notion Page ID": "={{ $json.id }}",
"Topic Category": "={{ $('10. Code \u2014 Parse Topics and Build Notion Content').item.json.topicCategory }}",
"Notion Page URL": "={{ $json.url }}"
},
"schema": [],
"mappingMode": "defineBelow",
"matchingColumns": []
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Knowledge Base Log"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "YOUR_GOOGLE_SHEET_LOG_ID"
}
},
"typeVersion": 4.5
}
],
"connections": {
"3. Wait \u2014 90 Seconds": {
"main": [
[
{
"node": "4. WayinVideo \u2014 Get Transcript Results",
"type": "main",
"index": 0
}
]
]
},
"6. Wait \u2014 30 Seconds Retry": {
"main": [
[
{
"node": "4. WayinVideo \u2014 Get Transcript Results",
"type": "main",
"index": 0
}
]
]
},
"7. Code \u2014 Format Transcript": {
"main": [
[
{
"node": "8. AI Agent \u2014 Extract Knowledge Topics",
"type": "main",
"index": 0
}
]
]
},
"9. OpenAI \u2014 GPT-4o-mini Model": {
"ai_languageModel": [
[
{
"node": "8. AI Agent \u2014 Extract Knowledge Topics",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"11. Notion \u2014 Create Topic Page": {
"main": [
[
{
"node": "12. Google Sheets \u2014 Log Created Pages",
"type": "main",
"index": 0
}
]
]
},
"1. Form \u2014 Webinar URL + Details": {
"main": [
[
{
"node": "2. WayinVideo \u2014 Submit Transcription",
"type": "main",
"index": 0
}
]
]
},
"5. IF \u2014 Transcription Complete?": {
"main": [
[
{
"node": "7. Code \u2014 Format Transcript",
"type": "main",
"index": 0
}
],
[
{
"node": "6. Wait \u2014 30 Seconds Retry",
"type": "main",
"index": 0
}
]
]
},
"2. WayinVideo \u2014 Submit Transcription": {
"main": [
[
{
"node": "3. Wait \u2014 90 Seconds",
"type": "main",
"index": 0
}
]
]
},
"4. WayinVideo \u2014 Get Transcript Results": {
"main": [
[
{
"node": "5. IF \u2014 Transcription Complete?",
"type": "main",
"index": 0
}
]
]
},
"8. AI Agent \u2014 Extract Knowledge Topics": {
"main": [
[
{
"node": "10. Code \u2014 Parse Topics and Build Notion Content",
"type": "main",
"index": 0
}
]
]
},
"10. Code \u2014 Parse Topics and Build Notion Content": {
"main": [
[
{
"node": "11. Notion \u2014 Create Topic Page",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Paste any webinar, training, or lecture recording URL into a simple form along with the title, speaker name, topic category, and date and the workflow builds your knowledge base automatically. WayinVideo transcribes the full session with speaker labels and timestamps, then…
Source: https://n8n.io/workflows/15358/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
🎯 Create viral TikToks, Shorts, Reels, podcasts, and ASMR videos in minutes — all on autopilot.
Digistars - Scrape & Crawl. Uses httpRequest, n8n-nodes-firecrawl-scraper, googleSheets, lmChatOpenAi. Event-driven trigger; 63 nodes.
🧠 Automate end-to-end SEO blog creation and WordPress publishing using a GPT-5 multi-agent workflow with real-time research, metadata generation, and optional featured images.
AI Blog Publisher – Automated Blog Content Workflow This workflow is designed for individuals and teams who regularly publish content on their blog and want to automate the entire process from start t
The workflow runs every hour with a randomized delay of 5–20 minutes to help distribute load. It records the exact date and time a lead is emailed so you can track outreach. Follow-ups are automatical