Generate daily tech, manga & movies newsletter from RSS feeds with Brevo
Pull contacts, verify each address with BillionVerify, and continue to Brevo — 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 Brevo 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
- 1Schedule TriggerTrigger· n8n
Starts the workflow — on a schedule, a webhook, or manually while you test.
- 2Category RssSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 3Split Out2Source· n8n
Provides or transforms the contact data flowing through the workflow.
- 4Rss databaseSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 5SwitchLogic· n8n
Routes items based on the workflow logic.
- 6Loop Over Items3Source· n8n
Provides or transforms the contact data flowing through the workflow.
- 7Loop Over Items4Source· n8n
Provides or transforms the contact data flowing through the workflow.
- 8Loop Over Items5Source· n8n
Provides or transforms the contact data flowing through the workflow.
- 9Code in Python (Beta)Source· n8n
Provides or transforms the contact data flowing through the workflow.
- 10RSS Read1Source· n8n
Provides or transforms the contact data flowing through the workflow.
- 11Code in Python (Beta)1Source· n8n
Provides or transforms the contact data flowing through the workflow.
- 12RSS Read2Source· n8n
Provides or transforms the contact data flowing through the workflow.
- 13Code in Python (Beta)2Source· n8n
Provides or transforms the contact data flowing through the workflow.
- 14RSS Read3Source· n8n
Provides or transforms the contact data flowing through the workflow.
- 15MangaSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 16MovieSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 17Jeu videoSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 18MergeSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 19AggregateSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 20HTML TemplateSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 21Mail CampaignSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 22Verify 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.
- 23IF deliverableLogic· n8n
Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.
- 24Send a MailSend· n8n
Sends only to verified, deliverable addresses. Swap in your own provider node if you send elsewhere.
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": "Generate daily tech, manga & movies newsletter from RSS feeds with Brevo + BillionVerify",
"nodes": [
{
"id": "42ba72ef-afc0-4789-9a74-4d1a1ac0e424",
"name": "Sticky Note - Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1696,
896
],
"parameters": {
"width": 696,
"height": 612,
"content": "# 📬 Personal Daily Tech/Manga/Movies Newsletter\n\n**What it does:**\nAutomatically curates and emails a personalized daily newsletter with the latest tech news, manga, movies tailored to your interests.\n\n**How it works:**\n\n1. Triggers daily at 12 PM\n2. Fetches RSS feeds from your favorite tech, manga, movies sources\n3. Make HTML template for mail based on your interests\n4. Sends a beautifully formatted newsletter to your inbox\n\n**Set up steps**\n\n1. Update the RSS feed URLs inside the Set nodes to match your preferred sources.\n2. Replace the email address in the Send Email node with your own.\n3. Modify the execution time in the Cron Trigger node if you want the newsletter to be sent at a different time.\n4. Enable the workflow to start receiving your personalized daily newsletter automatically.\n\n**Customize:**\n- Change RSS sources in the \"Set\" nodes\n- Update your email address in \"Send email\" node\n- Adjust schedule time in trigger node"
},
"typeVersion": 1
},
{
"id": "a01df542-f863-4eee-adbe-6cbb148f539c",
"name": "Split Out2",
"type": "n8n-nodes-base.splitOut",
"position": [
-336,
1792
],
"parameters": {
"options": {},
"fieldToSplitOut": "cat"
},
"typeVersion": 1
},
{
"id": "f5771190-5f35-45ef-934d-9759d8bbf38a",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-784,
1792
],
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 5,
"triggerAtMinute": 30
}
]
}
},
"typeVersion": 1.2
},
{
"id": "7cd18a12-6656-4a38-99cc-4e7ccd4cb6c3",
"name": "RSS Read1",
"type": "n8n-nodes-base.rssFeedRead",
"onError": "continueErrorOutput",
"position": [
752,
1568
],
"parameters": {
"url": "={{ $json[\"Lien RSS\"] }}",
"options": {}
},
"typeVersion": 1.2,
"alwaysOutputData": true
},
{
"id": "40b5b6b5-c1e4-411d-a29d-e976ec9b86f9",
"name": "Loop Over Items3",
"type": "n8n-nodes-base.splitInBatches",
"position": [
464,
1552
],
"parameters": {
"options": {},
"batchSize": 2
},
"typeVersion": 3
},
{
"id": "509f8c1d-5f27-44df-b43c-4a09d4623a72",
"name": "Rss database",
"type": "n8n-nodes-base.googleSheets",
"position": [
-96,
1792
],
"parameters": {
"options": {},
"filtersUI": {
"values": [
{
"lookupValue": "={{ $json.cat }}",
"lookupColumn": "Catégorie"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1anl-6-nbOfrsXJc7fhAAZ0yIONrqkg7qB7MXrqK37pw/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1anl-6-nbOfrsXJc7fhAAZ0yIONrqkg7qB7MXrqK37pw",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1anl-6-nbOfrsXJc7fhAAZ0yIONrqkg7qB7MXrqK37pw/edit?usp=drivesdk",
"cachedResultName": "Rss Database 2"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "credential-id",
"name": "googleSheetsOAuth2Api Credential"
}
},
"typeVersion": 4.7
},
{
"id": "e792e4b5-3b49-478e-822c-f959a8fda9f1",
"name": "Switch",
"type": "n8n-nodes-base.switch",
"position": [
96,
1776
],
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "73f7daf4-8a2d-4ce1-9099-1595e0eb3c23",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json[\"Catégorie\"] }}",
"rightValue": "=Manga"
}
]
}
},
{
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "4d7598e1-9e5e-413e-ae6d-1c17c61254a7",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json[\"Catégorie\"] }}",
"rightValue": "Cinéma"
}
]
}
},
{
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "b559253b-235e-4994-8814-69031f9510e3",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json[\"Catégorie\"] }}",
"rightValue": "Jeux Vidéo"
}
]
}
}
]
},
"options": {}
},
"typeVersion": 3.3
},
{
"id": "07e8483f-a58f-44ba-8ead-25a85fa74370",
"name": "Code in Python (Beta)",
"type": "n8n-nodes-base.code",
"position": [
992,
1536
],
"parameters": {
"language": "python",
"pythonCode": "# Loop over input items and add a new field called 'myNewField' to the JSON of each one\nfor item in _input.all():\n #item.json.myNewField = 1\n pass\nreturn _input.all()[:3]"
},
"typeVersion": 2
},
{
"id": "20848a57-917f-40e4-9d1e-a7bcfb92f966",
"name": "RSS Read2",
"type": "n8n-nodes-base.rssFeedRead",
"onError": "continueErrorOutput",
"position": [
736,
1808
],
"parameters": {
"url": "={{ $json[\"Lien RSS\"] }}",
"options": {}
},
"typeVersion": 1.2,
"alwaysOutputData": true
},
{
"id": "8d5ab523-ffb2-4355-89c6-db103f2ba799",
"name": "Loop Over Items4",
"type": "n8n-nodes-base.splitInBatches",
"position": [
448,
1792
],
"parameters": {
"options": {},
"batchSize": 2
},
"typeVersion": 3
},
{
"id": "194568dc-aaef-4099-bb1f-b2934f89e600",
"name": "Code in Python (Beta)1",
"type": "n8n-nodes-base.code",
"position": [
992,
1776
],
"parameters": {
"language": "python",
"pythonCode": "# Loop over input items and add a new field called 'myNewField' to the JSON of each one\nfor item in _input.all():\n #item.json.myNewField = 1\n pass\nreturn _input.all()[:3]"
},
"typeVersion": 2
},
{
"id": "9dc31c66-06de-4b15-b4b6-d6ed15cab225",
"name": "RSS Read3",
"type": "n8n-nodes-base.rssFeedRead",
"onError": "continueErrorOutput",
"position": [
784,
2080
],
"parameters": {
"url": "={{ $json[\"Lien RSS\"] }}",
"options": {}
},
"typeVersion": 1.2,
"alwaysOutputData": true
},
{
"id": "c48c1fc6-7296-4fcf-bf0a-e04feac8f6a9",
"name": "Loop Over Items5",
"type": "n8n-nodes-base.splitInBatches",
"position": [
448,
2064
],
"parameters": {
"options": {},
"batchSize": 2
},
"typeVersion": 3
},
{
"id": "f238d60e-a702-4f81-a8e4-30a7e7bea01d",
"name": "Code in Python (Beta)2",
"type": "n8n-nodes-base.code",
"position": [
992,
2048
],
"parameters": {
"language": "python",
"pythonCode": "# Loop over input items and add a new field called 'myNewField' to the JSON of each one\nfor item in _input.all():\n #item.json.myNewField = 1\n pass\nreturn _input.all()[:3]"
},
"typeVersion": 2
},
{
"id": "6315fdbc-9ede-4ab0-adb5-bc0a6152f768",
"name": "Aggregate",
"type": "n8n-nodes-base.aggregate",
"position": [
2224,
1760
],
"parameters": {
"options": {},
"aggregate": "aggregateAllItemData",
"destinationFieldName": "HTML"
},
"typeVersion": 1
},
{
"id": "2e3f8bf2-4ccf-4eab-bfa2-0d77174acafc",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
1920,
1744
],
"parameters": {
"numberInputs": 3
},
"typeVersion": 3.2
},
{
"id": "77c4f730-c84e-4121-a63f-31c8efd22667",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-880,
1712
],
"parameters": {
"color": 3,
"width": 256,
"height": 240,
"content": "## Daily trigger\n"
},
"typeVersion": 1
},
{
"id": "593f18ec-5bf8-495d-9646-b35e1d9fd6d5",
"name": "Sticky Note - Processing1",
"type": "n8n-nodes-base.stickyNote",
"disabled": true,
"position": [
352,
1472
],
"parameters": {
"color": 6,
"width": 820,
"height": 812,
"content": "## 🔄 RSS Feed Processing\nSplit, loop through feeds in batches, and fetch content"
},
"typeVersion": 1
},
{
"id": "7d6dfe67-658c-4a8c-a7a6-4417a874df40",
"name": "Sticky Note - Sources1",
"type": "n8n-nodes-base.stickyNote",
"disabled": true,
"position": [
-592,
1680
],
"parameters": {
"color": 4,
"width": 824,
"height": 280,
"content": "## 📰 RSS Feed Sources\nDefine which RSS feeds to monitor for tech news and tools"
},
"typeVersion": 1
},
{
"id": "eaf42c4f-b5d1-40bc-9505-c3d9b7f90b8b",
"name": "Sticky Note - Combine1",
"type": "n8n-nodes-base.stickyNote",
"disabled": true,
"position": [
1264,
1472
],
"parameters": {
"color": 2,
"width": 356,
"height": 744,
"content": "## Set HTML part \n#Add information in HTML code part"
},
"typeVersion": 1
},
{
"id": "6b2c7f0a-111f-4b85-9de0-3d044d6c63cc",
"name": "Sticky Note - Combine2",
"type": "n8n-nodes-base.stickyNote",
"disabled": true,
"position": [
1808,
1632
],
"parameters": {
"color": 5,
"width": 644,
"height": 312,
"content": "## 📦 Combine & Convert\nMerge all feeds and convert to CSV for AI"
},
"typeVersion": 1
},
{
"id": "ac0a0d8a-021f-463d-a522-939675299898",
"name": "Sticky Note - Email1",
"type": "n8n-nodes-base.stickyNote",
"disabled": true,
"position": [
2560,
1616
],
"parameters": {
"color": 7,
"width": 696,
"height": 472,
"content": "## 📧 Set HTML FileNewsletter Delivery\n\nFormat and send the personalized newsletter.\n\n**Note:**\n"
},
"typeVersion": 1
},
{
"id": "18fc3e68-0e5a-42f3-bd40-069666aa7204",
"name": "Send a Mail",
"type": "n8n-nodes-base.gmail",
"onError": "continueRegularOutput",
"position": [
3024,
1760
],
"webhookId": "6aebeaec-a503-4029-8b5d-853abac74b54",
"parameters": {
"sendTo": "user@example.com",
"message": "={{ $json.html }}",
"options": {},
"subject": "Newsletter"
},
"credentials": {
"gmailOAuth2": {
"id": "credential-id",
"name": "gmailOAuth2 Credential"
}
},
"typeVersion": 2.1,
"alwaysOutputData": true
},
{
"id": "4909e681-f87e-47bd-8cf9-f7e629620fec",
"name": "Mail Campaign",
"type": "n8n-nodes-base.sendInBlue",
"position": [
3024,
1936
],
"parameters": {
"sender": "user@example.com",
"subject": "Newsletter",
"sendHTML": true,
"htmlContent": "={{ $json.html }}",
"receipients": "user@example.com",
"requestOptions": {},
"additionalFields": {}
},
"credentials": {
"sendInBlueApi": {
"id": "credential-id",
"name": "sendInBlueApi Credential"
}
},
"typeVersion": 1
},
{
"id": "3e0bc1ab-3b99-4250-8246-3f6024ddeaaf",
"name": "HTML Template",
"type": "n8n-nodes-base.html",
"position": [
2608,
1760
],
"parameters": {
"html": "<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>Newsletter Unthynk</title>\n <style>\n :root {\n --primary: #2b2b2b;\n --secondary: #6f6f6f;\n --accent: #d4a574;\n --dark: #1e1e1e;\n --light: #f4f4f2;\n --border: #e8e8e6;\n --text: #333;\n --muted: #888;\n }\n\n * { box-sizing: border-box; margin: 0; padding: 0; }\n\n body {\n font-family: 'Segoe UI', 'Trebuchet MS', sans-serif;\n background: linear-gradient(135deg, #f8f7f5 0%, #f1f1ef 100%);\n padding: 20px;\n color: var(--text);\n line-height: 1.7;\n min-height: 100vh;\n }\n\n .container {\n max-width: 900px;\n margin: 0 auto;\n background: #fff;\n border-radius: 16px;\n overflow: hidden;\n box-shadow: 0 12px 40px rgba(0,0,0,.1);\n }\n\n /* ===== HEADER ===== */\n .header {\n background: linear-gradient(135deg, var(--dark) 0%, var(--primary) 100%);\n padding: 60px 32px 45px;\n text-align: center;\n color: #fff;\n border-bottom: 3px solid var(--accent);\n }\n\n .header h1 {\n font-family: 'Georgia', serif;\n font-size: 2.8rem;\n font-weight: 700;\n letter-spacing: 3px;\n margin-bottom: 8px;\n text-transform: uppercase;\n text-shadow: 2px 2px 4px rgba(0,0,0,.2);\n }\n\n .header p {\n opacity: 0.92;\n font-size: 1rem;\n font-weight: 300;\n letter-spacing: 1px;\n }\n\n /* ===== TABS ===== */\n .tabs {\n display: flex;\n background: var(--light);\n border-bottom: 2px solid var(--border);\n flex-wrap: wrap;\n gap: 0;\n }\n\n .tab {\n flex: 1;\n min-width: 120px;\n padding: 18px 16px;\n background: none;\n border: none;\n font-size: 1rem;\n font-weight: 500;\n cursor: pointer;\n color: var(--muted);\n transition: all .3s cubic-bezier(.4, 0, .2, 1);\n position: relative;\n text-transform: uppercase;\n letter-spacing: 1px;\n }\n\n .tab:hover {\n background: rgba(43, 43, 43, .05);\n color: var(--primary);\n }\n\n .tab.active {\n background: #fff;\n color: var(--primary);\n font-weight: 700;\n }\n\n .tab.active::after {\n content: '';\n position: absolute;\n bottom: -2px;\n left: 0;\n right: 0;\n height: 3px;\n background: linear-gradient(90deg, var(--primary), var(--accent));\n }\n\n /* ===== CONTENT ===== */\n .content {\n padding: 40px 32px;\n min-height: 500px;\n }\n\n .tab-content {\n display: none;\n animation: fadeIn .5s ease;\n }\n\n .tab-content.active {\n display: block;\n }\n\n @keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n /* ===== ARTICLE CARD ===== */\n .article {\n background: #fafaf8;\n border: 1px solid var(--border);\n border-radius: 12px;\n padding: 28px;\n margin-bottom: 24px;\n transition: all .35s cubic-bezier(.4, 0, .2, 1);\n border-left: 4px solid var(--accent);\n }\n\n .article:hover {\n box-shadow: 0 14px 32px rgba(0,0,0,.12);\n transform: translateY(-4px);\n border-left-color: var(--primary);\n }\n\n .article h2 {\n font-size: 1.5rem;\n font-weight: 700;\n margin-bottom: 10px;\n color: var(--primary);\n line-height: 1.4;\n }\n\n .article .author {\n font-size: .9rem;\n color: var(--secondary);\n font-style: italic;\n margin-bottom: 14px;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .article .author::before {\n content: '✎';\n color: var(--accent);\n }\n\n .article .summary {\n color: #666;\n margin-bottom: 18px;\n font-size: .95rem;\n line-height: 1.8;\n }\n\n .meta {\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-top: 1px solid var(--border);\n padding-top: 16px;\n margin-top: 16px;\n flex-wrap: wrap;\n gap: 12px;\n }\n\n .source {\n font-size: .85rem;\n color: var(--muted);\n font-weight: 500;\n }\n\n .read {\n background: linear-gradient(135deg, var(--primary), var(--secondary));\n color: #fff;\n padding: 10px 22px;\n border-radius: 24px;\n font-size: .9rem;\n font-weight: 600;\n text-decoration: none;\n transition: all .3s ease;\n border: 2px solid transparent;\n cursor: pointer;\n display: inline-block;\n }\n\n .read:hover {\n background: linear-gradient(135deg, var(--secondary), var(--primary));\n transform: translateX(2px);\n box-shadow: 0 6px 16px rgba(43, 43, 43, .25);\n }\n\n /* ===== EMPTY STATE ===== */\n .empty-state {\n text-align: center;\n padding: 60px 40px;\n color: var(--muted);\n }\n\n .empty-state h3 {\n font-size: 1.3rem;\n margin-bottom: 10px;\n color: var(--secondary);\n }\n\n .empty-state p {\n font-size: .95rem;\n opacity: .8;\n }\n\n /* ===== FOOTER ===== */\n .footer {\n background: linear-gradient(135deg, var(--dark) 0%, var(--primary) 100%);\n color: #ccc;\n text-align: center;\n padding: 28px;\n font-size: .85rem;\n border-top: 3px solid var(--accent);\n }\n\n .footer a {\n color: var(--accent);\n text-decoration: none;\n font-weight: 600;\n transition: opacity .3s ease;\n }\n\n .footer a:hover {\n opacity: 0.8;\n text-decoration: underline;\n }\n /* .article {\n background: #ffffff;\n border-radius: 14px;\n padding: 1.5rem;\n margin-bottom: 1.5rem;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.06);\n transition: transform 0.25s ease, box-shadow 0.25s ease;\n}\n\n.article:hover {\n transform: translateY(-4px);\n box-shadow: 0 14px 40px rgba(0, 0, 0, 0.1);\n}\n\n.article-title {\n font-size: 1.25rem;\n font-weight: 600;\n color: #1f2933;\n margin-bottom: 0.75rem;\n line-height: 1.4;\n}\n\n.article-summary {\n color: #4b5563;\n font-size: 0.95rem;\n line-height: 1.6;\n margin-bottom: 1.2rem;\n}\n\n.article-footer {\n display: flex;\n justify-content: flex-end;\n}\n\n.article-read {\n text-decoration: none;\n font-weight: 500;\n font-size: 0.9rem;\n color: #2563eb;\n padding: 0.45rem 0.9rem;\n border-radius: 8px;\n transition: background 0.2s ease, color 0.2s ease;\n}\n\n.article-read:hover {\n background: rgba(37, 99, 235, 0.1);\n color: #1e40af;\n}\n*/\n\n /* ===== RESPONSIVE ===== */\n @media (max-width: 640px) {\n .header h1 {\n font-size: 2rem;\n letter-spacing: 2px;\n }\n\n .content {\n padding: 24px 18px;\n }\n\n .article {\n padding: 18px;\n }\n\n .tab {\n padding: 14px 10px;\n font-size: .85rem;\n min-width: 100px;\n }\n\n .tabs {\n flex-wrap: wrap;\n }\n\n .meta {\n flex-direction: column;\n align-items: flex-start;\n }\n }\n \n </style>\n</head>\n<body>\n\n<div class=\"container\">\n\n <header class=\"header\">\n <h1>NEWSLETTER</h1>\n <p>Veille thématique par Unthynk</p>\n </header>\n\n <nav class=\"tabs\">\n <button class=\"tab active\" onclick=\"openTab(event, 'news')\">📺 Anime</button>\n <button class=\"tab\" onclick=\"openTab(event, 'game')\">🎮 Game</button>\n <button class=\"tab\" onclick=\"openTab(event, 'school')\">🎬 Movies</button>\n <button class=\"tab\" onclick=\"openTab(event, 'science')\">🔬 Science</button>\n </nav>\n\n <main class=\"content\">\n\n <!-- ANIME SECTION -->\n <section id=\"news\" class=\"tab-content active\">\n {{ $json.HTML[0].HTML.html1 }}\n </section>\n\n <!-- GAME SECTION -->\n <section id=\"game\" class=\"tab-content\">\n {{ $json.HTML[2].HTML.html3 }}\n </section>\n\n <!-- MOVIES SECTION -->\n <section id=\"school\" class=\"tab-content\">\n {{ $json.HTML[1].HTML.html2 }}\n </section>\n\n <!-- SCIENCE SECTION -->\n <section id=\"science\" class=\"tab-content\">\n <article class=\"article\">\n <h2>Découvertes Scientifiques Récentes</h2>\n <p class=\"author\">Par Auteur</p>\n <p class=\"summary\">Les avancées majeures en science et recherche. De la physique quantique à la biologie, découvrez comment la science façonne notre futur.</p>\n <div class=\"meta\">\n <span class=\"source\">Source: Nature Science</span>\n <a href=\"#\" class=\"read\">Lire l'article</a>\n </div>\n </article>\n\n <article class=\"article\">\n <h2>Innovations Technologiques</h2>\n <p class=\"author\">Par Auteur</p>\n <p class=\"summary\">Explorez les innovations technologiques qui révolutionnent le monde. Intelligence artificielle, biotechnologie, énergie verte et bien d'autres domaines clés.</p>\n <div class=\"meta\">\n <span class=\"source\">Source: MIT Technology Review</span>\n <a href=\"#\" class=\"read\">Lire l'article</a>\n </div>\n </article>\n </section>\n\n </main>\n\n <footer class=\"footer\">\n © 2025 Unthynk · <a href=\"#\">Se désabonner</a>\n </footer>\n</div>\n\n<script>\n function openTab(evt, id) {\n const contents = document.querySelectorAll('.tab-content');\n const tabs = document.querySelectorAll('.tab');\n\n contents.forEach(content => content.classList.remove('active'));\n tabs.forEach(tab => tab.classList.remove('active'));\n\n document.getElementById(id).classList.add('active');\n evt.currentTarget.classList.add('active');\n }\n</script>\n\n</body>\n</html>"
},
"typeVersion": 1.2
},
{
"id": "cbf2b31e-b460-49cc-aa3f-8ab155863811",
"name": "Category Rss",
"type": "n8n-nodes-base.set",
"position": [
-560,
1792
],
"parameters": {
"mode": "raw",
"options": {},
"jsonOutput": "{ \"cat\":[\n \"Actualités Générales\",\n \"Technologie\",\n \"Science\",\n \"Économie & Finance\",\n \"Sports\",\n \"Culture & Divertissement\",\n \"Santé\",\n \"Environnement\",\n \"Politique\",\n \"Éducation\",\n \"Jeux Vidéo\",\n \"Cinéma\",\n \"Manga\"\n ]\n}\n"
},
"typeVersion": 3.4
},
{
"id": "4cfc76d1-9bf7-446c-8a1b-a34322f63870",
"name": "Jeu video",
"type": "n8n-nodes-base.code",
"position": [
1360,
2048
],
"parameters": {
"language": "python",
"pythonCode": "m = \"\"\n\nfor item in _input.all():\n t = item.json.title\n l = item.json.link\n c = item.json.content\n a = item.json.creator\n \n m += f\"\"\"<article class=\"article\">\n <header class=\"article-header\">\n <h2 class=\"article-title\">{t}</h2>\n </header>\n\n <p class=\"summary\">{c}</p>\n\n <footer class=\"article-footer\">\n <a href=\"{l}\" class=\"article-read\">\n Lire l’article →\n </a>\n </footer>\n</article>\n\"\"\"\n\nreturn [{\"HTML\":{'html3': m}}]"
},
"typeVersion": 2
},
{
"id": "04401689-6544-4fea-ba0e-fbcf4a52fc09",
"name": "Movie",
"type": "n8n-nodes-base.code",
"position": [
1360,
1776
],
"parameters": {
"language": "python",
"pythonCode": "m = \"\"\n\nfor item in _input.all():\n t = item.json.title\n l = item.json.link\n c = item.json.content\n a = item.json.creator\n \n m += f\"\"\"<article class=\"article\">\n <header class=\"article-header\">\n <h2 class=\"article-title\">{t}</h2>\n </header>\n\n <p class=\"summary\">{c}</p>\n\n <footer class=\"article-footer\">\n <a href=\"{l}\" class=\"article-read\">\n Lire l’article →\n </a>\n </footer>\n</article>\n\"\"\"\n\nreturn [{\"HTML\":{'html2': m}}]"
},
"typeVersion": 2
},
{
"id": "4ec09358-01bb-4488-80fe-e2624351c956",
"name": "Manga",
"type": "n8n-nodes-base.code",
"position": [
1376,
1536
],
"parameters": {
"language": "python",
"pythonCode": "m = \"\"\n\nfor item in _input.all():\n t = item.json.title\n l = item.json.link\n c = item.json.content\n \n m += f\"\"\"<article class=\"article\">\n <header class=\"article-header\">\n <h2 class=\"article-title\">{t}</h2>\n </header>\n\n <p class=\"summary\">{c}</p>\n\n <footer class=\"article-footer\">\n <a href=\"{l}\" class=\"article-read\">\n Lire l’article →\n </a>\n </footer>\n</article>\n\"\"\"\n\n \n\nreturn [{\"HTML\":{'html1': m}}]"
},
"typeVersion": 2
},
{
"parameters": {
"operation": "verify",
"email": "={{ $json.email || $json.Email }}",
"additionalOptions": {}
},
"type": "n8n-nodes-billionverify.billionVerify",
"typeVersion": 1,
"position": [
2664,
1760
],
"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": [
2844,
1760
],
"name": "IF deliverable"
}
],
"connections": {
"Manga": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Merge": {
"main": [
[
{
"node": "Aggregate",
"type": "main",
"index": 0
}
]
]
},
"Movie": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Switch": {
"main": [
[
{
"node": "Loop Over Items3",
"type": "main",
"index": 0
}
],
[
{
"node": "Loop Over Items4",
"type": "main",
"index": 0
}
],
[
{
"node": "Loop Over Items5",
"type": "main",
"index": 0
}
]
]
},
"Aggregate": {
"main": [
[
{
"node": "HTML Template",
"type": "main",
"index": 0
}
]
]
},
"Jeu video": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 2
}
]
]
},
"RSS Read1": {
"main": [
[
{
"node": "Loop Over Items3",
"type": "main",
"index": 0
}
],
[]
]
},
"RSS Read2": {
"main": [
[
{
"node": "Loop Over Items4",
"type": "main",
"index": 0
}
]
]
},
"RSS Read3": {
"main": [
[
{
"node": "Loop Over Items5",
"type": "main",
"index": 0
}
]
]
},
"Split Out2": {
"main": [
[
{
"node": "Rss database",
"type": "main",
"index": 0
}
]
]
},
"Send a Mail": {
"main": [
[]
]
},
"Category Rss": {
"main": [
[
{
"node": "Split Out2",
"type": "main",
"index": 0
}
]
]
},
"Rss database": {
"main": [
[
{
"node": "Switch",
"type": "main",
"index": 0
}
]
]
},
"HTML Template": {
"main": [
[
{
"node": "Mail Campaign",
"type": "main",
"index": 0
},
{
"node": "Verify Email (BillionVerify)",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items3": {
"main": [
[
{
"node": "Code in Python (Beta)",
"type": "main",
"index": 0
}
],
[
{
"node": "RSS Read1",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items4": {
"main": [
[
{
"node": "Code in Python (Beta)1",
"type": "main",
"index": 0
}
],
[
{
"node": "RSS Read2",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items5": {
"main": [
[
{
"node": "Code in Python (Beta)2",
"type": "main",
"index": 0
}
],
[
{
"node": "RSS Read3",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "Category Rss",
"type": "main",
"index": 0
}
]
]
},
"Code in Python (Beta)": {
"main": [
[
{
"node": "Manga",
"type": "main",
"index": 0
}
]
]
},
"Code in Python (Beta)1": {
"main": [
[
{
"node": "Movie",
"type": "main",
"index": 0
}
]
]
},
"Code in Python (Beta)2": {
"main": [
[
{
"node": "Jeu video",
"type": "main",
"index": 0
}
]
]
},
"Verify Email (BillionVerify)": {
"main": [
[
{
"node": "IF deliverable",
"type": "main",
"index": 0
}
]
]
},
"IF deliverable": {
"main": [
[
{
"node": "Send a Mail",
"type": "main",
"index": 0
}
],
[]
]
}
},
"settings": {
"executionOrder": "v1"
}
}When to use this
- Cleaning a list before a Brevo send or sync.
- Protecting Brevo deliverability and sender reputation.
- Keeping bounce rates low so your sending is never throttled.
FAQ
Why verify before sending in Brevo?
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