Este flujo automatiza la recopilación, análisis y envío por mail de las 10 noticias más importantes de SEO de la semana anterior.
Solo necesitás:
Acá podés descargar el JSON completo en este link, o copiando el archivo el siguiente código 👇
{
"name": "Eleven bot - Semanal",
"nodes": [
{
"parameters": {
"mode": "raw",
"jsonOutput": "{\n \"rss_feeds\": [\n {\n \"name\": \"Google Search Central (histórico, vía FeedBurner)\",\n \"url\": \"https://feeds.feedburner.com/blogspot/amDG\"\n },\n {\n \"name\": \"Moz Blog\",\n \"url\": \"https://moz.com/posts/rss/blog\"\n },\n {\n \"name\": \"Search Engine Roundtable\",\n \"url\": \"https://www.seroundtable.com/index.xml\"\n },\n {\n \"name\": \"Search Engine Journal\",\n \"url\": \"https://www.searchenginejournal.com/feed/\"\n },\n {\n \"name\": \"Search Engine Land\",\n \"url\": \"https://searchengineland.com/feed\"\n },\n {\n \"name\": \"SEMrush Blog\",\n \"url\": \"https://www.semrush.com/blog/feed/\"\n },\n {\n \"name\": \"Ahrefs Blog\",\n \"url\": \"https://ahrefs.com/blog/feed/\"\n }\n ]\n}",
"options": {}
},
"id": "08f327ac-791a-4b64-b77d-cde9d8d450b5",
"name": "Set Tech News RSS Feeds",
"type": "n8n-nodes-base.set",
"position": [
3220,
400
],
"typeVersion": 3.4,
"credentials": {}
},
{
"parameters": {
"url": "={{ $json.url }}",
"options": {
"ignoreSSL": false
}
},
"id": "3b4e9bd9-c669-4cee-a8a1-31539b0045d5",
"name": "Read RSS News Feeds",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
3640,
400
],
"typeVersion": 1.1,
"credentials": {}
},
{
"parameters": {
"fieldToSplitOut": "=rss_feeds",
"options": {}
},
"type": "n8n-nodes-base.splitOut",
"typeVersion": 1,
"position": [
3400,
400
],
"id": "c037fafa-96a0-4a43-84c4-231b468ef417",
"name": "Split Out",
"credentials": {}
},
{
"parameters": {
"jsCode": "/**\n * Filtra los artículos cuya isoDate sea\n * de los 7 días corridos anteriores a “ahora”\n * en la zona America/Argentina/Buenos_Aires.\n */\n\nconst TZ = 'America/Argentina/Buenos_Aires';\n\n// --- fecha/hora local “ahora” ---\nconst nowLocal = new Date(\n new Date().toLocaleString('en-US', { timeZone: TZ })\n);\n\n// pivot: final del día de ayer 23:59:59\nconst end = new Date(nowLocal);\nend.setDate(end.getDate() - 1);\nend.setHours(23, 59, 59, 999);\n\n// inicio: 7 días antes, 00:00:00\nconst start = new Date(end);\nstart.setDate(start.getDate() - 6); // 7 días en total\nstart.setHours(0, 0, 0, 0);\n\n// --- filtrar ---\nconst output = [];\n\nfor (const itm of $input.all()) {\n const iso = itm.json.isoDate;\n if (!iso) continue;\n\n const pub = new Date(iso);\n if (pub >= start && pub <= end) {\n output.push(itm);\n }\n}\n\nreturn output;"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
3880,
400
],
"id": "0af5f555-ff31-4fc8-89b4-84709df885d6",
"name": "Code1",
"credentials": {}
},
{
"parameters": {
"url": "={{'https://r.jina.ai/http://' + $json[\"link\"].replace(/^https?:\\/\\//, '')}}",
"options": {
"batching": {
"batch": {
"batchSize": 3,
"batchInterval": 2000
}
},
"response": {
"response": {
"responseFormat": "text",
"outputPropertyName": "article"
}
},
"timeout": 60000
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
4120,
400
],
"id": "9c2444e2-c550-416e-aeef-59c220457d57",
"name": "Fetch Full Article",
"retryOnFail": true,
"alwaysOutputData": false,
"executeOnce": false,
"notesInFlow": false,
"waitBetweenTries": 3000,
"onError": "continueErrorOutput",
"credentials": {}
},
{
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "/**\n * Recorta cada artículo a máx. 8 000 caracteres\n * y quita espacios en blanco al inicio/final.\n */\nconst MAX = 8000;\n\nlet text = item.json.article || '';\nitem.json.article = text.trim().slice(0, MAX);\n\nreturn item;\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
4720,
400
],
"id": "f0f8566e-8bb5-43f5-8359-9bc0d07827e0",
"name": "Clean & Trim",
"credentials": {}
},
{
"parameters": {
"aggregate": "aggregateAllItemData",
"destinationFieldName": "articles",
"options": {}
},
"type": "n8n-nodes-base.aggregate",
"typeVersion": 1,
"position": [
5580,
380
],
"id": "5f3f305c-14cb-480e-9f2a-d344aa10b2f3",
"name": "Aggregate",
"credentials": {}
},
{
"parameters": {
"modelId": {
"__rl": true,
"value": "gpt-4o",
"mode": "list",
"cachedResultName": "GPT-4O"
},
"messages": {
"values": [
{
"content": "Eres editor senior de noticias sobre SEO y búsqueda orgánica.\n\nDevuelve SIEMPRE un JSON con:\n\n title – título en español neutro, ≤12 palabras\n source – dominio\n link – URL\n summary – 1 oración en español (≤25 palabras)\n topic – UNA de las etiquetas:\n search_central, ai_overview, geo, aeo, sxo,\n search_update, seo_generic, other, ads, corporate\n raw_impact – entero 1-10 ponderado:\n • Relevancia SEO 40 %\n • Alcance global 25 %\n • Novedad 20 %\n • Autoridad de la fuente 10 %\n • Potencial de acción 5 %\n rationale – 1 frase (≤15 palabras) que justifique raw_impact\n\nCriterio de topic:\n • search_central → source contiene developers.google.com/search\n • ai_overview → texto contiene “AI Overview” o “AI Mode”\n • geo/aeo/sxo → aparece la sigla o frase completa\n • search_update → core update, ranking update, volatility…\n • ads → Merchant Center, Google Ads, Paid\n • corporate → despidos, finanzas, adquisiciones\n • seo_generic → guías, estudios, herramientas SEO\n • other → no encaja en los anteriores\n\nNo añadas texto fuera del JSON.",
"role": "system"
},
{
"content": "=TITLE: {{$json.title}}\nLINK: {{$json.link}}\nTEXT:\n{{$json.article}}"
}
]
},
"jsonOutput": true,
"options": {
"temperature": 0.3,
"topP": 1
}
},
"type": "@n8n/n8n-nodes-langchain.openAi",
"typeVersion": 1.8,
"position": [
5200,
400
],
"id": "862d0d4e-8200-477e-843a-57b9dfdc7735",
"name": "Summarize",
"retryOnFail": true,
"waitBetweenTries": 5000,
"credentials": {},
"onError": "continueErrorOutput"
},
{
"parameters": {
"modelId": {
"__rl": true,
"value": "gpt-4o",
"mode": "list",
"cachedResultName": "GPT-4O"
},
"messages": {
"values": [
{
"content": "Eres editor jefe de SEO/búsqueda.\n\nRecibes un ARRAY \"articles\" con:\n title, link, source, summary, topic, raw_impact, rationale.\n\nReglas para calcular final_impact (0-10, 1 decimal):\n • Empieza en raw_impact.\n • +2 si topic = search_central\n • +1.5 si topic = ai_overview\n • +1 si topic ∈ {geo, aeo, sxo, search_update}\n • +0.5 si summary contiene “ranking”, “visibilidad” o “tráfico orgánico”\n • −2 si topic ∈ {ads, corporate}\n ↳ EXCEPCIÓN: si summary menciona “resultados de búsqueda”\n o “CTR orgánico”, NO restes.\n • Si dos notas quedan a <0.2 de diferencia, prefiere distinta source.\n • No repitas exactamente el mismo final_impact dentro del mismo source.\n\nTareas:\n1. Calcula final_impact aplicando las reglas.\n2. Elige las 10 notas con mayor final_impact.\n3. Ordénalas de mayor a menor final_impact.\n4. Devuelve sólo:\n\n{\n \"chosen\":[\n {title, link, source, summary, final_impact, rationale},\n …\n ]\n}\n\nNo añadas texto fuera del JSON.",
"role": "system"
},
{
"content": "=ARTICLES:\n{{ JSON.stringify($json.articles) }}\n"
}
]
},
"jsonOutput": true,
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.openAi",
"typeVersion": 1.8,
"position": [
5980,
380
],
"id": "8ac890a8-ecca-4412-91ba-8fcef6cbbef6",
"name": "Rank & Pick",
"retryOnFail": true,
"waitBetweenTries": 5000,
"maxTries": 3,
"credentials": {},
"onError": "continueErrorOutput"
},
{
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "/**\n * Añade al ítem:\n * • chosen : array con las 10 noticias\n * • rango : \"del DD/MM al DD/MM\" de la semana pasada\n */\n\nconst TZ = 'America/Argentina/Buenos_Aires';\n\n// ------------ 1) Fecha local “ahora” ------------\nconst nowLocal = new Date(\n new Date().toLocaleString('en-US', { timeZone: TZ })\n);\n\n// ------------ 2) Domingo recién terminado ------------\nconst end = new Date(nowLocal);\nend.setDate(end.getDate() - 1); // ayer (domingo si hoy es lunes)\nend.setHours(23,59,59,999);\n\n// ------------ 3) Lunes de esa misma semana ------------\nconst start = new Date(end);\nstart.setDate(end.getDate() - 6); // seis días antes, 00:00\nstart.setHours(0,0,0,0);\n\n// ------------ 4) Formatear DD/MM ------------\nconst fmt = d => d.toLocaleDateString('es-AR', {\n day: '2-digit', month: '2-digit', timeZone: TZ\n});\n\n// ------------ 5) Guardar en el ítem ------------\nitem.json.rango = `del ${fmt(start)} al ${fmt(end)}`;\n\n// Si aún no simplificaste output:\nitem.json.chosen = item.json.message?.content?.chosen ?? item.json.chosen;\n\nreturn item;\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
6400,
360
],
"id": "48613151-a0fc-4091-87a8-484dd310c11b",
"name": "Code",
"credentials": {}
},
{
"parameters": {
"url": "={{'https://r.jina.ai/http://' + $json[\"link\"].replace(/^https?:\\/\\//, '')}}",
"options": {
"batching": {
"batch": {
"batchSize": 1,
"batchInterval": 4000
}
},
"response": {
"response": {
"responseFormat": "text",
"outputPropertyName": "article"
}
},
"timeout": 90000
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
4300,
620
],
"id": "eeb43570-d9eb-4494-bc67-c102c4e0a44c",
"name": "Fetch Alt Parser",
"retryOnFail": true,
"alwaysOutputData": false,
"executeOnce": false,
"notesInFlow": false,
"waitBetweenTries": 5000,
"maxTries": 2,
"onError": "continueErrorOutput",
"credentials": {}
},
{
"parameters": {
"sendTo": "<REDACTED_EMAIL>",
"subject": "=Resumen SEOmanal {{ $json.rango }}",
"emailType": "text",
"message": "=Estas son la 10 noticias más importantes {{ $json.rango }}: \n\n1) {{ $json.message.content.chosen[0].summary }} \n{{ $json.message.content.chosen[0].link }} \n\n2) {{ $json.message.content.chosen[1].summary }} \n{{ $json.message.content.chosen[1].link }} \n\n3) {{ $json.message.content.chosen[2].summary }} \n{{ $json.message.content.chosen[2].link }} \n\n4) {{ $json.message.content.chosen[3].summary }} \n{{ $json.message.content.chosen[3].link }} \n\n5) {{ $json.message.content.chosen[4].summary }} \n{{ $json.message.content.chosen[4].link }} \n\n6) {{ $json.message.content.chosen[5].summary }} \n{{ $json.message.content.chosen[5].link }} \n\n7) {{ $json.message.content.chosen[6].summary }} \n{{ $json.message.content.chosen[6].link }} \n\n8) {{ $json.message.content.chosen[7].summary }} \n{{ $json.message.content.chosen[7].link }} \n\n9) {{ $json.message.content.chosen[8].summary }} \n{{ $json.message.content.chosen[8].link }} \n\n10) {{ $json.message.content.chosen[9].summary }} \n{{ $json.message.content.chosen[9].link }}",
"options": {}
},
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [
6580,
380
],
"id": "f1ac8405-c6c0-4569-bdd2-ac7a03b4f348",
"name": "Gmail",
"credentials": {}
},
{
"parameters": {
"mode": "combine",
"combineBy": "combineByPosition",
"options": {
"includeUnpaired": true
}
},
"type": "n8n-nodes-base.merge",
"typeVersion": 3.2,
"position": [
4500,
400
],
"id": "c453e978-b187-4937-8508-0db5e0a4a0fd",
"name": "Merge",
"credentials": {}
},
{
"parameters": {
"jsCode": "/**\n * Deja los campos necesarios para el ranking\n * y reduce tokens a la mitad.\n */\nreturn $input.all().map(item => {\n item.json.articles_compact = (item.json.articles || []).map(a => ({\n title: a.title,\n source: a.source,\n link: a.link,\n summary: a.summary, // lo necesitamos para el Slack final\n topic: a.topic,\n raw_impact: a.raw_impact\n }));\n return item;\n});"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
5760,
380
],
"id": "dbcb566d-18c1-48af-ac90-eb96768e288b",
"name": "Code2",
"credentials": {}
},
{
"parameters": {
"amount": 1
},
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
4960,
400
],
"id": "ac7702d2-1482-4f83-a6a2-e89464b3b8d2",
"name": "Wait",
"credentials": {}
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtDay": [
1
],
"triggerAtHour": 12
}
]
}
},
"id": "878626e6-d99d-4f8b-9868-799e0e49cbaa",
"name": "Get Articles",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
3020,
400
],
"typeVersion": 1.2,
"credentials": {}
}
],
"pinData": {},
"connections": {
"Read RSS News Feeds": {
"main": [
[
{
"node": "Code1",
"type": "main",
"index": 0
}
]
]
},
"Set Tech News RSS Feeds": {
"main": [
[
{
"node": "Split Out",
"type": "main",
"index": 0
}
]
]
},
"Split Out": {
"main": [
[
{
"node": "Read RSS News Feeds",
"type": "main",
"index": 0
}
]
]
},
"Code1": {
"main": [
[
{
"node": "Fetch Full Article",
"type": "main",
"index": 0
}
]
]
},
"Fetch Full Article": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
],
[
{
"node": "Fetch Alt Parser",
"type": "main",
"index": 0
}
]
]
},
"Clean & Trim": {
"main": [
[
{
"node": "Wait",
"type": "main",
"index": 0
}
]
]
},
"Aggregate": {
"main": [
[
{
"node": "Code2",
"type": "main",
"index": 0
}
]
]
},
"Summarize": {
"main": [
[
{
"node": "Aggregate",
"type": "main",
"index": 0
}
]
]
},
"Rank & Pick": {
"main": [
[
{
"node": "Code",
"type": "main",
"index": 0
}
]
]
},
"Code": {
"main": [
[
{
"node": "Gmail",
"type": "main",
"index": 0
}
]
]
},
"Fetch Alt Parser": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Gmail": {
"main": [
[]
]
},
"Merge": {
"main": [
[
{
"node": "Clean & Trim",
"type": "main",
"index": 0
}
]
]
},
"Code2": {
"main": [
[
{
"node": "Rank & Pick",
"type": "main",
"index": 0
}
]
]
},
"Wait": {
"main": [
[
{
"node": "Summarize",
"type": "main",
"index": 0
}
]
]
},
"Get Articles": {
"main": [
[
{
"node": "Set Tech News RSS Feeds",
"type": "main",
"index": 0
}
]
]
}
},
"active": true,
"settings": {
"executionOrder": "v1",
"callerPolicy": "workflowsFromSameOwner"
},
"meta": {
"templateId": "3986",
"templateCredsSetupCompleted": true
},
"tags": []
}
Consultoría SEO
Aumenta tu visibilidad orgánica con nuestra asesoría personalizada, estratégica e integral.
Únete a cientos de profesionales que ya están recibiendo las novedades más importantes de SEO cada mes. Suscríbete gratis y no te pierdas lo que está marcando la agenda en la industria.
Consultoría SEO
Aumenta tu visibilidad orgánica con nuestra asesoría personalizada, estratégica e integral.