This workflow follows the HTTP Request → XML 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": "7i2RqqCYaKHUt4n3",
"name": "Google Site Index - sitemap.xml example",
"tags": [],
"nodes": [
{
"id": "4da50fbf-7707-42ea-badc-6748c4ee30db",
"name": "When clicking \"Test workflow\"",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-927,
472
],
"parameters": {},
"typeVersion": 1
},
{
"id": "9e5bd6c8-a056-462b-b746-60d86bfbe398",
"name": "Split Out",
"type": "n8n-nodes-base.splitOut",
"position": [
480,
360
],
"parameters": {
"options": {},
"fieldToSplitOut": "urlset.url"
},
"typeVersion": 1
},
{
"id": "0d4acf98-31c5-4a0d-bb29-c1d045c0705c",
"name": "Check status",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueErrorOutput",
"position": [
1540,
400
],
"parameters": {
"url": "=https://indexing.googleapis.com/v3/urlNotifications/metadata?url={{ encodeURIComponent($json.loc) }}",
"options": {
"response": {
"response": {
"fullResponse": true
}
}
},
"authentication": "predefinedCredentialType",
"nodeCredentialType": "googleOAuth2Api"
},
"credentials": {
"googleOAuth2Api": {
"name": "<your credential>"
}
},
"retryOnFail": false,
"typeVersion": 4.1
},
{
"id": "eee0eba6-3aa3-4841-9d48-8407db1212e2",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1340,
360
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "47745d33-8358-45a8-a67d-60f9f0574bae",
"name": "Wait",
"type": "n8n-nodes-base.wait",
"position": [
2080,
400
],
"parameters": {
"unit": "seconds",
"amount": "={{ Math.min(1.5,0.3+3*Math.random()).toFixed(2) }}"
},
"typeVersion": 1
},
{
"id": "9f1bf72e-8ecd-4239-b96f-b77be4c86b18",
"name": "URL Updated",
"type": "n8n-nodes-base.httpRequest",
"position": [
1840,
400
],
"parameters": {
"url": "=https://indexing.googleapis.com/v3/urlNotifications:publish",
"method": "POST",
"options": {},
"sendBody": true,
"authentication": "predefinedCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "url",
"value": "={{ $('Loop Over Items').item.json.loc }}"
},
{
"name": "type",
"value": "URL_UPDATED"
}
]
},
"nodeCredentialType": "googleOAuth2Api"
},
"credentials": {
"googleOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.1
},
{
"id": "629eaf34-ef3c-4e9c-9537-69a03310dd9c",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-927,
272
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 2,
"triggerAtMinute": 5
}
]
}
},
"typeVersion": 1.1
},
{
"id": "2f95065c-fdc9-4773-87b0-37007ae4f9a5",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-87,
192
],
"parameters": {
"width": 851.3475816949383,
"height": 340.39627039627067,
"content": "## Collect list of URLs\n\nThis part extracts all pages from all sitemaps and sorts by the last modified date `lastmod` (from newest to oldest)"
},
"typeVersion": 1
},
{
"id": "33798da1-4fd3-43dc-9ff4-753bae798535",
"name": "is new?",
"type": "n8n-nodes-base.if",
"position": [
1700,
280
],
"parameters": {
"options": {
"looseTypeValidation": true
},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "c8566fc4-57cf-4272-841e-014bb354a37d",
"operator": {
"type": "dateTime",
"operation": "after"
},
"leftValue": "={{ $('Loop Over Items').item.json.lastmod }}",
"rightValue": "={{ $json.body.latestUpdate.notifyTime }}"
}
]
}
},
"typeVersion": 2
},
{
"id": "b5d538ec-d7bc-40ac-9b9e-e5ead9378387",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1500,
121.07782938758908
],
"parameters": {
"width": 504.2424242424241,
"height": 431.1089918072487,
"content": "## Check URL metadata and update, if:\n* Google returns error (404 error means that this URL was not previously added)\n* Date of article update is after the date of last request to re-index"
},
"typeVersion": 1
},
{
"id": "2cc0b088-b09f-4dc2-8027-9e0ff442576b",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-640,
196.4335593220339
],
"parameters": {
"width": 515.8058994999984,
"height": 335.72259887005646,
"content": "## Get sitemap.xml\nVarious CMS systems often have multiple sitemaps for different content (posts, tags, pages etc). Need to fetch all sitemaps first and then extract all pages from all sitemaps.\n### Remember to update the real sitemap URL!"
},
"typeVersion": 1
},
{
"id": "d8dc3b65-0d47-49a7-9042-33dbc5a2e245",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-662.5490981963931,
120.2098305084748
],
"parameters": {
"color": 6,
"width": 1458.468937875752,
"height": 453.3292476478371,
"content": "## Feel free to adapt this part depending on your website CMS\n"
},
"typeVersion": 1
},
{
"id": "a763f582-500c-4cc8-b780-672ebc3d0845",
"name": "Get content-specific sitemaps",
"type": "n8n-nodes-base.splitOut",
"position": [
-260,
360
],
"parameters": {
"options": {},
"fieldToSplitOut": "sitemapindex.sitemap"
},
"typeVersion": 1
},
{
"id": "e7aa9728-eb9b-454d-a710-561d76841d7a",
"name": "Convert sitemap to JSON",
"type": "n8n-nodes-base.xml",
"position": [
-440,
360
],
"parameters": {
"options": {}
},
"typeVersion": 1
},
{
"id": "496366d7-0d4e-401c-a375-8ca8882e8a32",
"name": "Force urlset.url to array",
"type": "n8n-nodes-base.set",
"position": [
320,
360
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "8d16114b-1d1a-4522-a550-6c799a44538a",
"name": "=urlset.url",
"type": "array",
"value": "={{ $json.urlset.url[0] ? $json.urlset.url : [$json.urlset.url] }}"
}
]
}
},
"typeVersion": 3.3
},
{
"id": "3a8e00a6-2fa4-4903-943d-890e0078181e",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
820,
120
],
"parameters": {
"color": 3,
"width": 459.2224448897797,
"height": 451.39712985292624,
"content": "## Update the `lastmod` and `loc` fields\nThese are pre-defined fields according to [the XML schema for the Sitemap protocol](https://www.sitemaps.org/protocol.html).\n\nIf your CMS system has different field names, please rename them here:\n* the last modified field `lastmod`\n* URL of the page in `loc` field"
},
"typeVersion": 1
},
{
"id": "9d841026-ede6-4396-a67b-e1787ffe9a17",
"name": "Assign mandatiry sitemap fields",
"type": "n8n-nodes-base.set",
"position": [
1000,
360
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "bb0e1337-6fda-4a22-9963-d0b1271fc2a6",
"name": "lastmod",
"type": "string",
"value": "={{ $json.lastmod }}"
},
{
"id": "e7517c23-f989-4d75-9078-d82c75e51c65",
"name": "loc",
"type": "string",
"value": "={{ $json.loc }}"
}
]
}
},
"typeVersion": 3.3
},
{
"id": "99787654-f554-4650-afc0-c4fa65392c2b",
"name": "convert page data to JSON",
"type": "n8n-nodes-base.xml",
"position": [
120,
360
],
"parameters": {
"options": {
"explicitArray": false
}
},
"typeVersion": 1
},
{
"id": "f5cc1725-955c-4eb2-a66f-93153ebf35d1",
"name": "Get sitemap.xml",
"type": "n8n-nodes-base.httpRequest",
"position": [
-620,
360
],
"parameters": {
"url": "https://wordpress.org/sitemap.xml",
"options": {}
},
"typeVersion": 4.1
},
{
"id": "789076f0-4aa1-469b-afac-af717c0b03c3",
"name": "Get content of each sitemap",
"type": "n8n-nodes-base.httpRequest",
"position": [
-60,
360
],
"parameters": {
"url": "={{ $json.loc }}",
"options": {
"batching": {
"batch": {
"batchSize": 1,
"batchInterval": 150
}
}
}
},
"typeVersion": 4.1
},
{
"id": "b0bdc6d6-1306-4c0c-bec2-7e59d587db69",
"name": "Sort",
"type": "n8n-nodes-base.sort",
"position": [
640,
360
],
"parameters": {
"options": {},
"sortFieldsUi": {
"sortField": [
{
"order": "descending",
"fieldName": "lastmod"
}
]
}
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"callerPolicy": "workflowsFromSameOwner",
"errorWorkflow": "6",
"executionOrder": "v1",
"saveManualExecutions": true,
"saveDataSuccessExecution": "all"
},
"versionId": "5c21ebb6-67df-4bde-9aea-6cc9a7621fc0",
"connections": {
"Sort": {
"main": [
[
{
"node": "Assign mandatiry sitemap fields",
"type": "main",
"index": 0
}
]
]
},
"Wait": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"is new?": {
"main": [
[
{
"node": "URL Updated",
"type": "main",
"index": 0
}
],
[
{
"node": "Wait",
"type": "main",
"index": 0
}
]
]
},
"Split Out": {
"main": [
[
{
"node": "Sort",
"type": "main",
"index": 0
}
]
]
},
"URL Updated": {
"main": [
[
{
"node": "Wait",
"type": "main",
"index": 0
}
]
]
},
"Check status": {
"main": [
[
{
"node": "is new?",
"type": "main",
"index": 0
}
],
[
{
"node": "URL Updated",
"type": "main",
"index": 0
}
]
]
},
"Get sitemap.xml": {
"main": [
[
{
"node": "Convert sitemap to JSON",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[],
[
{
"node": "Check status",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "Get sitemap.xml",
"type": "main",
"index": 0
}
]
]
},
"Convert sitemap to JSON": {
"main": [
[
{
"node": "Get content-specific sitemaps",
"type": "main",
"index": 0
}
]
]
},
"Force urlset.url to array": {
"main": [
[
{
"node": "Split Out",
"type": "main",
"index": 0
}
]
]
},
"convert page data to JSON": {
"main": [
[
{
"node": "Force urlset.url to array",
"type": "main",
"index": 0
}
]
]
},
"Get content of each sitemap": {
"main": [
[
{
"node": "convert page data to JSON",
"type": "main",
"index": 0
}
]
]
},
"Get content-specific sitemaps": {
"main": [
[
{
"node": "Get content of each sitemap",
"type": "main",
"index": 0
}
]
]
},
"When clicking \"Test workflow\"": {
"main": [
[
{
"node": "Get sitemap.xml",
"type": "main",
"index": 0
}
]
]
},
"Assign mandatiry sitemap fields": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"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.
googleOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
How this works
This workflow automates the generation and submission of a sitemap.xml file to Google Search Console, ensuring your website's pages are efficiently indexed for better search visibility and traffic. It's ideal for website owners, SEO specialists, or developers managing dynamic sites who need to keep Google updated without manual effort. The key step involves using the HTTP Request node to fetch your site's URLs, process them into XML format, and submit the sitemap directly, streamlining what could otherwise be a time-consuming task.
Use this workflow for event-driven updates, such as after publishing new content on a blog or e-commerce site, to trigger immediate indexing requests. Avoid it for static sites with infrequent changes, where manual submission suffices, or if your site exceeds Google's sitemap limits, requiring custom scaling. Common variations include adding a schedule trigger for periodic resubmissions or integrating with CMS like WordPress to pull URLs automatically.
About this workflow
Google Site Index - sitemap.xml example. Uses manualTrigger, splitOut, httpRequest, splitInBatches. Event-driven trigger; 21 nodes.
Source: https://github.com/Zie619/n8n-workflows — 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.
Read sitemap and filter URLs. Uses manualTrigger, splitOut, httpRequest, xml. Event-driven trigger; 10 nodes.
Splitout Filter. Uses manualTrigger, outputParserStructured, lmChatOpenRouter, informationExtractor. Event-driven trigger; 51 nodes.
Workflow Importer. Uses extractFromFile, executeCommand, readWriteFile, httpRequest. Event-driven trigger; 58 nodes.
Retrieves workflows directly from an n8n instance using the n8n API Dynamically generates a form to select which workflows to import Supports both fixed instance configuration and dynamic source/targe
[2/3] Set up medoids (2 types) for anomaly detection (crops dataset). Uses manualTrigger, httpRequest, splitOut, stickyNote. Event-driven trigger; 48 nodes.