This workflow follows the Airtable → Gmail 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 →
{
"name": "Codeur.com \u2014 RSS Project Alert",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "minutes",
"minutesInterval": 30
}
]
}
},
"id": "node-schedule",
"name": "Every 30 min",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
240,
300
]
},
{
"parameters": {
"url": "https://www.codeur.com/projects.rss",
"options": {}
},
"id": "node-rss",
"name": "Codeur RSS Feed",
"type": "n8n-nodes-base.rssFeedRead",
"typeVersion": 1,
"position": [
460,
300
]
},
{
"parameters": {
"jsCode": "const items = [];\n\nfor (const item of $input.all()) {\n const title = (item.json.title || '').toLowerCase();\n const description = (item.json.description || item.json.content || '').toLowerCase();\n const fullText = title + ' ' + description;\n\n // --- Budget filter ---\n // Extract all amounts in euros from the text\n const euroMatches = fullText.match(/(\\d[\\d\\s.,]*)(\\s*k\u20ac|\\s*k eur|\\s*000\\s*\u20ac|\\s*\u20ac)/g) || [];\n const amounts = [];\n\n // Parse amounts like \"2 000 \u20ac\", \"2000\u20ac\", \"2k\u20ac\", \"2.000\u20ac\"\n const rawNumbers = fullText.match(/\\b(\\d[\\d\\s.,]{0,8})(?:\\s*k\u20ac|\\s*k eur|\\s*\u20ac)/g) || [];\n for (const raw of rawNumbers) {\n let num = raw.replace(/[^\\d.,k]/g, '');\n if (num.includes('k')) {\n num = parseFloat(num.replace('k', '')) * 1000;\n } else {\n num = parseFloat(num.replace(',', '.').replace(/\\s/g, ''));\n }\n if (!isNaN(num)) amounts.push(num);\n }\n\n // Decision: pass if at least one amount is between 1000 and 10000\n // OR if no budget is mentioned at all (unknown budget)\n let budgetOk = false;\n if (amounts.length === 0) {\n // No budget mentioned \u2192 let it through\n budgetOk = true;\n } else {\n budgetOk = amounts.some(a => a >= 1000 && a <= 10000);\n }\n\n if (budgetOk) {\n items.push(item);\n }\n}\n\nreturn items;"
},
"id": "node-budget",
"name": "Budget Filter (1k\u201310k\u20ac)",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
680,
300
]
},
{
"parameters": {
"operation": "search",
"application": "YOUR_AIRTABLE_BASE_ID",
"table": "Codeur Projects",
"filterByFormula": "={guid}='{{ $json.guid }}'",
"options": {}
},
"id": "node-airtable-search",
"name": "Airtable \u2014 Check Duplicate",
"type": "n8n-nodes-base.airtable",
"typeVersion": 2,
"position": [
900,
300
],
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": false,
"leftValue": "",
"typeValidation": "strict"
},
"conditions": [
{
"id": "check-not-exists",
"leftValue": "={{ $json.id }}",
"rightValue": "",
"operator": {
"type": "string",
"operation": "empty"
}
}
],
"combinator": "and"
},
"options": {}
},
"id": "node-if-duplicate",
"name": "IF \u2014 Not Already Sent",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
1120,
300
]
},
{
"parameters": {
"operation": "create",
"application": "YOUR_AIRTABLE_BASE_ID",
"table": "Codeur Projects",
"columns": {
"mappingMode": "defineBelow",
"value": {
"guid": "={{ $('Codeur RSS Feed').item.json.guid }}",
"titre": "={{ $('Codeur RSS Feed').item.json.title }}",
"lien": "={{ $('Codeur RSS Feed').item.json.link }}",
"date": "={{ $('Codeur RSS Feed').item.json.pubDate }}"
}
},
"options": {}
},
"id": "node-airtable-create",
"name": "Airtable \u2014 Save Project",
"type": "n8n-nodes-base.airtable",
"typeVersion": 2,
"position": [
1340,
200
],
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"fromEmail": "YOUR_EMAIL@gmail.com",
"toEmail": "YOUR_EMAIL@gmail.com",
"subject": "=\ud83c\udd95 [Codeur] {{ $('Codeur RSS Feed').item.json.title }}",
"emailType": "html",
"message": "=<h2>New project detected on Codeur.com</h2>\n\n<p><strong>\ud83d\udccc Project:</strong> {{ $('Codeur RSS Feed').item.json.title }}</p>\n<p><strong>\ud83d\udd17 Link:</strong> <a href=\"{{ $('Codeur RSS Feed').item.json.link }}\">Open on Codeur</a></p>\n<p><strong>\ud83d\udcc5 Published:</strong> {{ $('Codeur RSS Feed').item.json.pubDate }}</p>\n\n<hr />\n\n<h3>\ud83d\udcc4 Description</h3>\n<p>{{ $('Codeur RSS Feed').item.json.description }}</p>\n\n<hr />\n\n<h3>\u2709\ufe0f Your template message \u2014 copy/paste on Codeur</h3>\n<blockquote>\n<p>Bonjour,</p>\n<p>J'ai bien lu la description de votre projet et je pense pouvoir vous apporter une solution efficace.</p>\n<p>Je suis d\u00e9veloppeur Python & automatisation (n8n, IA) bas\u00e9 \u00e0 Rennes, avec une approche pragmatique : des outils qui fonctionnent, livr\u00e9s dans les d\u00e9lais, sans jargon.</p>\n<p>Pourriez-vous me pr\u00e9ciser vos contraintes de d\u00e9lai et le format de livraison attendu ? Je pourrai ainsi vous faire une proposition adapt\u00e9e.</p>\n<p>Cordialement,<br/>Emmanuel Ruaudel<br/>rennesdev.fr</p>\n</blockquote>",
"options": {}
},
"id": "node-email",
"name": "Send Email Alert",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [
1560,
200
],
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
}
}
],
"connections": {
"Every 30 min": {
"main": [
[
{
"node": "Codeur RSS Feed",
"type": "main",
"index": 0
}
]
]
},
"Codeur RSS Feed": {
"main": [
[
{
"node": "Budget Filter (1k\u201310k\u20ac)",
"type": "main",
"index": 0
}
]
]
},
"Budget Filter (1k\u201310k\u20ac)": {
"main": [
[
{
"node": "Airtable \u2014 Check Duplicate",
"type": "main",
"index": 0
}
]
]
},
"Airtable \u2014 Check Duplicate": {
"main": [
[
{
"node": "IF \u2014 Not Already Sent",
"type": "main",
"index": 0
}
]
]
},
"IF \u2014 Not Already Sent": {
"main": [
[
{
"node": "Airtable \u2014 Save Project",
"type": "main",
"index": 0
}
],
[]
]
},
"Airtable \u2014 Save Project": {
"main": [
[
{
"node": "Send Email Alert",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"staticData": null,
"tags": [
"codeur",
"freelance",
"rss",
"automatisation"
]
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
airtableTokenApigmailOAuth2
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Codeur.com — RSS Project Alert. Uses rssFeedRead, airtable, gmail. Scheduled trigger; 7 nodes.
Source: https://github.com/Ruaudel-Emmanuel/rss-codeur/blob/d0b19145199827c9004d3318beb3c18fdf2051b9/codeur_rss_workflow.json — 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.
The workflow is triggered automatically every day at 12:00 PM using a Cron node.
Trello Limit. Uses scheduleTrigger, rssFeedRead, sort, limit. Scheduled trigger; 15 nodes.
This workflow is designed for professionals and teams who need to monitor multiple RSS feeds, filter the latest content, and distribute actionable updates as a Trello comment. Ideal for content manage
Freelancers and agencies who track new Upwork leads via Vollna RSS and want clean logging to Google Sheets with instant Slack alerts.
Code. Uses scheduleTrigger, airtable, html, gmail. Scheduled trigger; 13 nodes.