This workflow corresponds to n8n.io template #10968 — we link there as the canonical source.
This workflow follows the Agent → Datatable 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": "4ab973b0-1d9e-4f21-9054-fd518305153d",
"name": "Latest Episode",
"type": "n8n-nodes-base.limit",
"position": [
-848,
-448
],
"parameters": {},
"typeVersion": 1
},
{
"id": "90d86576-599f-49a6-ad8f-735b6ab65f29",
"name": "Parse HTML",
"type": "n8n-nodes-base.code",
"position": [
-512,
-448
],
"parameters": {
"jsCode": "const html = $input.first().json.data;\n\n// Function to clean the text extracted from the HTTP request node\nfunction cleanText(text) {\n if (!text) return '';\n return text\n .replace(/<[^>]*>/g, '') \n .replace(/ /g, ' ') \n .replace(/&/g, '&') \n .replace(/</g, '<') \n .replace(/>/g, '>') \n .replace(/"/g, '\"') \n .replace(/\\\\n/g, '\\n') \n .replace(/\\s+/g, ' ') \n .trim();\n}\n\n// Episode Meta Data for record\nconst episodeUrl = $('Podcasts from RSS Feed').first().json.link;\nconst episodeMatch = episodeUrl.match(/ep-(\\d+)/);\nconst episodeId = episodeMatch ? episodeMatch[1] : 'unknown';\nconst episodeCode = episodeMatch ? episodeMatch[0] : 'unknown';\nconst episodeTitle = $('Podcasts from RSS Feed').first().json.title|| 'Unknown Title';\n\n// Extract the vocabulary from the specific section\nconst vocabMatch = html.match(/<h3>Vocabulary<\\/h3>([\\s\\S]*?)(?=<h3>|<p><strong style)/);\nlet vocabularyItems = [];\n\nif (vocabMatch && vocabMatch[1]) {\n const vocabHtml = vocabMatch[1];\n \n // Parse vocabulary entries (format: <strong>word</strong><br />definition<br /> )\n const vocabRegex = /<strong>(.*?)<\\/strong><br \\/>(.*?)(?=<br \\/>|<\\/p>)/gs;\n const matches = [...vocabHtml.matchAll(vocabRegex)];\n \n matches.forEach(match => {\n const word = cleanText(match[1]);\n const definition = cleanText(match[2]);\n \n if (word && definition && word !== ' ') {\n vocabularyItems.push({\n word: word,\n definition: definition\n });\n }\n });\n}\n\n// Extract Transcript\nconst transcriptMatch = html.match(/<strong style=\"font-size: 1\\.17em;\">TRANSCRIPT<\\/strong><\\/p>([\\s\\S]*?)(?=<h3>Next<\\/h3>|<div class=\"widget widget-list)/);\nlet transcriptText = '';\n\nif (transcriptMatch && transcriptMatch[1]) {\n const paragraphs = transcriptMatch[1].match(/<p[^>]*>(.*?)<\\/p>/gs);\n \n if (paragraphs) {\n transcriptText = paragraphs\n .map(p => cleanText(p))\n .filter(t => t.length > 0 && !t.startsWith('Note:')) // Remove note disclaimer\n .join('\\n\\n');\n }\n}\n\n// Extract Episode Description\nconst descriptionMatch = html.match(/<meta name=\"description\" content=\"([^\"]+)\"/);\nconst description = descriptionMatch ? descriptionMatch[1] : '';\n\n// Extract Links for download\nconst downloadLinks = {\n pdf: '',\n audio: '',\n transcript: '',\n podcast: ''\n};\n// PDF link\nconst pdfMatch = html.match(/href=\"(https:\\/\\/downloads\\.bbc\\.co\\.uk\\/learningenglish\\/features\\/6min\\/[^\"]*\\.pdf)\"/);\nif (pdfMatch) {\n downloadLinks.pdf = pdfMatch[1];\n downloadLinks.transcript = pdfMatch[1]; // Same as PDF in this case\n}\n// Audio MP3 link\nconst audioMatch = html.match(/href=\"(https:\\/\\/downloads\\.bbc\\.co\\.uk\\/learningenglish\\/features\\/6min\\/[^\"]*\\.mp3)\"/);\nif (audioMatch) {\n downloadLinks.audio = audioMatch[1];\n}\n// Podcast link\nconst podcastMatch = html.match(/href=\"(https:\\/\\/www\\.bbc\\.co\\.uk\\/programmes\\/p02pc9tn\\/episodes\\/downloads)\"/);\nif (podcastMatch) {\n downloadLinks.podcast = podcastMatch[1];\n}\n\nreturn {\n json: {\n // Episode metadata\n episode_id: episodeId,\n episode_code: episodeCode,\n episode_url: episodeUrl,\n episode_title: cleanText(episodeTitle),\n description: description,\n processed_date: new Date().toISOString().split('T')[0],\n \n // Main content\n transcript: transcriptText,\n transcript_word_count: transcriptText.split(/\\s+/).length,\n \n // Vocabulary (BBC's own selection)\n vocabulary_items: vocabularyItems,\n vocabulary_count: vocabularyItems.length,\n\n // Download links\n download_links: downloadLinks\n }\n};"
},
"typeVersion": 2
},
{
"id": "a10da932-7465-41d1-ac82-ff4a39a62714",
"name": "Prepare Email",
"type": "n8n-nodes-base.code",
"position": [
384,
-480
],
"parameters": {
"jsCode": "// Data from the parsing node\nconst episodeData = $('Parse HTML').first().json;\n\n// Hook Message from AI\nconst hookMessage = $('Email Hook').first().json.output;\n\n// Practice Exercises from AI\nconst aiPracticeContent = $('Practice Exercises').first().json.output;\nconst practiceExercises = aiPracticeContent\n .split('\\n')\n .filter(line => line.trim().length > 0)\n .filter(line => line.includes('_____'));\n\n// Discussion Questions from AI\nconst aiDiscussionContent = $('Discussion Questions').first().json.output;\nconst discussionQuestions = aiDiscussionContent\n .split('\\n')\n .filter(line => line.trim().length > 0)\n .map(line => line.replace(/^\\d+[\\.\\)]\\s*/, '').trim())\n .filter(line => line.length > 10)\n .slice(0, 5);\n\n// Additional functions for data processing\nfunction cleanTitle(title) {\n return title\n .replace(/^BBC Learning English - 6 Minute English \\/ /, '')\n .replace(/^BBC Learning English - /, '')\n .trim();\n}\n\nfunction generateVocabHTML(vocabItems) {\n return vocabItems.map((item, index) => `\n <li class=\"vocab-item\">\n <span class=\"vocab-word\">${index + 1}. ${item.word}</span>\n <span class=\"vocab-definition\">${item.definition}</span>\n </li>\n `).join('');\n}\n\nfunction generatePracticeHTML(exercises) {\n return exercises.map(ex => `<li>${ex.trim()}</li>`).join('');\n}\n\nfunction generateDiscussionHTML(questions) {\n return questions.map(q => `<li class=\"discussion-item\">${q}</li>`).join('');\n}\n\n// Email HTML\nconst htmlEmail = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Learn English with BBC & LogiGreen Bot</title>\n <style>\n body { margin: 0; padding: 0; font-family: Arial, sans-serif; background-color: #f4f4f4; }\n .email-container { max-width: 600px; margin: 0 auto; background-color: #ffffff; }\n .header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: #ffffff; padding: 30px 20px; text-align: center; }\n .header h1 { margin: 0; font-size: 24px; }\n .episode-badge { display: inline-block; background-color: rgba(255, 255, 255, 0.2); padding: 5px 15px; border-radius: 20px; font-size: 12px; margin-top: 10px; }\n .content { padding: 30px 20px; }\n .section { margin-bottom: 30px; }\n .section-title { font-size: 18px; font-weight: 700; color: #2d3748; margin-bottom: 15px; padding-bottom: 10px; border-bottom: 3px solid #667eea; }\n .hook-message { background-color: #f7fafc; padding: 20px; border-radius: 8px; border-left: 4px solid #667eea; line-height: 1.6; color: #2d3748; margin-bottom: 20px; }\n .button-container { text-align: center; margin: 25px 0; }\n .button { display: inline-block; padding: 14px 28px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: #ffffff !important; text-decoration: none; border-radius: 6px; font-weight: 600; font-size: 16px; }\n .vocab-list { list-style: none; padding: 0; margin: 0; }\n .vocab-item { background-color: #f7fafc; padding: 15px; border-radius: 6px; margin-bottom: 12px; border-left: 4px solid #667eea; }\n .vocab-word { font-weight: 700; color: #667eea; font-size: 16px; display: block; margin-bottom: 5px; }\n .vocab-definition { color: #4a5568; line-height: 1.5; font-size: 14px; }\n .discussion-list { list-style: none; padding: 0; counter-reset: discussion-counter; }\n .discussion-item { padding: 15px; margin-bottom: 12px; background-color: #fffaf0; border-radius: 6px; border-left: 4px solid #ed8936; counter-increment: discussion-counter; position: relative; padding-left: 50px; }\n .discussion-item:before { content: counter(discussion-counter); position: absolute; left: 15px; top: 15px; background-color: #ed8936; color: white; width: 24px; height: 24px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 14px; }\n .checklist { background-color: #f0fff4; padding: 20px; border-radius: 8px; border-left: 4px solid #48bb78; }\n .checklist-item { padding: 10px 0; border-bottom: 1px solid #c6f6d5; color: #2d3748; }\n .checklist-item:last-child { border-bottom: none; }\n .checklist-item:before { content: \"\u2610\"; margin-right: 10px; font-size: 18px; color: #48bb78; }\n .footer { background-color: #2d3748; color: #a0aec0; padding: 30px 20px; text-align: center; font-size: 14px; }\n .footer a { color: #667eea; text-decoration: none; }\n @media only screen and (max-width: 600px) {\n .email-container { width: 100% !important; }\n .content { padding: 20px 15px; }\n .button { display: block; margin: 10px 0; }\n }\n </style>\n</head>\n<body>\n <div class=\"email-container\">\n \n <!-- Header that you can improve with your logo -->\n <div class=\"header\">\n <h1>\ud83c\udfa7 Podcast: BBC 6 Minute English</h1>\n <div class=\"episode-badge\">NEW EPISODE</div>\n </div>\n \n <!-- Content of the email -->\n <div class=\"content\">\n \n <!-- Title -->\n <div class=\"section\">\n <h2 style=\"color: #2d3748; font-size: 22px; margin: 0 0 10px 0;\">\n ${cleanTitle(episodeData.episode_title)}\n </h2>\n <p style=\"color: #718096; font-style: italic; margin: 0;\">\n ${episodeData.description}\n </p>\n </div>\n \n <!-- Hook Message -->\n <div class=\"hook-message\">\n ${hookMessage}\n </div>\n \n <!-- Listen Button -->\n <div class=\"button-container\">\n <a href=\"${episodeData.download_links.audio}\" class=\"button\">\n \ud83c\udfb5 Listen Now (6 min)\n </a>\n </div>\n \n <!-- Resources -->\n <div class=\"section\">\n <div class=\"section-title\">\ud83d\udcda Resources</div>\n <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\">\n <tr>\n <td width=\"33%\" align=\"center\" style=\"padding: 5px;\">\n <a href=\"${episodeData.download_links.audio}\" style=\"display: block; padding: 15px; background-color: #f7fafc; border-radius: 6px; text-decoration: none; color: #667eea; font-weight: 600; border: 2px solid #e2e8f0;\">\n <span style=\"font-size: 24px; display: block; margin-bottom: 5px;\">\ud83c\udfb5</span>\n Audio\n </a>\n </td>\n <td width=\"33%\" align=\"center\" style=\"padding: 5px;\">\n <a href=\"${episodeData.download_links.pdf}\" style=\"display: block; padding: 15px; background-color: #f7fafc; border-radius: 6px; text-decoration: none; color: #667eea; font-weight: 600; border: 2px solid #e2e8f0;\">\n <span style=\"font-size: 24px; display: block; margin-bottom: 5px;\">\ud83d\udcc4</span>\n Transcript\n </a>\n </td>\n <td width=\"33%\" align=\"center\" style=\"padding: 5px;\">\n <a href=\"${episodeData.download_links.podcast}\" style=\"display: block; padding: 15px; background-color: #f7fafc; border-radius: 6px; text-decoration: none; color: #667eea; font-weight: 600; border: 2px solid #e2e8f0;\">\n <span style=\"font-size: 24px; display: block; margin-bottom: 5px;\">\ud83c\udf99\ufe0f</span>\n More\n </a>\n </td>\n </tr>\n </table>\n </div>\n \n <!-- Block Vocabulary -->\n <div class=\"section\">\n <div class=\"section-title\">\ud83d\udcd6 Key Vocabulary (${episodeData.vocabulary_count} expressions)</div>\n <ul class=\"vocab-list\">\n ${generateVocabHTML(episodeData.vocabulary_items)}\n </ul>\n </div>\n \n <!-- Block Practice -->\n <div class=\"section\">\n <div class=\"section-title\">\u270f\ufe0f Vocabulary Practice</div>\n <p style=\"color: #4a5568; line-height: 1.6; margin-bottom: 15px;\">\n <strong>Fill in the blanks:</strong>\n </p>\n <ol style=\"color: #4a5568; line-height: 1.8; padding-left: 20px;\">\n ${generatePracticeHTML(practiceExercises)}\n </ol>\n </div>\n \n <!-- Block Discussion -->\n <div class=\"section\">\n <div class=\"section-title\">\ud83d\udcac Discussion Questions</div>\n <ul class=\"discussion-list\">\n ${generateDiscussionHTML(discussionQuestions)}\n </ul>\n </div>\n \n <!-- Footer Message (Change it with your own infos) -->\n <div style=\"text-align: center; padding: 30px 0; border-top: 2px solid #e2e8f0; margin-top: 30px;\">\n <p style=\"font-size: 18px; color: #2d3748; margin: 0 0 10px 0; font-weight: 600;\">\n \ud83d\ude80 Ready to level up your English with n8n?\n </p>\n <p style=\"color: #718096; margin: 0;\">\n Copy this workflow and deploy it on your instance!\n </p>\n </div>\n </div>\n \n <!-- Footer -->\n <div class=\"footer\">\n <p style=\"margin: 0 0 10px 0;\">\n <strong style=\"color: #ffffff;\">LogiGreen Learning English Bot</strong>\n </p>\n <p style=\"margin: 0 0 15px 0;\">\n Episode: ${episodeData.episode_code} | ${episodeData.processed_date}\n </p>\n <p style=\"margin: 0; font-size: 12px;\">\n <a href=\"https://github.com/samirsaci/\">My GitHub</a> | <a href=\"https://www.logi-green.com\">LogiGreen English Learning Bot</a>\n </p>\n </div>\n </div>\n</body>\n</html>`;\n\n\nreturn {\n json: {\n html: htmlEmail,\n subject: `\ud83c\udfeb English Learning Episode: ${cleanTitle(episodeData.episode_title)}`,\n episode_id: episodeData.episode_id\n }\n};"
},
"typeVersion": 2
},
{
"id": "55a9a4eb-dcdd-450e-9ca3-767c537df012",
"name": "Discussion Questions",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-128,
-128
],
"parameters": {
"text": "=Create 5 engaging discussion questions based on this BBC 6 Minute English episode:\n\nEpisode: {{ $json.episode_title }}\nDescription: {{ $json.description }}\nTranscript excerpt: {{ $json.transcript }}...\n\nRequirements:\n1. Questions should encourage personal opinions and experiences\n2. Range from easier (personal reaction) to more complex (critical thinking)\n3. Make students want to TALK and share their views\n4. Connect to students' real lives when possible\n5. Use some of the target vocabulary naturally: {{ $json.vocabulary_items.map(v => v.word).join(', ') }}\n6. Keep language at B1-B2 level\n7. Avoid yes/no questions - ask WHY, HOW, WHAT IF\n\nFormat: Return ONLY the 5 questions, one per line, without numbering (I'll add numbers automatically).\n\nExample questions:\nWhat's your opinion on [topic]? Have you experienced something similar?\nIf you could [hypothetical], what would you do and why?\nHow do you think [topic] will change in the next 10 years?",
"options": {
"systemMessage": "=You are an experienced ESL teacher creating vocabulary practice exercises for intermediate learners."
},
"promptType": "define"
},
"typeVersion": 2.2
},
{
"id": "254e0003-2fe8-40ec-b679-b72a4fcaa229",
"name": "Practice Exercises",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-128,
-336
],
"parameters": {
"text": "=Create {{ $json.vocabulary_count }} fill-in-the-blank practice sentences using these vocabulary words from the BBC episode:\n\n{{ $json.vocabulary_items.map((v, i) => `${i+1}. ${v.word}: ${v.definition}`).join('\\n') }}\n\nRequirements:\n- Create ONE sentence for EACH vocabulary word\n- Sentences should be realistic and practical (situations students might encounter)\n- Leave a blank (use \"_______\") where the vocabulary word should go\n- Make sentences progressively slightly more challenging\n- Ensure context makes the answer clear\n- Use B1-B2 level English for the sentences\n- DO NOT number the sentences (I'll add numbers automatically)\n\nFormat: Return ONLY the sentences, one per line, with _______ for the blank.\n\nExample:\nWhen I saw the final exam results, my _______ in complete shock.\nThe researcher proposed a new _______ to explain the strange phenomenon.",
"options": {
"systemMessage": "=You are an experienced ESL teacher creating vocabulary practice exercises for intermediate learners."
},
"promptType": "define"
},
"typeVersion": 2.2
},
{
"id": "3c16dca9-a353-4eaf-ac15-adf1035c3b10",
"name": "Email Hook",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-144,
-576
],
"parameters": {
"text": "=Create a compelling 3-paragraph hook message to convince a student to listen to this BBC 6 Minute English podcast episode.\n\nEpisode: \"{{ $json.episode_title }}\"\nDescription: \"{{ $json.description }}\"\nVocabulary focus: {{ $json.vocabulary_items.map(v => v.word).join(', ') }}\n\nRequirements:\n1. Start with an intriguing question, surprising fact, or \"did you know\" statement related to the topic\n2. Explain what the student will learn in 6 minutes (keep emphasizing the short time commitment)\n3. Highlight the vocabulary they'll master\n4. End with an energetic call-to-action\n5. Use 2-3 emojis strategically (at the start of paragraphs)\n6. Keep language clear and encouraging (B1-B2 level)\n7. Make it feel personal and conversational, not robotic\n\nFormat: Return 3 paragraphs separated by <br><br> tags (for HTML email compatibility).\nDO NOT use markdown formatting.\nDO NOT use * for bold - use <strong> tags instead.\n\nExample style:\n\"\ud83c\udf0d <strong>Did you know</strong> that [fascinating fact]? [Build curiosity]\n\n<br><br>In just <strong>6 minutes</strong>, you'll [what they'll learn]. You'll master expressions like \"[vocab example]\" and \"[vocab example]\" while [exploring the topic].\n\n<br><br>Ready to [motivating challenge]? This episode is perfect for your [coffee break/commute/lunch] and you'll walk away with [specific benefit]! \n",
"options": {
"systemMessage": "=You are an enthusiastic English learning coach who writes engaging, motivational content for intermediate English learners (B1-B2 level)."
},
"promptType": "define"
},
"typeVersion": 2.2
},
{
"id": "3aa5ad68-cc82-43a1-9e3e-ba0141d38eb4",
"name": "Send Email",
"type": "n8n-nodes-base.gmail",
"position": [
736,
-448
],
"parameters": {
"sendTo": "<SET_UP_EMAIL_ADDRESS>",
"message": "={{ $json.html }}",
"options": {
"attachmentsUi": {
"attachmentsBinary": [
{}
]
},
"appendAttribution": false
},
"subject": "={{ $('Combine Email + Attachment').item.json.subject }}"
},
"notesInFlow": true,
"typeVersion": 2.1
},
{
"id": "f99060da-9028-4621-93d5-74a02e82ed02",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
192,
-672
],
"parameters": {
"color": 7,
"width": 668,
"height": 492,
"content": "## 6. Build and send the HTML study email with vocabulary audio attached\n"
},
"typeVersion": 1
},
{
"id": "5282c375-8369-4337-9211-e3fb95b03e0c",
"name": "Trigger Sunday 20:00",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-1872,
-448
],
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtHour": 20
}
]
}
},
"typeVersion": 1.2
},
{
"id": "409f2a0a-77f8-4749-b228-7a98a708093d",
"name": "Podcasts from RSS Feed",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
-1568,
-528
],
"parameters": {
"url": "https://feeds.bbci.co.uk/learningenglish/english/features/6-minute-english/rss",
"options": {}
},
"typeVersion": 1.2
},
{
"id": "41498f6a-253f-49f3-b48e-f63c90cb7cd7",
"name": "Unique guid(s)",
"type": "n8n-nodes-base.aggregate",
"position": [
-1456,
-352
],
"parameters": {
"options": {},
"fieldsToAggregate": {
"fieldToAggregate": [
{
"renameField": true,
"outputFieldName": "guids",
"fieldToAggregate": "guid"
}
]
}
},
"typeVersion": 1
},
{
"id": "5d9ae5d4-bb6c-4161-be7e-be074899dc66",
"name": "Combine with archived guid(s)",
"type": "n8n-nodes-base.merge",
"position": [
-1232,
-448
],
"parameters": {
"mode": "combineBySql",
"options": {}
},
"notesInFlow": true,
"typeVersion": 3.2
},
{
"id": "67cf3c71-c7bb-4cac-a271-d260caad62a3",
"name": "Filter out duplicates",
"type": "n8n-nodes-base.filter",
"position": [
-1056,
-448
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "3e4aeed5-c2db-4a6d-a410-c1d5614e8e35",
"operator": {
"type": "boolean",
"operation": "false",
"singleValue": true
},
"leftValue": "={{ $json.guids.includes($json.guid) }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "38defa5a-2192-4902-8627-c8c2963b6f13",
"name": "Extract Podcast Information",
"type": "n8n-nodes-base.httpRequest",
"position": [
-672,
-448
],
"parameters": {
"url": "={{ $json.link }}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "808623bd-8a99-42ee-abda-cce24219d4da",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2560,
-672
],
"parameters": {
"width": 588,
"height": 1052,
"content": "## AI English Lesson Generator from Podcasts\n\n### How it works\n1. A trigger runs every Sunday at 20:00 and reads the BBC **6 Minute English** RSS feed \n2. Previously sent episodes are looked up in the Data Table and filtered out using their `guid` \n3. The workflow keeps the latest unsent episode and loads its web page content \n4. A Code node parses the HTML to extract the **description**, full **transcript** and BBC **vocabulary list** \n5. Three AI nodes generate: a hook message, fill-in-the-blank exercises and discussion questions based on the episode \n6. The vocabulary words are combined and sent to **ElevenLabs** to generate a slow-paced audio track \n7. All sections are merged into a single HTML email and sent via **Gmail**, with the vocabulary audio attached \n\n### How to set up\n- [ ] Create a **Data Table** with the fields: `guid`, `title`, `link`, `processed_date`\n- [ ] Connect the Data Table to **Archived Podcasts**, **Unique guid(s)** and **Combine with archived guid(s)** \n- [ ] Add your OpenAI credentials to the three **Model** nodes (hook, practice, discussion) \n- [ ] Add your ElevenLabs credentials in **Generate Audio Transcript** and pick a voice \n- [ ] Configure your Gmail credentials and destination address in **Send Email** \n\n### Customisation\n1. Change the schedule time or frequency in the **Trigger Sunday 20:00** node \n2. Edit the prompts in the AI nodes to change tone or difficulty level \n3. Customise the HTML email template and footer in **Prepare Email** with your own branding \n"
},
"typeVersion": 1
},
{
"id": "0da1001c-7f9d-486f-9031-640d73946494",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1888,
-144
],
"parameters": {
"width": 912,
"height": 512,
"content": "## [Check my Tutorial](https://www.youtube.com/watch?v=IKugAVZWgKM)\n@[youtube](IKugAVZWgKM)"
},
"typeVersion": 1
},
{
"id": "a24815ac-c166-4ab6-9fc4-f4a54b78c4cc",
"name": "Merge All Sections",
"type": "n8n-nodes-base.merge",
"position": [
224,
-464
],
"parameters": {
"numberInputs": 3
},
"notesInFlow": true,
"typeVersion": 3.2
},
{
"id": "8fd65fc0-3b47-49fa-87a9-3da8ed4c4887",
"name": "Model: Email Hook",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-240,
-464
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {
"maxTokens": 300,
"temperature": 0.7
}
},
"typeVersion": 1.2
},
{
"id": "ce0192e9-e823-47b1-823d-9e6fd0a4a6e6",
"name": "Model: Practice Exercises",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-240,
-224
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {
"maxTokens": 400,
"temperature": 0.8
}
},
"typeVersion": 1.2
},
{
"id": "a35107de-6616-435b-9cd7-0a7dbe4faba2",
"name": "Model: Discussion Questions",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-240,
-16
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {
"maxTokens": 400,
"temperature": 0.9
}
},
"typeVersion": 1.2
},
{
"id": "66193edb-73e7-4b74-8fc5-752e3cdc39df",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-320,
-672
],
"parameters": {
"color": 7,
"width": 476,
"height": 796,
"content": "## 4. Generate hook and exercises from the episode content"
},
"typeVersion": 1
},
{
"id": "04e9f287-47fd-43d9-bb2d-66ad1f403a19",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-864,
-672
],
"parameters": {
"color": 7,
"width": 476,
"height": 492,
"content": "## 3. Select latest unsent episode and fetch its page content"
},
"typeVersion": 1
},
{
"id": "14c7029b-9f35-4c4d-9391-f2b04a7eb708",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1296,
-672
],
"parameters": {
"color": 7,
"width": 380,
"height": 492,
"content": "## 2. Filter out podcasts that have already been sent\n"
},
"typeVersion": 1
},
{
"id": "2588028f-173d-4485-b282-c89bfab9778d",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1888,
-672
],
"parameters": {
"color": 7,
"width": 572,
"height": 492,
"content": "## 1. Weekly trigger to fetch RSS feed and load archived GUIDs\n"
},
"typeVersion": 1
},
{
"id": "11cc185a-8b94-480d-a3a4-ad46effd03f0",
"name": "Split Out Vocabulary",
"type": "n8n-nodes-base.splitOut",
"position": [
-288,
240
],
"parameters": {
"options": {},
"fieldToSplitOut": "vocabulary_items"
},
"typeVersion": 1
},
{
"id": "0760b50b-a72e-4cd3-97d6-faeff08363db",
"name": "Combine Words",
"type": "n8n-nodes-base.aggregate",
"position": [
-128,
240
],
"parameters": {
"options": {},
"fieldsToAggregate": {
"fieldToAggregate": [
{
"renameField": true,
"outputFieldName": "words",
"fieldToAggregate": "word"
}
]
}
},
"typeVersion": 1
},
{
"id": "adc5c199-ba25-416e-98a7-51b51c101298",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
-320,
144
],
"parameters": {
"color": 7,
"width": 476,
"height": 236,
"content": "## 5. Generate vocabulary audio with ElevenLabs"
},
"typeVersion": 1
},
{
"id": "b6af0e0a-dc3b-45a1-958e-05a0b1345d08",
"name": "Generate Audio Transcript",
"type": "@elevenlabs/n8n-nodes-elevenlabs.elevenLabs",
"position": [
48,
240
],
"parameters": {
"text": "={{ $json.words.join(', ') }}",
"voice": {
"__rl": true,
"mode": "list",
"value": "5Q0t7uMcjvnagumLfvZi",
"cachedResultName": "Paul"
},
"resource": "speech",
"requestOptions": {},
"additionalOptions": {
"voiceSettings": "{\n \"stability\": 1,\n \"similarity_boost\": 1,\n \"style\": 0,\n \"use_speaker_boost\": true,\n \"speed\": 0.8\n}"
}
},
"notesInFlow": true,
"typeVersion": 1
},
{
"id": "e7e9310c-3fc1-4830-af84-2212e93adcac",
"name": "Archived Podcasts",
"type": "n8n-nodes-base.dataTable",
"position": [
-1648,
-352
],
"parameters": {
"operation": "get",
"dataTableId": {
"__rl": true,
"mode": "list",
"value": "",
"cachedResultUrl": "",
"cachedResultName": ""
}
},
"typeVersion": 1
},
{
"id": "ccc7c946-0726-4e28-9945-5584290d1d27",
"name": "Combine Email + Attachment",
"type": "n8n-nodes-base.merge",
"position": [
576,
-448
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition"
},
"notesInFlow": true,
"typeVersion": 3.2
}
],
"connections": {
"Email Hook": {
"main": [
[
{
"node": "Merge All Sections",
"type": "main",
"index": 0
}
]
]
},
"Parse HTML": {
"main": [
[
{
"node": "Email Hook",
"type": "main",
"index": 0
},
{
"node": "Practice Exercises",
"type": "main",
"index": 0
},
{
"node": "Discussion Questions",
"type": "main",
"index": 0
},
{
"node": "Split Out Vocabulary",
"type": "main",
"index": 0
}
]
]
},
"Combine Words": {
"main": [
[
{
"node": "Generate Audio Transcript",
"type": "main",
"index": 0
}
]
]
},
"Prepare Email": {
"main": [
[
{
"node": "Combine Email + Attachment",
"type": "main",
"index": 0
}
]
]
},
"Latest Episode": {
"main": [
[
{
"node": "Extract Podcast Information",
"type": "main",
"index": 0
}
]
]
},
"Unique guid(s)": {
"main": [
[
{
"node": "Combine with archived guid(s)",
"type": "main",
"index": 1
}
]
]
},
"Archived Podcasts": {
"main": [
[
{
"node": "Unique guid(s)",
"type": "main",
"index": 0
}
]
]
},
"Model: Email Hook": {
"ai_languageModel": [
[
{
"node": "Email Hook",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Merge All Sections": {
"main": [
[
{
"node": "Prepare Email",
"type": "main",
"index": 0
}
]
]
},
"Practice Exercises": {
"main": [
[
{
"node": "Merge All Sections",
"type": "main",
"index": 1
}
]
]
},
"Discussion Questions": {
"main": [
[
{
"node": "Merge All Sections",
"type": "main",
"index": 2
}
]
]
},
"Split Out Vocabulary": {
"main": [
[
{
"node": "Combine Words",
"type": "main",
"index": 0
}
]
]
},
"Trigger Sunday 20:00": {
"main": [
[
{
"node": "Podcasts from RSS Feed",
"type": "main",
"index": 0
},
{
"node": "Archived Podcasts",
"type": "main",
"index": 0
}
]
]
},
"Filter out duplicates": {
"main": [
[
{
"node": "Latest Episode",
"type": "main",
"index": 0
}
]
]
},
"Podcasts from RSS Feed": {
"main": [
[
{
"node": "Combine with archived guid(s)",
"type": "main",
"index": 0
}
]
]
},
"Generate Audio Transcript": {
"main": [
[
{
"node": "Combine Email + Attachment",
"type": "main",
"index": 1
}
]
]
},
"Model: Practice Exercises": {
"ai_languageModel": [
[
{
"node": "Practice Exercises",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Combine Email + Attachment": {
"main": [
[
{
"node": "Send Email",
"type": "main",
"index": 0
}
]
]
},
"Extract Podcast Information": {
"main": [
[
{
"node": "Parse HTML",
"type": "main",
"index": 0
}
]
]
},
"Model: Discussion Questions": {
"ai_languageModel": [
[
{
"node": "Discussion Questions",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Combine with archived guid(s)": {
"main": [
[
{
"node": "Filter out duplicates",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Tags: ESL, English Learning, Podcasts, RSS, AI Exercises, ElevenLabs
Source: https://n8n.io/workflows/10968/ — 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.
Tags: EU News, RSS, AI Classifier, Data Table, Email Digest, Automation, n8n
V2 (2026) available! An intelligent, fully automated news aggregation system that collects articles from multiple sources (RSS feeds + Google Search), uses AI to classify and summarize the most import
This workflow automates end-to-end sustainability lifecycle management for corporate sustainability teams, ESG governance officers, and circular economy programme leads. It addresses the challenge of
This workflow automates the process of generating, reviewing, and publishing blog posts across multiple platforms, now enhanced with support for RSS Feeds as a content source. It streamlines the manag
This workflow automates end-to-end ESG (Environmental, Social, and Governance) sustainability reporting for enterprise sustainability teams, compliance officers, and green governance leads. It solves