This workflow corresponds to n8n.io template #6540 — we link there as the canonical source.
This workflow follows the Agent → Google Sheets 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 →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "934d8441-bf80-4dec-9423-8adc877d55d7",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-4680,
-580
],
"parameters": {
"rule": {
"interval": [
{
"field": "months",
"triggerAtHour": 9
}
]
}
},
"typeVersion": 1.2
},
{
"id": "122563ce-0d90-4adc-bcc0-8e806c19e114",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-2860,
-1120
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-nano",
"cachedResultName": "gpt-4.1-nano"
},
"options": {
"temperature": 0.3
}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "2f9345a9-c5f1-4564-8ef3-836d75281fe1",
"name": "Append row",
"type": "n8n-nodes-base.googleSheetsTool",
"position": [
-2620,
-1120
],
"parameters": {
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": ""
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1OiqXcLWhxBewkm88MN2etNutPA2IgiyRwMmyNeLAyz4",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1OiqXcLWhxBewkm88MN2etNutPA2IgiyRwMmyNeLAyz4/edit?usp=drivesdk",
"cachedResultName": "Rapport GA"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "57e0c737-c007-4a9e-9258-df083a3bfd50",
"name": "OpenAI Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-2860,
-320
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-nano",
"cachedResultName": "gpt-4.1-nano"
},
"options": {
"temperature": 0.3
}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "50dd07fa-a710-4d03-8a81-95098a6454e5",
"name": "OpenAI Chat Model2",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-2860,
-720
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-nano",
"cachedResultName": "gpt-4.1-nano"
},
"options": {
"temperature": 0.3
}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "fdb3b364-b3a0-4a45-8f71-c27fd8a91c8b",
"name": "OpenAI Chat Model3",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-2860,
180
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-nano",
"cachedResultName": "gpt-4.1-nano"
},
"options": {
"temperature": 0.3
}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "8deb28d8-858d-42df-8802-3c339c83494f",
"name": "OpenAI Chat Model4",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-1780,
-420
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-nano",
"cachedResultName": "gpt-4.1-nano"
},
"options": {
"temperature": 0.3
}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "4ef711bd-bcaa-4b61-8dfd-f4cc36f8a0a1",
"name": "Get row(s)4",
"type": "n8n-nodes-base.googleSheetsTool",
"position": [
-1600,
-420
],
"parameters": {
"sheetName": {
"__rl": true,
"mode": "list",
"value": ""
},
"documentId": {
"__rl": true,
"mode": "list",
"value": ""
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "a0760c4c-5455-42e5-88c2-fcaa0f3141b0",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
-2200,
-660
],
"parameters": {
"numberInputs": 4
},
"typeVersion": 3.2
},
{
"id": "8376066b-cb77-4b60-93d1-c883eaafbb39",
"name": "Search console",
"type": "n8n-nodes-base.httpRequest",
"position": [
-3300,
-440
],
"parameters": {
"url": "=https://www.googleapis.com/webmasters/v3/sites/{{ encodeURIComponent($('Set Target Website').item.json.domain) }}/searchAnalytics/query",
"method": "POST",
"options": {},
"jsonBody": "{\n \"startDate\": \"{{ $now.minus({months: 1}).toFormat('yyyy-MM-dd') }}\",\n \"endDate\": \"{{ $now.toFormat('yyyy-MM-dd') }}\",\n \"dimensions\": [\"query\"],\n \"rowLimit\": 10\n}\n",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"nodeCredentialType": "googleOAuth2Api"
},
"credentials": {
"googleOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "d3676416-da4b-41ea-8b9b-b18ea5adbef8",
"name": "Set Target Website",
"type": "n8n-nodes-base.set",
"position": [
-4380,
-580
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "e3962683-6d91-4db2-af47-8ade2b8fb444",
"name": "domain",
"type": "string",
"value": "https://www.your-website.com"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "ef6218b1-dff2-41fc-9aad-6d7e7a3c809a",
"name": "Format GA Data",
"type": "n8n-nodes-base.code",
"position": [
-3080,
-1240
],
"parameters": {
"jsCode": "// n8n code to aggregate all Google Analytics data into a single block for the LangChain agent\n\n// Get all input data from the Google Analytics node\nconst inputData = $input.all();\n\n// Function to format numbers with thousand separators\nfunction formatNumber(num) {\n return parseInt(num).toLocaleString('en-US');\n}\n\n// Function to extract the domain from a URL\nfunction extractDomain(url) {\n if (!url) return 'unknown';\n try {\n const cleanUrl = url.replace(/^https?:\\/\\//, '').replace(/^www\\./, '');\n const domain = cleanUrl.split('/')[0];\n return domain;\n } catch (error) {\n return 'unknown';\n }\n}\n\n// Aggregate all data\nconst allData = inputData.map(item => item.json);\n\n// Calculate totals and global metrics\nconst aggregatedMetrics = {\n totalSessions: allData.reduce((sum, item) => sum + parseInt(item.sessions || 0), 0),\n totalUsers: allData.reduce((sum, item) => sum + parseInt(item.totalUsers || 0), 0),\n totalPageViews: allData.reduce((sum, item) => sum + parseInt(item.screenPageViews || 0), 0),\n countries: [...new Set(allData.map(item => item.country).filter(Boolean))],\n urls: [...new Set(allData.map(item => item.pageLocation).filter(Boolean))],\n dataCount: allData.length\n};\n\n// Calculate derived metrics\naggregatedMetrics.avgPageViewsPerSession = (aggregatedMetrics.totalPageViews / aggregatedMetrics.totalSessions).toFixed(2);\naggregatedMetrics.avgSessionsPerUser = (aggregatedMetrics.totalSessions / aggregatedMetrics.totalUsers).toFixed(2);\naggregatedMetrics.returnUserRate = ((aggregatedMetrics.totalSessions - aggregatedMetrics.totalUsers) / aggregatedMetrics.totalSessions * 100).toFixed(1);\n\n// Create the comprehensive text summary\nconst comprehensiveReport = `\n=== GOOGLE ANALYTICS REPORT - LAST 30 DAYS ===\n\n\ud83d\udcca GLOBAL METRICS:\n\u2022 Total sessions: ${formatNumber(aggregatedMetrics.totalSessions)}\n\u2022 Unique users: ${formatNumber(aggregatedMetrics.totalUsers)}\n\u2022 Total page views: ${formatNumber(aggregatedMetrics.totalPageViews)}\n\u2022 Page views per session: ${aggregatedMetrics.avgPageViewsPerSession}\n\u2022 Sessions per user: ${aggregatedMetrics.avgSessionsPerUser}\n\u2022 Returning user rate: ${aggregatedMetrics.returnUserRate}%\n\n\ud83c\udf0d GEOGRAPHICAL BREAKDOWN:\n\u2022 Number of countries: ${aggregatedMetrics.countries.length}\n\u2022 Main countries: ${aggregatedMetrics.countries.join(', ')}\n\n\ud83d\udd17 WEBSITES ANALYZED:\n\u2022 Number of URLs: ${aggregatedMetrics.urls.length}\n\u2022 Main URLs: ${aggregatedMetrics.urls.join(', ')}\n`.trim();\n\n// Simplified return with a single \"content\" field\nreturn [{\n json: {\n content: comprehensiveReport\n }\n}];\n"
},
"typeVersion": 2
},
{
"id": "ed1a7666-4808-44cf-a415-7ccc76f22d2a",
"name": "Analytics Specialist Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-2828,
-1340
],
"parameters": {
"text": "=Aujourd'hui nous sommes le {{ $now }}\n\nTu es un expert Google Analytics sp\u00e9cialis\u00e9 dans l'analyse de sites web tech/IA. \n\nMISSION : Analyser les donn\u00e9es GA4 pour nana-intelligence.fr et identifier les opportunit\u00e9s d'optimisation.\n\nDONN\u00c9ES D'ENTR\u00c9E : {{ $json.content }}\n\nANALYSE REQUISE :\n\ud83d\udcca M\u00e9triques de performance globale\n- Sessions, utilisateurs, taux de rebond\n- Dur\u00e9e moyenne des sessions\n- Pages vues par session\n- Sources de trafic principales\n\n\ud83c\udfaf Analyse comportementale\n- Pages les plus performantes\n- Parcours utilisateur type\n- Points de friction identifi\u00e9s\n- Taux de conversion par source\n\n\ud83d\udcc8 Tendances et \u00e9volution\n- Comparaison avec p\u00e9riode pr\u00e9c\u00e9dente\n- Saisonnalit\u00e9 du trafic\n- Impact des publications de contenu\n- Croissance du trafic organique\n\nFOCUS SP\u00c9CIAL NICHE IA :\n- Performance du contenu IA/tech\n- Engagement sur les articles techniques\n- Conversion des visiteurs int\u00e9ress\u00e9s par l'IA\n\nFORMAT DE SORTIE :\nRetourne un objet JSON structur\u00e9 avec :\n{\n 'performance_globale': {...},\n 'comportement_utilisateurs': {...},\n 'tendances': {...},\n 'recommandations_analytics': [...]\n\n",
"options": {
"systemMessage": "={\n \"systemMessage\": \"Tu es un analyste web senior avec 10 ans d'exp\u00e9rience dans l'analyse de sites tech/IA. Ton ton est professionnel mais accessible. Tu d\u00e9tectes les patterns cach\u00e9s dans les donn\u00e9es et proposes des actions concr\u00e8tes. Tu ma\u00eetrises parfaitement les sp\u00e9cificit\u00e9s du secteur de l'intelligence artificielle et du marketing digital.IMPORTANT: Termine TOUJOURS ta r\u00e9ponse par un JSON structur\u00e9 avec les KPIs demand\u00e9s, puis un paragraphe de synth\u00e8se executive claire pour le chef d'entreprise.\n\"\n}\n"
},
"promptType": "define"
},
"typeVersion": 2
},
{
"id": "95e9373d-cbfd-42ae-aba4-fc3e351f0a0f",
"name": "Format Search Console Data",
"type": "n8n-nodes-base.code",
"position": [
-3080,
-440
],
"parameters": {
"jsCode": "// Formatting for Search Console with handling of empty data\nconst data = $input.first().json;\n\n// Check if we have actual data\nconst hasData = data.rows && data.rows.length > 0;\n\nif (!hasData) {\n // Case for a new/recent site - Constructive response\n const reportText = `\n=== GOOGLE SEARCH CONSOLE REPORT - TARGET WEBSITE ===\n\ud83d\udcca ANALYSIS DATE: ${new Date().toLocaleDateString('en-US')}\n\n\ud83c\udd95 STATUS: SITE IN SEO START-UP PHASE\n\u2022 No Search Console data available (this is normal for a new site).\n\u2022 API functional: \u2705 Authentication successful.\n\n\ud83d\ude80 POSITIVE DIAGNOSIS:\n\u2022 Technical setup: Correct.\n\u2022 Google API access: Validated.\n\u2022 Indexing: In progress.\n\n\ud83c\udfaf RECOMMENDATIONS TO SPEED UP INDEXING:\n\u2022 Submit the XML sitemap to Google Search Console.\n\u2022 Create high-quality content regularly.\n\u2022 Obtain natural backlinks.\n\u2022 Optimize meta descriptions and titles.\n\u2022 Use Google Search Console to request manual indexing.\n\n\u23f3 EXPECTED TIMELINE:\n\u2022 First GSC data: 2-4 weeks after indexing.\n\u2022 Significant data: 2-3 months with regular content.\n\u2022 Mature SEO performance: 6-12 months.\n`;\n\n return [{\n json: {\n content: reportText,\n searchConsoleData: {\n status: \"new_site\",\n hasData: false,\n }\n }\n }];\n}\n\n// If we have data\nconst searchData = data.rows.map(row => ({\n query: row.keys[0] || 'Not specified',\n clicks: row.clicks || 0,\n impressions: row.impressions || 0,\n ctr: ((row.ctr || 0) * 100).toFixed(2),\n position: (row.position || 0).toFixed(1)\n}));\n\nconst totalClicks = searchData.reduce((sum, item) => sum + item.clicks, 0);\nconst totalImpressions = searchData.reduce((sum, item) => sum + item.impressions, 0);\n\nconst reportText = `\n=== GOOGLE SEARCH CONSOLE REPORT - DATA AVAILABLE ===\n\ud83d\udcca METRICS: ${totalClicks} clicks, ${totalImpressions} impressions.\n\ud83d\udd1d TOP QUERIES: ${searchData.slice(0, 5).map(item => item.query).join(', ')}\n`;\n\nreturn [{\n json: {\n content: reportText,\n searchConsoleData: {\n status: \"data_available\",\n hasData: true,\n totalClicks,\n totalImpressions,\n topQueries: searchData.slice(0, 5)\n }\n }\n}];\n"
},
"typeVersion": 2
},
{
"id": "d7d2dda7-896b-462c-b959-e782dac35e52",
"name": "SEO Specialist Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-2828,
-540
],
"parameters": {
"text": "=Tu es un consultant SEO senior sp\u00e9cialis\u00e9 dans le lancement de sites tech/IA.\n\nMISSION : Analyser la situation Search Console et proposer une strat\u00e9gie d'acc\u00e9l\u00e9ration SEO.\n\nDONN\u00c9ES RE\u00c7UES : {{ $json.content }}\nSTATUT TECHNIQUE : {{ $json.searchConsoleData }}\n\nCONTEXTE SP\u00c9CIFIQUE :\n- Site sp\u00e9cialis\u00e9 en intelligence artificielle \n- Phase de d\u00e9marrage SEO (normal d'avoir peu/pas de donn\u00e9es)\n- Besoin de strat\u00e9gie d'acc\u00e9l\u00e9ration de la visibilit\u00e9\n\nANALYSE REQUISE :\n\n\ud83d\ude80 Diagnostic Phase de D\u00e9marrage\n- \u00c9valuation de la situation actuelle\n- Identification des leviers prioritaires\n- Timeline r\u00e9aliste d'acquisition de trafic\n\n\ud83c\udfaf Strat\u00e9gie Contenu IA/Tech \n- Mots-cl\u00e9s prioritaires secteur IA\n- Sujets de contenu \u00e0 forte valeur ajout\u00e9e\n- Optimisation technique pour Google\n\n\ud83d\udcc8 Plan d'Acc\u00e9l\u00e9ration SEO\n- Actions week 1-4 (indexation rapide)\n- Actions mois 2-3 (construction autorit\u00e9) \n- Actions mois 3-6 (scaling traffic organique)\n\n\ud83d\udcb0 ROI et Objectifs Chiffr\u00e9s\n- Objectifs de trafic r\u00e9alistes par trimestre\n- KPIs \u00e0 tracker prioritairement\n- Budget/ressources recommand\u00e9es\n\nFORMAT R\u00c9PONSE :\n- Synth\u00e8se situationnelle (2-3 phrases)\n- Top 3 actions imm\u00e9diates (cette semaine)\n- Strat\u00e9gie contenu IA 30-60-90 jours\n- Objectifs chiffr\u00e9s \u00e0 6 mois\n\nSois encourageant, pr\u00e9cis et ax\u00e9 ROI. Utilise des \u00e9mojis pour structurer.\n",
"options": {
"systemMessage": "You must respond only in English. Be precise, actionable, and results-oriented. Use quantified data whenever possible.\n"
},
"promptType": "define"
},
"typeVersion": 2
},
{
"id": "40f48efd-4c90-4e05-82c8-8eee42838955",
"name": "Fetch PageSpeed Data",
"type": "n8n-nodes-base.httpRequest",
"position": [
-3300,
-840
],
"parameters": {
"url": "=https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url={{ $json.domain }}&category=performance&category=accessibility&category=best-practices&category=seo",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpQueryAuth"
},
"credentials": {
"httpQueryAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "186246bb-53c6-4f42-94db-657253bcff70",
"name": "Format PageSpeed Data",
"type": "n8n-nodes-base.code",
"position": [
-3080,
-840
],
"parameters": {
"jsCode": "// Advanced formatting of Page Speed Insights data\nconst data = $input.first().json;\n\n// Verify that the data is valid\nif (!data.lighthouseResult) {\n return [{\n json: {\n error: \"Invalid Page Speed Insights data\",\n content: \"Error while fetching performance metrics\"\n }\n }];\n}\n\nconst lighthouse = data.lighthouseResult;\n\n// Generate the text report for the AI agent\nconst reportText = `\n=== PAGE SPEED INSIGHTS REPORT - TARGET WEBSITE ===\n\ud83d\udcca ANALYSIS DATE: ${new Date().toLocaleDateString('en-US')} - Strategy: ${lighthouse.configSettings.emulatedFormFactor}\n\n\ud83c\udfaf LIGHTHOUSE SCORES:\n\u2022 Performance: ${Math.round(lighthouse.categories.performance.score * 100)}/100\n\u2022 Accessibility: ${Math.round(lighthouse.categories.accessibility.score * 100)}/100\n\u2022 Best Practices: ${Math.round(lighthouse.categories['best-practices'].score * 100)}/100\n\u2022 SEO: ${Math.round(lighthouse.categories.seo.score * 100)}/100\n\n\u26a1 CORE WEB VITALS:\n\u2022 First Contentful Paint: ${lighthouse.audits['first-contentful-paint'].displayValue}\n\u2022 Largest Contentful Paint: ${lighthouse.audits['largest-contentful-paint'].displayValue}\n\u2022 Cumulative Layout Shift: ${lighthouse.audits['cumulative-layout-shift'].displayValue}\n\u2022 Speed Index: ${lighthouse.audits['speed-index'].displayValue}\n`;\n\nreturn [{\n json: {\n content: reportText\n }\n}];\n"
},
"typeVersion": 2
},
{
"id": "589300cb-913e-4dfe-b987-cb9077c3049a",
"name": "Performance Specialist Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-2820,
-940
],
"parameters": {
"text": "=Aujourd'hui nous sommes le {{ $now }}\n\nTu es un expert en performance web et Core Web Vitals, sp\u00e9cialis\u00e9 dans l'optimisation de sites tech/IA.\n\nMISSION : Analyser les m\u00e9triques PageSpeed Insights de nana-intelligence.fr et proposer des optimisations concr\u00e8tes.\n\nDONN\u00c9ES RE\u00c7UES : {{ $json.content }}\nM\u00c9TRIQUES STRUCTUR\u00c9ES : {{ $json.pagespeed_data }}\n\nANALYSE REQUISE :\n\n\u26a1 Core Web Vitals\n- \u00c9valuation LCP, FID, CLS vs seuils Google\n- Impact sur l'exp\u00e9rience utilisateur\n- Priorisation des corrections\n\n\ud83d\udcf1 Performance Mobile vs Desktop\n- Identification des goulots d'\u00e9tranglement\n- Optimisations sp\u00e9cifiques par device\n\n\ud83d\udd27 Optimisations Techniques Prioritaires\n- Resources bloquantes critiques\n- Optimisation images et m\u00e9dias\n- Minification CSS/JS\n- Strat\u00e9gies de cache\n\n\ud83c\udfaf Impact SEO & Business\n- Corr\u00e9lation performance/classements Google\n- ROI estim\u00e9 des optimisations\n- Objectifs chiffr\u00e9s \u00e0 30 jours\n\nCONTEXTE : Site IA/tech avec contenu riche n\u00e9cessitant performance optimale.\n\nFORMAT R\u00c9PONSE :\n- Synth\u00e8se performance actuelle (2-3 phrases)\n- Top 3 optimisations prioritaires avec impact estim\u00e9\n- Plan d'action technique avec timeline\n- Objectifs de performance \u00e0 atteindre\n\nUtilise des \u00e9mojis pour structurer ta r\u00e9ponse et sois concret dans tes recommandations.",
"options": {
"systemMessage": "You must respond only in English. Be precise, actionable, and results-oriented. Use quantified data whenever possible.\n"
},
"promptType": "define"
},
"typeVersion": 2
},
{
"id": "bb516f2c-aa34-48dc-9201-19fcace4e1f6",
"name": "Crawl Website Homepage",
"type": "n8n-nodes-base.httpRequest",
"position": [
-3520,
-40
],
"parameters": {
"url": "={{ $json.domain }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "User-Agent",
"value": "Mozilla/5.0 (compatible; n8n-seo-audit/1.0)"
},
{
"name": "Accept",
"value": "text/html,application/xhtml+xml"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "3d69a9e4-a206-491f-80d0-6b28da693fab",
"name": "Extract On-Page SEO Data",
"type": "n8n-nodes-base.code",
"position": [
-3300,
-40
],
"parameters": {
"jsCode": "// Complete extraction of SEO data from HTML\nconst html = $input.first().json.body || $input.first().json.data || '';\n\nif (!html) {\n return [{\n json: {\n error: \"No HTML content retrieved\",\n content: \"Error while scraping the site\"\n }\n }];\n}\n\nfunction cleanText(text) {\n return text ? text.replace(/<[^>]*>/g, '').trim() : '';\n}\n\nconst seoExtraction = {\n title: cleanText(html.match(/<title[^>]*>(.*?)<\\/title>/i)?.[1]) || 'Not found',\n metaDescription: html.match(/<meta[^>]*name=[\"']description[\"'][^>]*content=[\"']([^\"']*)[\"'][^>]*>/i)?.[1] || 'Not found',\n h1Tags: (html.match(/<h1[^>]*>(.*?)<\\/h1>/gi) || []).map(h1 => cleanText(h1)),\n totalImages: (html.match(/<img[^>]*>/gi) || []).length,\n imagesWithAlt: (html.match(/<img[^>]*alt=[\"'][^\"']*[\"'][^>]*>/gi) || []).length,\n};\n\nseoExtraction.imagesWithoutAlt = seoExtraction.totalImages - seoExtraction.imagesWithAlt;\n\nreturn [{\n json: seoExtraction\n}];\n"
},
"typeVersion": 2
},
{
"id": "c8b99b81-c718-4477-b59d-7bbbb0779ac5",
"name": "Score On-Page SEO",
"type": "n8n-nodes-base.code",
"position": [
-3080,
-40
],
"parameters": {
"jsCode": "// Complete analysis and scoring of extracted SEO data\nconst seoData = $input.first().json;\n\nif (!seoData || !seoData.title) {\n return [{\n json: {\n error: \"Missing SEO data\",\n content: \"Unable to proceed with the audit\"\n }\n }];\n}\n\n// SEO scoring system (out of 100 points)\nconst scoring = {\n technical: 0,\n onPage: 0,\n};\n\n// TECHNICAL SCORE\nif (seoData.title && seoData.title !== 'Not found') scoring.technical += 10;\nif (seoData.metaDescription && seoData.metaDescription !== 'Not found') scoring.technical += 10;\n\n// ON-PAGE SCORE\nif (seoData.h1Tags.length === 1) scoring.onPage += 10;\nif (seoData.imagesWithoutAlt === 0 && seoData.totalImages > 0) scoring.onPage += 10;\n\nconst totalScore = scoring.technical + scoring.onPage;\nlet scoreStatus = '';\nif (totalScore >= 80) scoreStatus = 'EXCELLENT';\nelse if (totalScore >= 60) scoreStatus = 'GOOD';\nelse if (totalScore >= 40) scoreStatus = 'AVERAGE';\nelse scoreStatus = 'POOR';\n\nconst criticalIssues = [];\nif (!seoData.title || seoData.title === 'Not found') criticalIssues.push('\u274c CRITICAL: Missing title');\nif (!seoData.metaDescription || seoData.metaDescription === 'Not found') criticalIssues.push('\u274c CRITICAL: Missing meta description');\nif (seoData.h1Tags.length === 0) criticalIssues.push('\u274c CRITICAL: No H1 tag detected');\nelse if (seoData.h1Tags.length > 1) criticalIssues.push('\u26a0\ufe0f IMPORTANT: Multiple H1 tags detected');\n\nconst recommendations = [];\nif (seoData.imagesWithoutAlt > 0) recommendations.push(`\ud83d\uddbc\ufe0f Add alt text to ${seoData.imagesWithoutAlt} images`);\n\n// Complete audit report\nconst auditReport = `\n=== COMPLETE TECHNICAL SEO AUDIT - TARGET WEBSITE ===\n\ud83d\udcca ANALYSIS DATE: ${new Date().toLocaleDateString('en-US')}\n\n\u2605 GLOBAL SEO SCORE: ${totalScore}/100 (${scoreStatus})\n\n\ud83d\udccb ON-PAGE ANALYSIS:\n\u2022 Title: ${seoData.title !== 'Not found' ? '\u2705 ' + seoData.title.substring(0, 80) : '\u274c Missing'}\n\u2022 Meta description: ${seoData.metaDescription !== 'Not found' ? '\u2705 ' + seoData.metaDescription.substring(0, 100) : '\u274c Missing'}\n\u2022 H1: ${seoData.h1Tags.length} found(s) ${seoData.h1Tags.length === 1 ? '\u2705' : '\u26a0\ufe0f'}\n\u2022 Images with alt text: ${seoData.imagesWithAlt}/${seoData.totalImages} ${seoData.imagesWithoutAlt === 0 ? '\u2705' : '\u274c'}\n\n${criticalIssues.length > 0 ? '\ud83d\udea8 CRITICAL ISSUES:\\n' + criticalIssues.join('\\n') : ''}\n${recommendations.length > 0 ? '\ud83d\udca1 PRIORITY RECOMMENDATIONS:\\n' + recommendations.map(rec => '\u2022 ' + rec).join('\\n') : ''}\n`;\n\nreturn [{\n json: {\n content: auditReport,\n auditData: {\n totalScore,\n scoreStatus,\n scoring,\n criticalIssues,\n recommendations,\n }\n }\n}];\n"
},
"typeVersion": 2
},
{
"id": "4901342b-1f93-4083-9cc1-1ae4d28d011d",
"name": "Technical Audit Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-2820,
-40
],
"parameters": {
"text": "=You are a senior technical SEO expert, specializing in auditing and optimizing AI/tech websites.\n\nMISSION: Analyze the complete technical audit and create a prioritized action plan.\n\nAUDIT DATA: {{ $json.content }}\nDETAILED METRICS: {{ $json.auditData }}\n\n### In-Depth Analysis Required:\n\n\ud83d\udd0d **Expert Diagnosis**\n- Evaluate the overall score and position against competitors.\n- Identify quick wins versus long-term optimizations.\n- Prioritize based on SEO impact vs. required effort.\n\n\u26a1 **Immediate Action Plan (7 days)**\n- Critical fixes to implement first.\n- Quick on-page optimizations.\n- Essential technical improvements.\n\n\ud83d\udcc8 **Technical Roadmap (30-90 days)**\n- Phase 1 (0-30d): Solid SEO foundations.\n- Phase 2 (30-60d): Advanced optimizations.\n- Phase 3 (60-90d): Performance and monitoring.\n\n\ud83d\udcb0 **ROI and Estimated Impact**\n- Potential traffic gain per improvement.\n- Required resources vs. benefits.\n- Realistic timeline to see results.\n\n### TOOL USAGE INSTRUCTIONS (VERY IMPORTANT)\nOnce your analysis is complete, before formulating your final response, you MUST use the `Append or update row in sheet in Google Sheets` tool to save a summary.\nTo do this, you must provide data in a perfect JSON format matching the spreadsheet columns:\n\n{\n \"Date\": \"{{ $now.toISODate() }}\", // Use current date in YYYY-MM-DD format\n \"Source\": \"Technical SEO Audit\",\n \"Rapport\": \"Insert a concise summary of your audit here (2-3 paragraphs max).\",\n \"Recommandations\": \"List the top 3 most critical recommendations here as a bulleted list.\"\n}\n\nAfter successfully calling this tool, you can then formulate your full response for the end-user.\n\n### RESPONSE FORMAT:\nStructure your final response with emojis, clear sections, and highly concrete recommendations. Conclude with a dashboard of 5 main KPIs to track.\n",
"options": {
"systemMessage": "You must respond only in English. Be precise, actionable, and results-oriented. Use quantified data whenever possible.\n"
},
"promptType": "define"
},
"typeVersion": 2
},
{
"id": "8b01b20c-c10c-43a9-8fe7-34d3d703933c",
"name": "Aggregate All Reports",
"type": "n8n-nodes-base.code",
"position": [
-1980,
-640
],
"parameters": {
"jsCode": "// Simple aggregator - post-merge\nconst allInputs = $input.all();\n\n// Extract contents\nconst reports = allInputs.map((input, index) => ({\n index: index + 1,\n content: input.json.output || input.json.content || JSON.stringify(input.json),\n}));\n\n// Create the consolidated text\nconst consolidatedText = `\n=== CONSOLIDATED DATA FOR MASTER ANALYST ===\n\ud83d\udcca Reports received: ${reports.length}/4\n\n\ud83d\udcc4 REPORT 1 (ANALYTICS):\n${reports[0]?.content.substring(0, 1000)}...\n\n\ud83d\udcc4 REPORT 2 (PAGESPEED):\n${reports[1]?.content.substring(0, 1000)}...\n\n\ud83d\udcc4 REPORT 3 (SEARCH CONSOLE):\n${reports[2]?.content.substring(0, 1000)}...\n\n\ud83d\udcc4 REPORT 4 (TECHNICAL AUDIT):\n${reports[3]?.content.substring(0, 1000)}...\n\n\ud83c\udfaf MASTER ANALYST INSTRUCTIONS:\nAnalyze these 4 reports and create a comprehensive SEO summary with a prioritized action plan.\n`;\n\nreturn [{\n json: {\n textSummary: consolidatedText\n }\n}];\n"
},
"typeVersion": 2
},
{
"id": "4d826fd3-118b-4316-bb10-0ac18bf8d694",
"name": "Master Analyst Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-1760,
-640
],
"parameters": {
"text": "=You are the MASTER SEO ANALYST, an expert in strategic synthesis and actionable recommendations.\n\nCONSOLIDATED DATA RECEIVED: {{ $json.textSummary }}\nMETADATA: {{ $json.reportMetadata }}\n\nMISSION: Create a 360\u00b0 SEO analysis and a prioritized action plan for nana-intelligence.fr.\n\nSPECIFIC CONTEXT:\n- Site specializing in artificial intelligence\n- Growth and SEO optimization phase\n- Need for concrete and prioritized recommendations\n\nCOMPLETE ANALYSIS REQUIRED:\n\n\ud83c\udfaf EXECUTIVE SUMMARY\n- Estimated overall SEO score (/100)\n- 3 main strengths identified\n- 3 critical weaknesses to correct\n- Estimated competitive positioning\n\n\ud83d\udcca CROSS-FUNCTIONAL ANALYSIS\n- Consistency between Analytics, Performance, SEO, and Technical aspects\n- Identification of important correlations\n- Friction points in the user experience\n- Cross-channel improvement opportunities\n\n\ud83d\ude80 PRIORITIZED ACTION PLAN (90 DAYS)\n- WEEK 1-2: Critical actions (immediate impact)\n- MONTH 1: Fundamental optimizations\n- MONTHS 2-3: Development and growth\n\n\ud83d\udcb0 ROI AND MEASURABLE GOALS\n- 30/60/90-day traffic goals\n- Priority KPIs to track\n- Estimated resources/budget required\n- Expected business impact\n\n\ud83d\udd0d MONITORING AND ALERTS\n- Metrics to monitor monthly\n- Alert thresholds to configure\n- Corrective actions in case of degradation\n\nRESPONSE FORMAT:\nStructure your response with emojis, clear sections, and highly actionable recommendations. Conclude with a tracking dashboard featuring 5 main KPIs.\n\nIMPORTANT: Be precise, actionable, and tailor your recommendations to the AI/tech sector.\n",
"options": {
"systemMessage": "Tu r\u00e9ponds uniquement en fran\u00e7ais. Sois pr\u00e9cis, actionnable et orient\u00e9 r\u00e9sultats. Utilise des donn\u00e9es chiffr\u00e9es quand possible."
},
"promptType": "define"
},
"typeVersion": 2
},
{
"id": "734dd3f2-b839-45b8-816e-55537d49fa46",
"name": "Get GA History",
"type": "n8n-nodes-base.googleSheetsTool",
"position": [
-2740,
-1120
],
"parameters": {
"sheetName": {
"__rl": true,
"mode": "list",
"value": ""
},
"documentId": {
"__rl": true,
"mode": "list",
"value": ""
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "c2fc9adc-ea41-4487-b3a9-8aa8c9958363",
"name": "Get Search Console History",
"type": "n8n-nodes-base.googleSheetsTool",
"position": [
-2740,
-320
],
"parameters": {
"sheetName": {
"__rl": true,
"mode": "list",
"value": ""
},
"documentId": {
"__rl": true,
"mode": "list",
"value": ""
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "f3d33302-cd1d-40f0-9582-f0af420ad4dd",
"name": "Get PageSpeed History",
"type": "n8n-nodes-base.googleSheetsTool",
"position": [
-2740,
-720
],
"parameters": {
"sheetName": {
"__rl": true,
"mode": "list",
"value": ""
},
"documentId": {
"__rl": true,
"mode": "list",
"value": ""
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "fd76ab3f-ed79-46b9-9ff6-d5ba1d00d71b",
"name": "Get Technical Audit History",
"type": "n8n-nodes-base.googleSheetsTool",
"position": [
-2740,
180
],
"parameters": {
"sheetName": {
"__rl": true,
"mode": "list",
"value": ""
},
"documentId": {
"__rl": true,
"mode": "list",
"value": ""
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "aca46735-6331-49e9-b4e7-5a8aff96b23d",
"name": "Save Final Report to Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
-1180,
-640
],
"parameters": {
"sheetName": {
"__rl": true,
"mode": "list",
"value": ""
},
"documentId": {
"__rl": true,
"mode": "list",
"value": ""
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "0571f8a4-b8da-4025-98f5-82586847d996",
"name": "Get a report",
"type": "n8n-nodes-base.googleAnalytics",
"position": [
-3340,
-1240
],
"parameters": {
"metricsGA4": {
"metricValues": [
{}
]
},
"propertyId": {
"__rl": true,
"mode": "list",
"value": ""
},
"dimensionsGA4": {
"dimensionValues": [
{}
]
},
"additionalFields": {}
},
"credentials": {
"googleAnalyticsOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "3e1cf038-fe51-4938-a963-b44e476c8b9b",
"name": "Get row(s) in sheet in Google Sheets",
"type": "n8n-nodes-base.googleSheetsTool",
"position": [
-2620,
-720
],
"parameters": {
"sheetName": {
"__rl": true,
"mode": "list",
"value": ""
},
"documentId": {
"__rl": true,
"mode": "list",
"value": ""
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "7e0f155e-47d4-42bc-b5d9-ccd8af2fc320",
"name": "Get row(s) in sheet in Google Sheets1",
"type": "n8n-nodes-base.googleSheetsTool",
"position": [
-2620,
-320
],
"parameters": {
"sheetName": {
"__rl": true,
"mode": "list",
"value": ""
},
"documentId": {
"__rl": true,
"mode": "list",
"value": ""
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "f075de2e-af7a-49c7-8fca-4b61d2147b44",
"name": "Get row(s) in sheet in Google Sheets2",
"type": "n8n-nodes-base.googleSheetsTool",
"position": [
-2620,
180
],
"parameters": {
"sheetName": {
"__rl": true,
"mode": "list",
"value": ""
},
"documentId": {
"__rl": true,
"mode": "list",
"value": ""
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "dec783ed-8df6-440a-87b2-a114db375be0",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-4840,
-1220
],
"parameters": {
"color": 5,
"width": 1180,
"height": 920,
"content": "# \ud83d\ude80 Automated SEO Audit: Setup & Overview\n\nThis workflow performs a fully automated monthly SEO audit using a team of specialized AI agents. It gathers data from Google Analytics, Search Console, PageSpeed, and a live website crawl to generate a comprehensive report.\n\n### \u26a0\ufe0f CRITICAL SETUP REQUIRED\n\nBefore you can run this workflow, you MUST configure the following:\n\n1. **Set Target Domain**: In the `Set Target Website` node, replace the default URL with your own website's URL.\n2. **Configure Trigger**: Click the `Schedule Trigger` to set the day and time for your monthly report.\n3. **Connect Credentials**:\n * **OpenAI**: Add your API key to all `OpenAI Chat Model` nodes.\n * **Google**: Connect your Google account to all `Google Sheets`, `Google Analytics` (Get a report), and `Search Console` (HTTP Request) nodes.\n * **PageSpeed**: Create a \"Generic Credential\" for your Google API key and select it in the `Fetch PageSpeed Data` node.\n4. **Update Google Sheet ID**: In **ALL** `Google Sheets` nodes, replace the default \"Document ID\" with the ID of your own Google Sheet.\n"
},
"typeVersion": 1
},
{
"id": "f6e8b2f2-a7eb-478f-b435-f7d3d718c420",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-3640,
-1740
],
"parameters": {
"color": 4,
"width": 700,
"height": 1940,
"content": "# 1. Data Collection Phase\n\nThis is the starting point of the audit. The workflow runs four branches in parallel to gather raw data from key sources.\n\n- **Google Analytics**: Fetches overall traffic and user behavior data.\n- **Google Search Console**: Retrieves organic search performance metrics.\n- **PageSpeed Insights**: Gathers technical performance and Core Web Vitals scores.\n- **Live Website Crawl**: Scrapes the homepage for on-page SEO elements (titles, headings, etc.).\n"
},
"typeVersion": 1
},
{
"id": "1ee5c1d8-deb5-453c-96fa-1861e70f6960",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2920,
-1740
],
"parameters": {
"width": 580,
"height": 2100,
"content": "# 2. Specialist AI Analysis\n\nThis is the core intelligence of the workflow. Each data stream is processed by a dedicated AI agent with a specific area of expertise.\n\n- **Analytics Specialist**: Interprets GA4 data to find trends.\n- **Performance Specialist**: Analyzes PageSpeed scores and recommends technical fixes.\n- **SEO Specialist**: Evaluates Search Console data for organic growth opportunities.\n- **Technical Audit Agent**: Scores the on-page SEO elements from the live crawl.\n"
},
"typeVersion": 1
},
{
"id": "c2525899-4b56-4c73-8ae6-6814cce13820",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2320,
-1000
],
"parameters": {
"color": 3,
"width": 1020,
"height": 780,
"content": "# 3. Aggregation & Master Synthesis\n\nIn this phase, all four specialist reports are collected and merged.\n\nA final **Master Analyst Agent** then receives this consolidated data package. Its mission is to synthesize all the information into a single, high-level strategic summary with a prioritized, actionable roadmap for the business.\n"
},
"typeVersion": 1
},
{
"id": "b1a0957f-fe63-499d-8764-57638a26309d",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1280,
-880
],
"parameters": {
"width": 440,
"height": 500,
"content": "# 4. Final Output & Storage\n\nThis is the final step. All individual reports, as well as the final comprehensive report from the Master Analyst, are automatically saved to your designated Google Sheet.\n\nThis creates a historical archive of your monthly SEO performance, allowing you to track progress over time.\n"
},
"typeVersion": 1
}
],
"connections": {
"Merge": {
"main": [
[
{
"node": "Aggregate All Reports",
"type": "main",
"index": 0
}
]
]
},
"Append row": {
"ai_tool": [
[
{
"node": "Analytics Specialist Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Get row(s)4": {
"ai_tool": [
[
{
"node": "Master Analyst Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Get a report": {
"main": [
[
{
"node": "Format GA Data",
"type": "main",
"index": 0
}
]
]
},
"Format GA Data": {
"main": [
[
{
"node": "Analytics Specialist Agent",
"type": "main",
"index": 0
}
]
]
},
"Get GA History": {
"ai_tool": [
[
{
"node": "Analytics Specialist Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Search console": {
"main": [
[
{
"node": "Format Search Console Data",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "Set Target Website",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "Analytics Specialist Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Score On-Page SEO": {
"main": [
[
{
"node": "Technical Audit Agent",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model1": {
"ai_languageModel": [
[
{
"node": "SEO Specialist Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"OpenAI Chat Model2": {
"ai_languageModel": [
[
{
"node": "Performance Specialist Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"OpenAI Chat Model3": {
"ai_languageModel": [
[
{
"node": "Technical Audit Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"OpenAI Chat Model4": {
"ai_languageModel": [
[
{
"node": "Master Analyst Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Set Target Website": {
"main": [
[
{
"node": "Get a report",
"type": "main",
"index": 0
},
{
"node": "Fetch PageSpeed Data",
"type": "main",
"index": 0
},
{
"node": "Search console",
"type": "main",
"index": 0
},
{
"node": "Crawl Website Homepage",
"type": "main",
"index": 0
}
]
]
},
"Fetch PageSpeed Data": {
"main": [
[
{
"node": "Format PageSpeed Data",
"type": "main",
"index": 0
}
]
]
},
"Master Analyst Agent": {
"main": [
[
{
"node": "Save Final Report to Sheet",
"type": "main",
"index": 0
}
]
]
},
"SEO Specialist Agent": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 2
}
]
]
},
"Aggregate All Reports": {
"main": [
[
{
"node": "Master Analyst Agent",
"type": "main",
"index": 0
}
]
]
},
"Format PageSpeed Data": {
"main": [
[
{
"node": "Performance Specialist Agent",
"type": "main",
"index": 0
}
]
]
},
"Get PageSpeed History": {
"ai_tool": [
[
{
"node": "Performance Specialist Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Technical Audit Agent": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 3
}
]
]
},
"Crawl Website Homepage": {
"main": [
[
{
"node": "Extract On-Page SEO Data",
"type": "main",
"index": 0
}
]
]
},
"Extract On-Page SEO Data": {
"main": [
[
{
"node": "Score On-Page SEO",
"type": "main",
"index": 0
}
]
]
},
"Analytics Specialist Agent": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Format Search Console Data": {
"main": [
[
{
"node": "SEO Specialist Agent",
"type": "main",
"index": 0
}
]
]
},
"Get Search Console History": {
"ai_tool": [
[
{
"node": "SEO Specialist Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Get Technical Audit History": {
"ai_tool": [
[
{
"node": "Technical Audit Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Performance Specialist Agent": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Get row(s) in sheet in Google Sheets": {
"ai_tool": [
[
{
"node": "Performance Specialist Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Get row(s) in sheet in Google Sheets1": {
"ai_tool": [
[
{
"node": "SEO Specialist Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Get row(s) in sheet in Google Sheets2": {
"ai_tool": [
[
{
"node": "Technical Audit Agent",
"type": "ai_tool",
"index": 0
}
]
]
}
}
}
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.
googleAnalyticsOAuth2googleOAuth2ApigoogleSheetsOAuth2ApihttpQueryAuthopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow performs a comprehensive, automated monthly SEO and performance audit for any website. It uses a "team" of specialized AI agents to analyze data from multiple sources, aggregates their findings, and generates a final strategic report.
Source: https://n8n.io/workflows/6540/ — 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.
This workflow was born out of a very real problem.
Marketing, content, and enablement teams that need a quick, human-readable summary of every new video published by the YouTube channels they care about—without leaving Slack.
Template Name: AI Personal Assistant - Task & Email Management Price: $27 Category: Productivity & Automation Difficulty: Intermediate Use Case: Personal productivity automation for busy professionals
This workflow automates end-to-end ESG (Environmental, Social, and Governance) sustainability reporting for enterprise sustainability teams, compliance officers, and green governance leads. It solves
Schedules automated vendor pricing analysis across multiple sources. Fetches delivery reliability and contract data, analyzes vendor performance using Claude AI, then distributes consolidated reports