📰 EU sustainability news curation with RSS, GPT, Gmail, ElevenLabs & Telegram
Pull contacts, verify each address with BillionVerify, and continue to ElevenLabs — only deliverable addresses get through.
Why verify before the send
Sending to invalid, risky, catch-all, or disposable addresses spikes your bounce rate and erodes sender reputation. A verification gate before the ElevenLabs step removes that risk automatically — only deliverable addresses continue, the rest are flagged.
The workflow
BillionVerify — verification sits right before the send.
Node by node
- 1Loop Over NewsSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 2Trigger: 09:00 amTrigger· n8n
Starts the workflow — on a schedule, a webhook, or manually while you test.
- 3Topic ConfigSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 4OpenAI Chat ModelSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 5Today's NewsSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 6RSS News EUSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 7Archived NewsSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 8Classify News based on a TopicSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 9Generate a Digest in HTMLSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 10Aggregate TitlesSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 11Add Archived Guid(s)Source· n8n
Provides or transforms the contact data flowing through the workflow.
- 12List of guid(s) archivedSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 13IfLogic· n8n
Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.
- 14Verify Email (BillionVerify)Verify· billionverify
The BillionVerify node verifies the address — status (valid / invalid / risky / catch-all / role / disposable), is_deliverable, and a confidence score — before anything is sent.
- 15Create Daily Voice SummarySource· n8n
Provides or transforms the contact data flowing through the workflow.
- 16Avoid DuplicatesLogic· n8n
Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.
- 17Add NewsSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 18IF deliverableLogic· n8n
Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.
- 19Generate Voice MessageSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 20Send the digestSend· n8n
Sends only to verified, deliverable addresses. Swap in your own provider node if you send elsewhere.
- 21Send Voice SummarySource· n8n
Provides or transforms the contact data flowing through the workflow.
Workflow JSON
Copy or download this workflow, then import it in n8n (Workflows → Import from File / Paste). Install the BillionVerify community node first, then add your API key credential.
{
"name": "📰 EU sustainability news curation with RSS, GPT, Gmail, ElevenLabs & Telegram + BillionVerify",
"nodes": [
{
"id": "5d229b75-1fe4-4bf5-99be-123b26bf9949",
"name": "Loop Over News",
"type": "n8n-nodes-base.splitInBatches",
"position": [
112,
-336
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "a023f0eb-a572-484d-9806-f4a8fe2ac93b",
"name": "Trigger: 09:00 am",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-800,
-304
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 9
}
]
}
},
"typeVersion": 1.2
},
{
"id": "b9898c31-7ab2-48c7-a730-af24b9351e80",
"name": "RSS News EU",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
-608,
-304
],
"parameters": {
"url": "https://www.consilium.europa.eu/en/rss/pressreleases.ashx",
"options": {}
},
"typeVersion": 1.2
},
{
"id": "4de2666f-d613-4248-b37b-8592fe62a172",
"name": "If",
"type": "n8n-nodes-base.if",
"position": [
752,
-320
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "0b998795-1a1f-4f17-8651-57b6fedc7be1",
"operator": {
"type": "boolean",
"operation": "equals"
},
"leftValue": "={{ $json.message.content.parseJson().is_relevant }}",
"rightValue": true
}
]
}
},
"typeVersion": 2.2
},
{
"id": "54f09ffb-d95c-4df8-bd30-318e9d0836d4",
"name": "Send the digest",
"type": "n8n-nodes-base.gmail",
"position": [
-272,
48
],
"webhookId": "483a7e40-e4fb-4490-bda5-44937ebc6ce5",
"parameters": {
"sendTo": "<SET_RECIPIENT_EMAIL>",
"message": "={{ $json.html }}",
"options": {
"appendAttribution": false
},
"subject": "={{ $json.subject }}"
},
"notesInFlow": true,
"typeVersion": 2.1
},
{
"id": "b453a6c4-7291-417e-985d-1d046419346b",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-832,
-544
],
"parameters": {
"color": 7,
"width": 860,
"height": 444,
"content": "## 1. Fetch the latest EU news from RSS\n"
},
"typeVersion": 1
},
{
"id": "4fe6b4b6-389a-4bce-a75f-4f091e5b0dea",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
64,
-544
],
"parameters": {
"color": 7,
"width": 1036,
"height": 444,
"content": "## 2. Select the relevant news using an AI Classifier\n"
},
"typeVersion": 1
},
{
"id": "ca887dd6-be25-4d13-a986-020823bbf583",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-832,
-80
],
"parameters": {
"color": 7,
"width": 864,
"height": 244,
"content": "## 3. Build the daily digest and send it by email"
},
"typeVersion": 1
},
{
"id": "b7b964e5-148b-447a-a003-13d26f991b48",
"name": "Archived News",
"type": "n8n-nodes-base.dataTable",
"position": [
-608,
-448
],
"parameters": {
"matchType": "allConditions",
"operation": "get",
"dataTableId": {
"__rl": true,
"mode": "",
"value": "",
"cachedResultUrl": "",
"cachedResultName": ""
}
},
"typeVersion": 1
},
{
"id": "b8296e41-8ff6-4367-8441-bb8fe6631f1a",
"name": "Add Archived Guid(s)",
"type": "n8n-nodes-base.merge",
"position": [
-272,
-320
],
"parameters": {
"mode": "combineBySql",
"options": {}
},
"notesInFlow": true,
"typeVersion": 3.2
},
{
"id": "2f9f60b8-d9c5-4479-9272-62937178110d",
"name": "List of guid(s) archived",
"type": "n8n-nodes-base.aggregate",
"position": [
-432,
-448
],
"parameters": {
"options": {},
"fieldsToAggregate": {
"fieldToAggregate": [
{
"renameField": true,
"outputFieldName": "guids",
"fieldToAggregate": "guid"
}
]
}
},
"typeVersion": 1
},
{
"id": "48441fbd-8c6a-4cec-a590-1c4f78da1bda",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1520,
-544
],
"parameters": {
"width": 636,
"height": 620,
"content": "## AI-Powered EU News Digest by Topic\n\n### How it works\n1. Daily triggers to fetch latest news using RSS feed of the **Council of the European Union**\n2. Archived news are filtered out to avoid duplicates\n3. Filter the news based on a **topic** and **topic description** using an AI classifier\n4. Records the news including `title`, `link` and content information in a datable\n5. Loads all the recorded news of today to send them in a HTML formatted email\n6. A 30-second daily voice summary generate with **Eleven Labs** is sent via Telegram\n\n### How to setup\n- [ ] Create a **datatable** (columns = title, link, content, contentSnippet, guid, categories, createDate) with type = `string`\n- [ ] Connect **Archives News**, **Add News** and **Today's News** to this table\n- [ ] Setup the topic description in **Topic Config**\n- [ ] Add you OpenAI credentials in the node **Classify News based on a Topic**\n- [ ] Set up your Gmail credential in the **Send Digest** node with the destination email\n- [ ] Set up your Eleven Labs in the node **Generate Voice Message** - \n- [ ] Set up your Telegram credentials and the Chat ID to send the audio summary \n\n### Customisation\n1. Change the **topics** and **topic descriptions** to fit with your needs in the **Topic Config** node\n2. Adapt the footer of the digest in the code with your own company identity in the code node\n3. Change the subject of the email in the **Gmail node**"
},
"typeVersion": 1
},
{
"id": "92f4c68d-f73b-4ba6-88bb-91a91b5e5956",
"name": "Today's News",
"type": "n8n-nodes-base.dataTable",
"position": [
-800,
48
],
"parameters": {
"filters": {
"conditions": [
{
"keyName": "createDate",
"keyValue": "={{ $now.minus(5,'days').toFormat('yyyy-MM-dd') }}"
}
]
},
"matchType": "allConditions",
"operation": "get",
"dataTableId": {
"__rl": true,
"mode": "list",
"value": "",
"cachedResultUrl": "",
"cachedResultName": ""
}
},
"typeVersion": 1
},
{
"id": "239890a0-8634-4ab8-8cf5-35e22731b113",
"name": "Add News",
"type": "n8n-nodes-base.dataTable",
"position": [
944,
-336
],
"parameters": {
"columns": {
"value": {
"guid": "={{ $('Loop Over Items1').item.json.guid }}",
"link": "={{ $('Loop Over Items1').item.json.link }}",
"title": "={{ $('Loop Over Items1').item.json.title }}",
"content": "={{ $('Loop Over Items1').item.json.content }}",
"categories": "={{ $('Loop Over Items1').item.json.categories.join(', ') }}",
"createDate": "={{ $now.toFormat('yyyy-MM-dd') }}",
"contentSnippet": "={{ $('Loop Over Items1').item.json.contentSnippet }}"
},
"schema": [
{
"id": "title",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "title",
"defaultMatch": false
},
{
"id": "link",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "link",
"defaultMatch": false
},
{
"id": "content",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "content",
"defaultMatch": false
},
{
"id": "contentSnippet",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "contentSnippet",
"defaultMatch": false
},
{
"id": "guid",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "guid",
"defaultMatch": false
},
{
"id": "categories",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "categories",
"defaultMatch": false
},
{
"id": "createDate",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "createDate",
"defaultMatch": false
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"dataTableId": {
"__rl": true,
"mode": "",
"value": "",
"cachedResultUrl": "",
"cachedResultName": ""
}
},
"typeVersion": 1
},
{
"id": "63c17be1-ffbc-43f3-80e5-769a14449cd2",
"name": "Classify News based on a Topic",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
464,
-320
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini",
"cachedResultName": "GPT-4O-MINI"
},
"options": {
"temperature": 0.3
},
"messages": {
"values": [
{
"content": "=You are an AI classifier for EU news. Your task is to determine if a news item is related to a specific topic.\n\nTopic Name: {{ $json.topic_name }}\nTopic Description: {{ $json.topic_description }}\n\nNews Item to Classify:\nTitle: {{ $('Loop Over Items1').item.json.title }}\nContent: {{ $('Loop Over Items1').item.json.content }}\nCategories: {{ $('Loop Over Items1').item.json.categories.join(', ') }}\n\nAnalyze this news item and respond with a JSON object:\n{\n \"is_relevant\": true/false,\n \"relevance_score\": 0-100,\n \"key_topics_found\": [\"list\", \"of\", \"relevant\", \"aspects\"],\n \"reasoning\": \"Brief explanation of why this is or isn't relevant\"\n}\n\nOnly respond with the JSON object, no additional text."
}
]
}
},
"typeVersion": 1.4
},
{
"id": "a7861a39-fac3-452a-a3de-d15b9820bbe2",
"name": "Topic Config",
"type": "n8n-nodes-base.set",
"position": [
320,
-320
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "4fc644c2-7f3e-4cd3-87d7-27eb35a6d0d3",
"name": "topic_name",
"type": "string",
"value": "SUSTAINABILITY"
},
{
"id": "bf8fface-1272-4254-b64e-fbffb348852b",
"name": "topic_description",
"type": "string",
"value": "News related to climate change, carbon neutrality, Green Deal initiatives, renewable energy, energy efficiency, circular economy, biodiversity protection, sustainable finance, ESG regulations, environmental standards, emission reduction targets, clean technology, sustainable transport, green bonds, nature restoration, water management, waste reduction, sustainable agriculture, forest protection, ocean conservation, green transition funding, climate adaptation, net-zero policies, sustainable development goals (SDGs), environmental compliance, and eco-innovation in the European Union."
}
]
}
},
"notesInFlow": true,
"typeVersion": 3.4
},
{
"id": "e025cfca-6753-455e-8a4d-08e3872e92d7",
"name": "Avoid Duplicates",
"type": "n8n-nodes-base.if",
"position": [
-96,
-320
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "f700606b-061a-47fd-840f-0d059b896d8d",
"operator": {
"type": "boolean",
"operation": "false",
"singleValue": true
},
"leftValue": "={{ $json.guids.includes($json.guid) }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "af38b182-8398-46cc-8f1b-f0b5243a5357",
"name": "Generate a Digest in HTML",
"type": "n8n-nodes-base.code",
"position": [
-512,
48
],
"parameters": {
"jsCode": "// Get all news items from the input\nconst newsItems = $input.all().map(item => item.json);\n\n// Generate the HTML email\nconst htmlEmail = `\n<!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>EU Sustainability News Digest</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif;\n line-height: 1.6;\n color: #333;\n max-width: 700px;\n margin: 0 auto;\n padding: 0;\n background-color: #f5f5f5;\n }\n .container {\n background-color: #ffffff;\n margin: 20px auto;\n border-radius: 12px;\n overflow: hidden;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n }\n .header {\n background: linear-gradient(135deg, #2e7d32 0%, #66bb6a 100%);\n color: white;\n padding: 30px 40px;\n text-align: center;\n }\n .header h1 {\n margin: 0;\n font-size: 28px;\n font-weight: 600;\n letter-spacing: -0.5px;\n }\n .header p {\n margin: 10px 0 0 0;\n font-size: 16px;\n opacity: 0.95;\n }\n .date-badge {\n display: inline-block;\n background-color: rgba(255, 255, 255, 0.2);\n padding: 5px 15px;\n border-radius: 20px;\n margin-top: 10px;\n font-size: 14px;\n }\n .content {\n padding: 30px 40px;\n }\n .news-item {\n margin-bottom: 30px;\n padding-bottom: 30px;\n border-bottom: 1px solid #e0e0e0;\n }\n .news-item:last-of-type {\n border-bottom: none;\n margin-bottom: 0;\n padding-bottom: 0;\n }\n .news-number {\n display: inline-block;\n background-color: #2e7d32;\n color: white;\n width: 28px;\n height: 28px;\n border-radius: 50%;\n text-align: center;\n line-height: 28px;\n font-size: 14px;\n font-weight: 600;\n margin-right: 10px;\n flex-shrink: 0;\n }\n .news-title {\n font-size: 18px;\n font-weight: 600;\n color: #1a1a1a;\n margin: 0 0 10px 0;\n line-height: 1.4;\n display: flex;\n align-items: flex-start;\n }\n .news-title a {\n color: #1a1a1a;\n text-decoration: none;\n flex-grow: 1;\n }\n .news-title a:hover {\n color: #2e7d32;\n }\n .news-meta {\n display: flex;\n gap: 15px;\n margin-bottom: 12px;\n flex-wrap: wrap;\n }\n .category-tag {\n background-color: #e8f5e9;\n color: #2e7d32;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n }\n .date-tag {\n color: #666;\n font-size: 12px;\n padding: 4px 0;\n }\n .news-content {\n color: #555;\n font-size: 15px;\n line-height: 1.6;\n margin: 12px 0 0 38px;\n }\n .read-more {\n display: inline-block;\n margin: 10px 0 0 38px;\n color: #2e7d32;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n }\n .read-more:hover {\n text-decoration: underline;\n }\n .footer {\n background-color: #f8f9fa;\n padding: 25px 40px;\n text-align: center;\n border-top: 1px solid #e0e0e0;\n }\n .footer-logo {\n font-size: 20px;\n font-weight: 600;\n color: #2e7d32;\n margin-bottom: 10px;\n }\n .footer-links {\n margin-top: 15px;\n }\n .footer-links a {\n color: #2e7d32;\n text-decoration: none;\n margin: 0 10px;\n font-size: 14px;\n }\n .footer-links a:hover {\n text-decoration: underline;\n }\n .footer-divider {\n margin: 0 5px;\n color: #999;\n }\n .footer-note {\n margin-top: 15px;\n font-size: 12px;\n color: #666;\n }\n @media (max-width: 600px) {\n .header {\n padding: 25px 20px;\n }\n .header h1 {\n font-size: 24px;\n }\n .content {\n padding: 20px;\n }\n .footer {\n padding: 20px;\n }\n .news-meta {\n gap: 8px;\n }\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"header\">\n <h1>🌱 EU Sustainability News Digest</h1>\n <p>Your curated selection of EU environmental and climate updates</p>\n <span class=\"date-badge\">${new Date().toLocaleDateString('en-GB', { \n weekday: 'long', \n year: 'numeric', \n month: 'long', \n day: 'numeric' \n })}</span>\n </div>\n \n <div class=\"content\">\n ${newsItems.map((item, index) => `\n <div class=\"news-item\">\n <h2 class=\"news-title\">\n <span class=\"news-number\">${index + 1}</span>\n <a href=\"${item.link}\" target=\"_blank\">${item.title}</a>\n </h2>\n <div class=\"news-meta\">\n ${item.categories.split(',').map(cat => \n `<span class=\"category-tag\">${cat.trim()}</span>`\n ).join('')}\n <span class=\"date-tag\">📅 ${new Date(item.createDate).toLocaleDateString('en-GB', { \n day: 'numeric',\n month: 'short',\n year: 'numeric'\n })}</span>\n </div>\n <p class=\"news-content\">${item.contentSnippet}</p>\n <a href=\"${item.link}\" target=\"_blank\" class=\"read-more\">Read full article →</a>\n </div>\n `).join('')}\n </div>\n \n <div class=\"footer\">\n <div class=\"footer-logo\">🤖 LogiGreen Bot</div>\n <div style=\"color: #666; font-size: 14px; margin-bottom: 10px;\">\n Automated EU Sustainability News Monitoring\n </div>\n <div class=\"footer-links\">\n <a href=\"https://logi-green.com\" target=\"_blank\">🌐 Website</a>\n <span class=\"footer-divider\">|</span>\n <a href=\"https://linktr.ee/samirsaci\" target=\"_blank\">🔗 Contact & Links</a>\n </div>\n <div class=\"footer-note\">\n Powered by LogiGreen Consulting - AI-driven sustainability insights for better business decisions\n </div>\n </div>\n </div>\n</body>\n</html>\n`;\n\n// Return the HTML email and metadata\nreturn {\n html: htmlEmail,\n subject: `EU Sustainability Digest - ${new Date().toLocaleDateString('en-GB', { day: 'numeric', month: 'short', year: 'numeric' })}`,\n newsCount: newsItems.length,\n generatedAt: new Date().toISOString()\n};"
},
"typeVersion": 2
},
{
"id": "87ca7616-168b-4f7e-bd3b-4cc9580f3198",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
304,
336
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"typeVersion": 1.2
},
{
"id": "a6a23f06-1a59-4d39-bd35-71d3899f1f65",
"name": "Create Daily Voice Summary",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
352,
176
],
"parameters": {
"text": "={{ $json.titles.toJsonString() }}",
"options": {
"systemMessage": "You are a news anchor summarizing EU sustainability news for a 30-second Telegram voice note.\n\nThe user will send you a JSON array called `titles` that contains the headlines of today’s EU news already filtered for sustainability and climate topics.\n\nYour task:\n- Group the headlines into 2–4 main themes.\n- Create a natural, spoken-style summary that connects these themes.\n- Mention “the European Union” or “the EU” at least once.\n- Use clear B1–B2 level English suitable for an international audience.\n- Length: 55–80 words (about 30 seconds of audio).\n- Do NOT read the titles one by one; synthesize them into a coherent story.\n- No bullet points, no headings, no emojis, no markdown.\n- Output ONE single paragraph of plain text only, ready to be sent to a text-to-speech API."
},
"promptType": "define"
},
"typeVersion": 2.2
},
{
"id": "143a112b-3b6d-4e38-8d54-c563ec5e622f",
"name": "Send Voice Summary",
"type": "n8n-nodes-base.telegram",
"position": [
896,
176
],
"webhookId": "5e6560dd-22c3-407b-948a-df5f15c08603",
"parameters": {
"chatId": "123456789",
"operation": "sendAudio",
"binaryData": true,
"additionalFields": {
"caption": "=EU Sustainability News Digest - {{ $now.toFormat('yyyy-MM-dd') }}"
}
},
"notesInFlow": true,
"typeVersion": 1.2
},
{
"id": "5f432783-94ed-47c4-b28e-4b3c695887c9",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
64,
80
],
"parameters": {
"color": 7,
"width": 1056,
"height": 388,
"content": "## 4. Send a 30-second voice message summarizing the news using titles"
},
"typeVersion": 1
},
{
"id": "b59a890e-9a79-4a8b-8e6e-9b31716aaf75",
"name": "Generate Voice Message",
"type": "@elevenlabs/n8n-nodes-elevenlabs.elevenLabs",
"position": [
688,
176
],
"parameters": {
"text": "={{ $json.output }}",
"voice": {
"__rl": true,
"mode": "list",
"value": "5Q0t7uMcjvnagumLfvZi",
"cachedResultName": "Paul"
},
"resource": "speech",
"requestOptions": {},
"additionalOptions": {}
},
"notesInFlow": true,
"typeVersion": 1
},
{
"id": "bfd9b83b-0350-41b7-a02e-fe11de91bb6d",
"name": "Aggregate Titles",
"type": "n8n-nodes-base.aggregate",
"position": [
128,
176
],
"parameters": {
"options": {},
"fieldsToAggregate": {
"fieldToAggregate": [
{
"renameField": true,
"outputFieldName": "titles",
"fieldToAggregate": "title"
}
]
}
},
"typeVersion": 1
},
{
"id": "b4c633f6-c0e3-4104-b0ea-d9d400e3bb3b",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1520,
112
],
"parameters": {
"width": 656,
"height": 368,
"content": "@[youtube](vNavNGRqcK4)"
},
"typeVersion": 1
},
{
"parameters": {
"operation": "verify",
"email": "={{ $json.email || $json.Email }}",
"additionalOptions": {}
},
"type": "n8n-nodes-billionverify.billionVerify",
"typeVersion": 1,
"position": [
-632,
48
],
"name": "Verify Email (BillionVerify)",
"credentials": {
"billionVerifyApi": {
"id": "",
"name": "BillionVerify account"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "is-deliverable",
"leftValue": "={{ $json.is_deliverable }}",
"rightValue": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
]
}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
-452,
48
],
"name": "IF deliverable"
}
],
"connections": {
"If": {
"main": [
[
{
"node": "Add News",
"type": "main",
"index": 0
}
]
]
},
"RSS News EU": {
"main": [
[
{
"node": "Add Archived Guid(s)",
"type": "main",
"index": 1
}
]
]
},
"Today's News": {
"main": [
[
{
"node": "Generate a Digest in HTML",
"type": "main",
"index": 0
},
{
"node": "Aggregate Titles",
"type": "main",
"index": 0
}
]
]
},
"Topic Config": {
"main": [
[
{
"node": "Classify News based on a Topic",
"type": "main",
"index": 0
}
]
]
},
"Archived News": {
"main": [
[
{
"node": "List of guid(s) archived",
"type": "main",
"index": 0
}
]
]
},
"Aggregate Titles": {
"main": [
[
{
"node": "Create Daily Voice Summary",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "Create Daily Voice Summary",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Trigger: 09:00 am": {
"main": [
[
{
"node": "Today's News",
"type": "main",
"index": 0
},
{
"node": "RSS News EU",
"type": "main",
"index": 0
},
{
"node": "Archived News",
"type": "main",
"index": 0
}
]
]
},
"Add Archived Guid(s)": {
"main": [
[
{
"node": "Avoid Duplicates",
"type": "main",
"index": 0
},
{
"node": "Generate a Digest in HTML",
"type": "main",
"index": 0
}
]
]
},
"Generate Voice Message": {
"main": [
[
{
"node": "Send Voice Summary",
"type": "main",
"index": 0
}
]
]
},
"List of guid(s) archived": {
"main": [
[
{
"node": "Add Archived Guid(s)",
"type": "main",
"index": 0
}
]
]
},
"Generate a Digest in HTML": {
"main": [
[
{
"node": "Verify Email (BillionVerify)",
"type": "main",
"index": 0
}
]
]
},
"Create Daily Voice Summary": {
"main": [
[
{
"node": "Generate Voice Message",
"type": "main",
"index": 0
}
]
]
},
"Classify News based on a Topic": {
"main": [
[
{
"node": "If",
"type": "main",
"index": 0
}
]
]
},
"Verify Email (BillionVerify)": {
"main": [
[
{
"node": "IF deliverable",
"type": "main",
"index": 0
}
]
]
},
"IF deliverable": {
"main": [
[
{
"node": "Send the digest",
"type": "main",
"index": 0
}
],
[]
]
}
},
"settings": {}
}When to use this
- Cleaning a list before a ElevenLabs send or sync.
- Protecting ElevenLabs deliverability and sender reputation.
- Keeping bounce rates low so your sending is never throttled.
FAQ
Why verify before sending in ElevenLabs?
Verifying first keeps your bounce rate low, which protects your sender reputation and your results.
How do I import this workflow?
Download the JSON, then in n8n go to Workflows → Import from File (or paste it). Install the BillionVerify community node and add your API key credential.
What happens to risky or catch-all addresses?
They are routed to the false branch and excluded from the send. You decide whether to retry, review, or drop them.
Add verification to your workflow
Create a free account, grab your API key, and stop bounces before they happen.
Get started free