AutomationFlowsEmail & Gmail › Codeur.com — RSS Project Alert

Codeur.com — RSS Project Alert

Codeur.com — RSS Project Alert. Uses rssFeedRead, airtable, gmail. Scheduled trigger; 7 nodes.

Cron / scheduled trigger★★★★☆ complexity7 nodesRSS Feed ReadAirtableGmail
Email & Gmail Trigger: Cron / scheduled Nodes: 7 Complexity: ★★★★☆ Added:

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 →

Download .json
{
  "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.

Pro

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 →

More Email & Gmail workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Email & Gmail

The workflow is triggered automatically every day at 12:00 PM using a Cron node.

RSS Feed Read, Google Sheets, Gmail +1
Email & Gmail

Trello Limit. Uses scheduleTrigger, rssFeedRead, sort, limit. Scheduled trigger; 15 nodes.

RSS Feed Read, Trello, Gmail
Email & Gmail

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

RSS Feed Read, Trello, Gmail
Email & Gmail

Freelancers and agencies who track new Upwork leads via Vollna RSS and want clean logging to Google Sheets with instant Slack alerts.

Google Sheets, RSS Feed Read, Slack +1
Email & Gmail

Code. Uses scheduleTrigger, airtable, html, gmail. Scheduled trigger; 13 nodes.

Airtable, Gmail