This workflow corresponds to n8n.io template #6730 — we link there as the canonical source.
This workflow follows the Google Sheets → HTTP Request 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 →
{
"id": "advanced_seo_core_web_vitals_chatbot_automation_suite",
"name": "Advanced SEO, Core Web Vitals & Chatbot Automation Suite",
"nodes": [
{
"id": "node1",
"name": "Start",
"type": "n8n-nodes-base.start",
"parameters": {},
"typeVersion": 1
},
{
"id": "node2",
"name": "Scheduled SEO & Core Web Vitals Audit",
"type": "n8n-nodes-base.cron",
"parameters": {
"mode": "everyHour",
"unit": "hours",
"value": "4",
"options": {}
},
"description": "Triggers comprehensive SEO and Core Web Vitals check every 4 hours",
"typeVersion": 1
},
{
"id": "node3",
"name": "Chatbot Webhook Listener",
"type": "n8n-nodes-base.webhook",
"parameters": {
"path": "chatbot-query",
"options": {},
"webhookId": "seo_chatbot_listener",
"httpMethod": "POST"
},
"description": "Receives user queries from external chatbot platforms",
"typeVersion": 1
},
{
"id": "node4",
"name": "Monitored Websites List",
"type": "n8n-nodes-base.set",
"parameters": {
"values": [
{
"url": "https://www.yourmainwebsite.com",
"name": "Main Site"
},
{
"url": "https://blog.yourwebsite.com",
"name": "Blog Site"
}
]
},
"description": "List of websites to monitor for SEO and performance",
"typeVersion": 1
},
{
"id": "node5",
"name": "HTTP Crawler",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"url": "={{ $json.url }}",
"options": {
"redirects": true,
"fullResponse": true,
"responseFormat": "array"
},
"authentication": "none"
},
"description": "Fetches raw HTML content for parsing",
"typeVersion": 1
},
{
"id": "node6",
"name": "Cheerio HTML Parser (On-Page SEO)",
"type": "n8n-nodes-base.cheerio",
"parameters": {
"extract": [
{
"type": "attribute",
"property": "title",
"selector": "title"
},
{
"type": "attribute",
"property": "meta_description",
"selector": "meta[name=\"description\"]",
"attribute": "content"
},
{
"type": "text",
"property": "h1_tags",
"selector": "h1",
"returnAll": true
},
{
"type": "text",
"property": "h2_tags",
"selector": "h2",
"returnAll": true
},
{
"type": "attribute",
"property": "all_links",
"selector": "a",
"attribute": "href",
"returnAll": true
},
{
"type": "attribute",
"property": "img_alt_tags",
"selector": "img",
"attribute": "alt",
"returnAll": true
},
{
"type": "attribute",
"property": "canonical_tag",
"selector": "link[rel=\"canonical\"]",
"attribute": "href"
},
{
"type": "attribute",
"property": "robots_meta",
"selector": "meta[name=\"robots\"]",
"attribute": "content"
},
{
"type": "text",
"property": "schema_json_ld",
"selector": "script[type=\"application/ld+json\"]",
"returnAll": true
}
],
"dataSelector": "body"
},
"description": "Extracts critical on-page SEO elements from HTML",
"typeVersion": 1
},
{
"id": "node7",
"name": "On-Page SEO Validator",
"type": "n8n-nodes-base.function",
"parameters": {
"options": {},
"functionType": "js",
"functionScript": "const data = items[0].json;\n\nconst onPageIssues = {\n missing_title: !data.title || data.title.trim() === '',\n title_too_short: data.title && data.title.length < 10,\n title_too_long: data.title && data.title.length > 60,\n missing_meta_description: !data.meta_description || data.meta_description.trim() === '',\n meta_description_too_short: data.meta_description && data.meta_description.length < 50,\n meta_description_too_long: data.meta_description && data.meta_description.length > 160,\n multiple_h1: data.h1_tags && data.h1_tags.length > 1,\n missing_h1: !data.h1_tags || data.h1_tags.length === 0,\n missing_alt_text_count: data.img_alt_tags ? data.img_alt_tags.filter(alt => !alt || alt.trim() === '').length : 0,\n missing_canonical: !data.canonical_tag || data.canonical_tag.trim() === '',\n noindex_present: data.robots_meta && data.robots_meta.includes('noindex'),\n schema_present: data.schema_json_ld && data.schema_json_ld.length > 0\n};\n\nreturn [{ json: { ...data, onPageIssues: onPageIssues } }];"
},
"description": "Checks for common on-page SEO issues",
"typeVersion": 1
},
{
"id": "node8",
"name": "Fetch Robots.txt",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"url": "={{ new URL('/robots.txt', $json.url).href }}",
"options": {
"responseFormat": "string"
},
"authentication": "none"
},
"description": "Fetches the robots.txt file for analysis",
"typeVersion": 1
},
{
"id": "node9",
"name": "Check Sitemap.xml Presence",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"url": "={{ new URL('/sitemap.xml', $json.url).href }}",
"options": {},
"authentication": "none"
},
"description": "Checks if sitemap.xml exists (will fail if 404)",
"typeVersion": 1
},
{
"id": "node10",
"name": "Technical SEO Validator",
"type": "n8n-nodes-base.function",
"parameters": {
"options": {},
"functionType": "js",
"functionScript": "const url = new URL(items[0].json.url);\nconst isHttps = url.protocol === 'https:';\n\nlet robotsTxtContent = null;\ntry {\n robotsTxtContent = items[1].json.data;\n} catch (error) {\n // robots.txt might not exist or be reachable\n robotsTxtContent = 'Not Found or Error';\n}\n\nlet sitemapPresent = false;\ntry {\n if (items[2].json.statusCode === 200) {\n sitemapPresent = true;\n }\n} catch (error) {\n // sitemap.xml might not exist or be reachable\n sitemapPresent = false;\n}\n\nconst technicalIssues = {\n is_https: isHttps,\n robots_txt_content: robotsTxtContent,\n sitemap_xml_present: sitemapPresent,\n broken_links_check_needed: true // Placeholder for a dedicated broken link checker\n};\n\nreturn [{ json: { ...items[0].json, technicalIssues: technicalIssues } }];"
},
"description": "Validates HTTPS, robots.txt presence/content, and sitemap.xml",
"typeVersion": 1
},
{
"id": "node11",
"name": "AI SEO Audit & Recommendations",
"type": "n8n-nodes-base.openAi",
"parameters": {
"model": "gpt-4o",
"prompt": "Analyze the following web page's SEO elements and technical findings. Provide a summary of issues and actionable recommendations. Focus on missing critical elements, length issues, duplicate content potential (if canonical is missing), and impact of technical issues.\n\nURL: '{{ $json.url }}'\nOn-Page Issues: {{ JSON.stringify($json.onPageIssues) }}\nTechnical Issues: {{ JSON.stringify($json.technicalIssues) }}\n\nContent Sample: '{{ $node[\"HTTP Crawler\"].json[\"data\"].substring(0, 1000) }}'\n\nAlso, provide suggestions for better alt text for images that are missing it, if possible from the content context.",
"options": {
"maxTokens": 1500,
"temperature": 0.7
}
},
"description": "Uses AI to deeply analyze combined SEO data and provide smart recommendations",
"typeVersion": 1
},
{
"id": "node12",
"name": "Google PageSpeed Insights API",
"type": "n8n-nodes-base.googlePageSpeedInsights",
"parameters": {
"url": "={{ $json.url }}",
"options": {
"category": [
"performance",
"seo",
"best-practices",
"accessibility"
]
},
"resource": "pagespeed",
"strategy": "desktop",
"operation": "run",
"authentication": "googleApi"
},
"description": "Fetches Core Web Vitals (LCP, INP, CLS) and other performance/SEO metrics",
"typeVersion": 1
},
{
"id": "node13",
"name": "Save Comprehensive SEO Report to Google Sheet",
"type": "n8n-nodes-base.googleSheets",
"parameters": {
"data": "={{ JSON.stringify({ URL: $json.url, Date: new Date().toISOString().split('T')[0], TitleOK: !$json.onPageIssues.missing_title && !$json.onPageIssues.title_too_short && !$json.onPageIssues.title_too_long, DescOK: !$json.onPageIssues.missing_meta_description && !$json.onPageIssues.meta_description_too_short && !$json.onPageIssues.meta_description_too_long, HasH1: !$json.onPageIssues.missing_h1, MultipleH1: $json.onPageIssues.multiple_h1, MissingAltTextCount: $json.onPageIssues.missing_alt_text_count, CanonicalPresent: !$json.onPageIssues.missing_canonical, NoindexPresent: $json.onPageIssues.noindex_present, SchemaPresent: $json.onPageIssues.schema_present, IsHTTPS: $json.technicalIssues.is_https, SitemapPresent: $json.technicalIssues.sitemap_xml_present, LCP: $node[\"Google PageSpeed Insights API\"].json[\"lighthouseResult\"].audits[\"largest-contentful-paint\"].numericValue, INP: $node[\"Google PageSpeed Insights API\"].json[\"lighthouseResult\"].audits[\"interaction-to-next-paint\"].numericValue, AIRecommendations: $node[\"AI SEO Audit & Recommendations\"].json[\"choices\"][0].message.content }) }}",
"operation": "append",
"sheetName": "Comprehensive SEO Reports",
"spreadsheetId": "YOUR_GOOGLE_SHEET_ID",
"authentication": "googleOAuth2Api",
"valueInputOption": "USER_ENTERED"
},
"description": "Logs detailed on-page, technical, and Core Web Vitals data to a Google Sheet",
"typeVersion": 1
},
{
"id": "node14",
"name": "Overall SEO Health Check (Alert Trigger)",
"type": "n8n-nodes-base.if",
"parameters": {
"combineAll": "false",
"conditions": {
"string": [
{
"value1": "={{ $json.onPageIssues.missing_title || $json.onPageIssues.title_too_short || $json.onPageIssues.title_too_long || $json.onPageIssues.missing_meta_description || $json.onPageIssues.meta_description_too_short || $json.onPageIssues.meta_description_too_long || $json.onPageIssues.multiple_h1 || $json.onPageIssues.missing_h1 || $json.onPageIssues.missing_alt_text_count > 0 || $json.onPageIssues.missing_canonical || $json.onPageIssues.noindex_present || !$json.technicalIssues.is_https || !$json.technicalIssues.sitemap_xml_present }}",
"value2": "true",
"operation": "boolean"
},
{
"value1": "={{ $node[\"Google PageSpeed Insights API\"].json[\"lighthouseResult\"].audits[\"largest-contentful-paint\"].numericValue }}",
"value2": "2500",
"operation": "greater"
},
{
"value1": "={{ $node[\"Google PageSpeed Insights API\"].json[\"lighthouseResult\"].audits[\"interaction-to-next-paint\"].numericValue }}",
"value2": "200",
"operation": "greater"
}
]
}
},
"description": "Triggers alert if any critical SEO or CWV issue is found",
"typeVersion": 1
},
{
"id": "node15",
"name": "Send Comprehensive SEO Audit Alert (Slack)",
"type": "n8n-nodes-base.slack",
"parameters": {
"text": "\ud83d\udea8 *Comprehensive SEO Audit Alert for {{ $json.url }}* \ud83d\udea8\n\n*On-Page SEO Issues:*\n- Missing Title: {{ $json.onPageIssues.missing_title ? 'Yes' : 'No' }}\n- Title Length OK: {{ !($json.onPageIssues.title_too_short || $json.onPageIssues.title_too_long) ? 'Yes' : 'No' }}\n- Missing Meta Description: {{ $json.onPageIssues.missing_meta_description ? 'Yes' : 'No' }}\n- Meta Description Length OK: {{ !($json.onPageIssues.meta_description_too_short || $json.onPageIssues.meta_description_too_long) ? 'Yes' : 'No' }}\n- Multiple H1s: {{ $json.onPageIssues.multiple_h1 ? 'Yes' : 'No' }}\n- Missing H1: {{ $json.onPageIssues.missing_h1 ? 'Yes' : 'No' }}\n- Missing Alt Text Count: {{ $json.onPageIssues.missing_alt_text_count }}\n- Missing Canonical: {{ $json.onPageIssues.missing_canonical ? 'Yes' : 'No' }}\n- Noindex Present: {{ $json.onPageIssues.noindex_present ? 'Yes' : 'No' }}\n- Schema Present: {{ $json.onPageIssues.schema_present ? 'Yes' : 'No' }}\n\n*Technical SEO Issues:*\n- Is HTTPS: {{ $json.technicalIssues.is_https ? 'Yes' : 'No' }}\n- Sitemap.xml Present: {{ $json.technicalIssues.sitemap_xml_present ? 'Yes' : 'No' }}\n- Robots.txt Content:\n```\n{{ $json.technicalIssues.robots_txt_content.substring(0, 200) }}...\n```\n\n*Core Web Vitals:*\n- *LCP:* {{ $node[\"Google PageSpeed Insights API\"].json[\"lighthouseResult\"].audits[\"largest-contentful-paint\"].numericValue }} ms (Good: < 2.5s)\n- *INP:* {{ $node[\"Google PageSpeed Insights API\"].json[\"lighthouseResult\"].audits[\"interaction-to-next-paint\"].numericValue }} ms (Good: < 200ms)\n\n*AI Recommendations:*\n```\n{{ $node[\"AI SEO Audit & Recommendations\"].json[\"choices\"][0].message.content.substring(0, 1000) }}...\n```\n\n_Full report saved to Google Sheet._",
"options": {},
"webhookUrl": "YOUR_SLACK_WEBHOOK_URL"
},
"description": "Sends detailed audit findings and AI recommendations to Slack",
"typeVersion": 1
},
{
"id": "node16",
"name": "AI Chatbot NLP & Response",
"type": "n8n-nodes-base.openAi",
"parameters": {
"model": "gpt-4o",
"prompt": "The user asked: '{{ $json.body.query }}'. Analyze their query about SEO or website performance (LCP/INP) and provide a relevant, concise, and actionable response. Focus on identifying specific entities like 'website URL', 'keyword', 'SEO topic', or 'technical issue'. Based on the query, provide explanations, best practices, or troubleshooting steps.\n\nExample intents:\n- 'Check SEO for [URL]'\n- 'Explain LCP/INP'\n- 'How to fix missing titles?'\n- 'What's wrong with my robots.txt?'\n\nIf the query requires data retrieval, state that you are fetching the data and then provide a summary. If the query is general, provide a general SEO/performance tip. Be helpful and professional.",
"options": {
"maxTokens": 300,
"temperature": 0.7
}
},
"description": "Processes chatbot query, understands intent, and generates intelligent response",
"typeVersion": 1
},
{
"id": "node17",
"name": "Extract Chatbot Entities & Intent",
"type": "n8n-nodes-base.function",
"parameters": {
"options": {},
"functionType": "js",
"functionScript": "const userQuery = items[0].json.body.query.toLowerCase();\nconst entities = {};\n\n// URL extraction\nconst urlMatch = userQuery.match(/https?://[^\\s]+/);\nif (urlMatch) entities.url = urlMatch[0];\n\n// Keyword extraction\nconst keywordMatch = userQuery.match(/keyword\\s['\"]?([\\w\\s]+)['\"]?/);\nif (keywordMatch) entities.keyword = keywordMatch[1].trim();\n\n// Specific SEO terms\nif (userQuery.includes('title')) entities.seo_topic = 'title';\nif (userQuery.includes('description')) entities.seo_topic = 'meta_description';\nif (userQuery.includes('h1')) entities.seo_topic = 'h1';\nif (userQuery.includes('alt text')) entities.seo_topic = 'alt_text';\nif (userQuery.includes('canonical')) entities.seo_topic = 'canonical';\nif (userQuery.includes('noindex')) entities.seo_topic = 'noindex';\nif (userQuery.includes('schema')) entities.seo_topic = 'schema';\n\n// Technical SEO terms\nif (userQuery.includes('robots.txt')) entities.technical_topic = 'robots.txt';\nif (userQuery.includes('sitemap')) entities.technical_topic = 'sitemap.xml';\nif (userQuery.includes('https') || userQuery.includes('ssl')) entities.technical_topic = 'https';\n\n// Performance terms\nif (userQuery.includes('lcp')) entities.performance_metric = 'lcp';\nif (userQuery.includes('inp')) entities.performance_metric = 'inp';\nif (userQuery.includes('core web vitals')) entities.performance_metric = 'core_web_vitals';\n\n// If a URL is explicitly mentioned and the query asks for audit, trigger full audit\nif (entities.url && (userQuery.includes('audit') || userQuery.includes('check seo')))\n entities.trigger_full_audit = true;\n\nreturn [{ json: { ...items[0].json, entities: entities } }];"
},
"description": "Extracts key information and intent from chatbot queries",
"typeVersion": 1
},
{
"id": "node18",
"name": "Google Search Console API - Query Data (Chatbot)",
"type": "n8n-nodes-base.googleSearchConsole",
"parameters": {
"options": {
"filter": "query=='{{ $json.entities.keyword || \"\" }}'",
"endDate": "={{ new Date().toISOString().split('T')[0] }}",
"rowLimit": 10,
"startDate": "={{ $json.entities.startDate || \"2024-01-01\" }}",
"dimensions": [
"query"
]
},
"siteUrl": "={{ $json.entities.url || 'https://www.yourmainwebsite.com' }}",
"resource": "searchConsole",
"operation": "get",
"authentication": "googleApi"
},
"description": "Fetches keyword performance data for chatbot queries",
"typeVersion": 1
},
{
"id": "node19",
"name": "Respond to Chatbot Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"parameters": {
"mode": "json",
"options": {},
"jsonBody": "={{ JSON.stringify({ response: $node[\"AI Chatbot NLP & Response\"].json[\"choices\"][0].message.content }) }}",
"webhookRespond": true
},
"description": "Sends the AI-generated response back to the chatbot platform",
"typeVersion": 1
},
{
"id": "node20",
"name": "Re-Crawl for Chatbot Audit",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"url": "={{ $json.url }}",
"options": {
"redirects": true,
"fullResponse": true,
"responseFormat": "array"
},
"authentication": "none"
},
"description": "Performs an on-demand crawl if requested by chatbot",
"typeVersion": 1
},
{
"id": "node21",
"name": "Execute SEO Audit Workflow (Chatbot Trigger)",
"type": "n8n-nodes-base.executeWorkflow",
"parameters": {
"node": "AI SEO Audit & Recommendations",
"workflowId": "advanced_seo_core_web_vitals_chatbot_automation_suite"
},
"description": "Triggers the main SEO audit workflow from chatbot request",
"typeVersion": 1
},
{
"id": "node22",
"name": "If Chatbot Requests Full Audit",
"type": "n8n-nodes-base.if",
"parameters": {
"combineAll": "true",
"conditions": {
"string": [
{
"value1": "={{ $json.entities.trigger_full_audit }}",
"value2": "true",
"operation": "boolean"
}
]
}
},
"description": "Checks if the chatbot query explicitly asks for a full SEO audit",
"typeVersion": 1
}
],
"active": false,
"version": 1,
"settings": {
"executionTimeout": 3600000
},
"connections": {
"node1": {
"main": [
[
{
"node": "Scheduled SEO & Core Web Vitals Audit",
"type": "main",
"index": 0
},
{
"node": "Chatbot Webhook Listener",
"type": "main",
"index": 0
}
]
]
},
"node2": {
"main": [
[
{
"node": "Monitored Websites List",
"type": "main",
"index": 0
}
]
]
},
"node3": {
"main": [
[
{
"node": "Extract Chatbot Entities & Intent",
"type": "main",
"index": 0
}
]
]
},
"node4": {
"main": [
[
{
"node": "HTTP Crawler",
"type": "main",
"index": 0
},
{
"node": "Google PageSpeed Insights API",
"type": "main",
"index": 0
}
]
]
},
"node5": {
"main": [
[
{
"node": "Cheerio HTML Parser (On-Page SEO)",
"type": "main",
"index": 0
}
]
]
},
"node6": {
"main": [
[
{
"node": "On-Page SEO Validator",
"type": "main",
"index": 0
}
]
]
},
"node7": {
"main": [
[
{
"node": "Technical SEO Validator",
"type": "main",
"index": 0
}
]
]
},
"node8": {
"main": [
[
{
"node": "Technical SEO Validator",
"type": "main",
"index": 1
}
]
]
},
"node9": {
"main": [
[
{
"node": "Technical SEO Validator",
"type": "main",
"index": 2
}
]
]
},
"node10": {
"main": [
[
{
"node": "AI SEO Audit & Recommendations",
"type": "main",
"index": 0
}
]
]
},
"node11": {
"main": [
[
{
"node": "Save Comprehensive SEO Report to Google Sheet",
"type": "main",
"index": 0
},
{
"node": "Overall SEO Health Check (Alert Trigger)",
"type": "main",
"index": 0
}
]
]
},
"node12": {
"main": [
[
{
"node": "Save Comprehensive SEO Report to Google Sheet",
"type": "main",
"index": 1
},
{
"node": "Overall SEO Health Check (Alert Trigger)",
"type": "main",
"index": 1
}
]
]
},
"node13": {
"main": [
[
{
"node": "Send Comprehensive SEO Audit Alert (Slack)",
"type": "main",
"index": 0
}
]
]
},
"node14": {
"main": [
[
{
"node": "Send Comprehensive SEO Audit Alert (Slack)",
"type": "main",
"index": 0
}
]
]
},
"node16": {
"main": [
[
{
"node": "Respond to Chatbot Webhook",
"type": "main",
"index": 0
}
]
]
},
"node17": {
"main": [
[
{
"node": "If Chatbot Requests Full Audit",
"type": "main",
"index": 0
},
{
"node": "AI Chatbot NLP & Response",
"type": "main",
"index": 0
},
{
"node": "Google Search Console API - Query Data (Chatbot)",
"type": "main",
"index": 0
}
]
]
},
"node18": {
"main": [
[
{
"node": "AI Chatbot NLP & Response",
"type": "main",
"index": 1
}
]
]
},
"node20": {
"main": [
[
{
"node": "Cheerio HTML Parser (On-Page SEO)",
"type": "main",
"index": 0
}
]
]
},
"node22": {
"main": [
[
{
"node": "Execute SEO Audit Workflow (Chatbot Trigger)",
"type": "main",
"index": 0
}
],
[
{
"node": "AI Chatbot NLP & Response",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Unleash the full potential of your website's search engine performance and user experience with this all-in-one n8n automation template. Designed for SEO professionals and webmasters, this suite provides meticulous on-page and technical SEO auditing, deep insights into Core Web…
Source: https://n8n.io/workflows/6730/ — 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.
An automated n8n workflow that analyzes stocks using RSI and MACD, summarizes insights with OpenAI, and sends a Slack-ready market update every hour.
Hourly Email Summary: This agent scans your inbox every 4 hour and summarizes new emails into a clean, actionable Slack message. Powered by GPT-4, it classifies emails by Urgency (High, Medium, Low) a
WooriFisa 최종. Uses memoryMongoDbChat, agent, httpRequest, documentDefaultDataLoader. Scheduled trigger; 68 nodes.
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.
Imagine a dedicated financial expert tirelessly working behind the scenes, sifting through every transaction, every investment move, and every accounting entry. That's exactly what this automated syst