This workflow corresponds to n8n.io template #13127 — 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": "JkXVmpdItAhJZ6Dsal8Xt",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Google Sheets to Worpress",
"tags": [],
"nodes": [
{
"id": "a28c26ce-d4f3-43fb-96a1-7ab314a5c73a",
"name": "When clicking \u2018Execute workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-1296,
0
],
"parameters": {},
"typeVersion": 1
},
{
"id": "32a0c862-877d-4ff3-8c2d-d123ee3520ed",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-320,
0
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "88f6b20d-8551-4eec-9535-ef6ef5769f2f",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-880,
-160
],
"parameters": {
"color": 7,
"width": 246,
"height": 144,
"content": "## Fetch READY rows\n\nLoads rows where status is READY from the Google Sheet."
},
"typeVersion": 1
},
{
"id": "a029d6e6-febc-4933-86ad-b5dec4185413",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-320,
-112
],
"parameters": {
"color": 7,
"width": 2464,
"height": 96,
"content": "## Process rows\n\nLoops through selected rows and publishes them one by one."
},
"typeVersion": 1
},
{
"id": "47dce6f1-e002-44db-9ee9-0a47fe1abc7c",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-112,
48
],
"parameters": {
"color": 7,
"width": 560,
"height": 96,
"content": "## Optional featured image\n\nIf image_url exists: download \u2192 upload to WP Media \u2192 use as featured image."
},
"typeVersion": 1
},
{
"id": "bead93d3-9b9e-4dad-b413-e3ccd8b3a32b",
"name": "If ($image)",
"type": "n8n-nodes-base.if",
"position": [
-112,
160
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "7edc78ca-282b-4e1a-9586-5bcfe85d01de",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.image_url }}",
"rightValue": ""
}
]
},
"looseTypeValidation": true
},
"typeVersion": 2.3
},
{
"id": "5105b660-c165-4f42-8c26-1017401645a5",
"name": "Load $image as binary",
"type": "n8n-nodes-base.httpRequest",
"position": [
112,
160
],
"parameters": {
"url": "={{ $json.image_url }}",
"options": {}
},
"typeVersion": 4.3,
"alwaysOutputData": true
},
{
"id": "c549d894-d53f-41d6-9a88-55c973e0d78f",
"name": "Upload $image to WP",
"type": "n8n-nodes-base.httpRequest",
"position": [
320,
160
],
"parameters": {
"url": "={{ $node[\"Variables\"].json.website_URL + \"/wp-json/wp/v2/media\" }}",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "binaryData",
"sendHeaders": true,
"authentication": "genericCredentialType",
"genericAuthType": "httpBasicAuth",
"headerParameters": {
"parameters": [
{
"name": "Content-Disposition",
"value": "=attachment; filename=\"post-{{ $json.id }}.png\""
},
{
"name": "Content-Type",
"value": "image/png"
}
]
},
"inputDataFieldName": "data"
},
"credentials": {
"httpBasicAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.3
},
{
"id": "ec070ef4-9c29-4515-8eae-fa7548212015",
"name": "Get tag_id from WP",
"type": "n8n-nodes-base.httpRequest",
"position": [
1376,
432
],
"parameters": {
"url": "={{ $node[\"Variables\"].json.website_URL + \"/wp-json/wp/v2/tags?slug=\" + $json.tags_to_process.tag_slug + \"&per_page=100\" }}",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpBasicAuth"
},
"credentials": {
"httpBasicAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.3,
"alwaysOutputData": true
},
{
"id": "5829d9fe-b566-43d5-8ffb-f22ec328c141",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
592,
208
],
"parameters": {
"color": 7,
"width": 1552,
"height": 96,
"content": "## Tags from hashtags\n\nParse hashtags \u2192 get/create WP tags \u2192 collect tag IDs for the post."
},
"typeVersion": 1
},
{
"id": "035ca5a6-71e6-4113-bf77-d0861cbf7cc6",
"name": "HTTP Request",
"type": "n8n-nodes-base.httpRequest",
"position": [
2368,
0
],
"parameters": {
"url": "={{ $node[\"Variables\"].json.website_URL + \"/wp-json/wp/v2/posts\" }}",
"method": "POST",
"options": {},
"jsonBody": "={{ $json.wp_post_payload }}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpBasicAuth",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"credentials": {
"httpBasicAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.3
},
{
"id": "c86a5481-e8a8-410d-9291-c34b605c7e8a",
"name": "Update row in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
2576,
0
],
"parameters": {
"columns": {
"value": {
"id": "={{ $('Prepare data').item.json.id }}",
"status": "POSTED",
"post_url": "={{ $json.link }}",
"posted_at": "={{ $json.date }}"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "id",
"defaultMatch": true,
"canBeUsedToMatch": true
},
{
"id": "status",
"type": "string",
"display": true,
"required": false,
"displayName": "status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "title",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "excerpt",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "excerpt",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "body",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "body",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "image_url",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "image_url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "hashtags",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "hashtags",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "posted_at",
"type": "string",
"display": true,
"required": false,
"displayName": "posted_at",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "post_url",
"type": "string",
"display": true,
"required": false,
"displayName": "post_url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "error_message",
"type": "string",
"display": true,
"required": false,
"displayName": "error_message",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "number",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Wk0EVMr3ubq7piMMnMcqk58yMU5akCgj9sPzbL2zL6k/edit#gid=0",
"cachedResultName": "WP Posts"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1Wk0EVMr3ubq7piMMnMcqk58yMU5akCgj9sPzbL2zL6k",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Wk0EVMr3ubq7piMMnMcqk58yMU5akCgj9sPzbL2zL6k/edit?usp=drivesdk",
"cachedResultName": "Google Sheets to WP"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "0dc91e87-7026-42a3-9452-b5ca00b96758",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
2176,
-112
],
"parameters": {
"color": 7,
"width": 528,
"height": 96,
"content": "## Publish + update sheet\n\nCreate WP post \u2192 write POSTED + URL back to the same row."
},
"typeVersion": 1
},
{
"id": "ab8e0d5a-6455-4653-80c1-e3c46c194287",
"name": "Split Out",
"type": "n8n-nodes-base.splitOut",
"position": [
960,
320
],
"parameters": {
"include": "allOtherFields",
"options": {},
"fieldToSplitOut": "tags_to_process"
},
"typeVersion": 1
},
{
"id": "c2861d90-2485-4eb0-a6ba-b57978d594f3",
"name": "Loop Over Items1",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1152,
320
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "e0ee229b-d509-4e7c-9918-6ab032adbf1c",
"name": "Variables",
"type": "n8n-nodes-base.set",
"position": [
-1088,
0
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "3f518ed0-d3f4-41e1-b36e-374bcbef1bc6",
"name": "website_URL",
"type": "string",
"value": "https://ozwebexpert.com"
},
{
"id": "84f77098-4555-40df-8b96-bc0227f793e8",
"name": "google_sheet_URL",
"type": "string",
"value": "https://docs.google.com/spreadsheets/d/1Wk0EVMr3ubq7piMMnMcqk58yMU5akCgj9sPzbL2zL6k/edit?gid=0#gid=0"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "1460f3ee-f47f-4523-8f9b-176fd76411ea",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1232,
-160
],
"parameters": {
"color": 7,
"width": 326,
"height": 144,
"content": "## Inputs & credentials\n\nSet WordPress site URL + Google Sheet URL. Connect WP + Google credentials."
},
"typeVersion": 1
},
{
"id": "8dfa4b2b-e673-4fe3-a4b5-7970e7f257aa",
"name": "Get row(s) in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
-832,
0
],
"parameters": {
"options": {},
"filtersUI": {
"values": [
{
"lookupValue": "READY",
"lookupColumn": "status"
}
]
},
"sheetName": {
"__rl": true,
"mode": "url",
"value": "={{ $json.google_sheet_URL }}",
"__regex": "https:\\/\\/docs\\.google\\.com\\/spreadsheets\\/d\\/[0-9a-zA-Z\\-_]+.*\\#gid=([0-9]+)"
},
"documentId": {
"__rl": true,
"mode": "url",
"value": "https://docs.google.com/spreadsheets/d/1Wk0EVMr3ubq7piMMnMcqk58yMU5akCgj9sPzbL2zL6k/edit?usp=drivesdk",
"__regex": "https:\\/\\/(?:drive|docs)\\.google\\.com(?:\\/.*|)\\/d\\/([0-9a-zA-Z\\-_]+)(?:\\/.*|)"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "e418e89a-6e40-43e9-b82a-df677eaa540e",
"name": "If ($tags)",
"type": "n8n-nodes-base.if",
"position": [
592,
320
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "3f35019c-45cb-4c1d-8679-a5617337e8d5",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $('Loop Over Items').item.json.hashtags }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.3
},
{
"id": "fc5b63b3-73cf-4cb1-873f-98c7d5ade380",
"name": "Parse $tags",
"type": "n8n-nodes-base.code",
"position": [
784,
320
],
"parameters": {
"jsCode": "function slugify(input) {\n return String(input || \"\")\n .trim()\n .toLowerCase()\n .replace(/['\"]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/[^a-z0-9\\-_]+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\nfunction extractTags(str) {\n const s = String(str || \"\").trim();\n if (!s) return [];\n\n // Try hashtags first: \"#n8n #wordpress\"\n const hashMatches = s.match(/#[^\\s#,;]+/g) || [];\n let raw = hashMatches.map(t => t.replace(/^#+/, \"\").trim()).filter(Boolean);\n\n // If no #tags found, fallback to splitting words\n if (raw.length === 0) {\n raw = s\n .split(/[\\s,;]+/g)\n .map(t => t.replace(/^#+/, \"\").trim())\n .filter(Boolean);\n }\n\n // Clean trailing punctuation\n raw = raw.map(t => t.replace(/[^\\w\\-]+$/g, \"\").trim()).filter(Boolean);\n\n // Deduplicate by slug\n const seen = new Set();\n const out = [];\n\n for (const name of raw) {\n const slug = slugify(name);\n if (!slug) continue;\n if (seen.has(slug)) continue;\n seen.add(slug);\n out.push({ tag_name: name, tag_slug: slug });\n }\n\n return out;\n}\n\n// Parse hashtags from the CURRENT item\nreturn items.map(item => {\n const tags = extractTags($('Loop Over Items').first().json.hashtags);\n\n return {\n json: {\n ...item.json,\n tags_to_process: tags,\n tags: []\n }\n };\n});\n"
},
"typeVersion": 2
},
{
"id": "b6ba7e92-fb2d-4f0b-85c4-893d25a8bb1b",
"name": "If",
"type": "n8n-nodes-base.if",
"position": [
1616,
432
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "baa9727c-8d11-4dfe-9ecc-8db4ae79a5ce",
"operator": {
"type": "number",
"operation": "gt"
},
"leftValue": "={{ $json.id }}",
"rightValue": 0
}
]
},
"looseTypeValidation": true
},
"typeVersion": 2.3
},
{
"id": "cf8e467d-2ed2-4c66-9be8-ce239f9ecfcd",
"name": "Create new tag",
"type": "n8n-nodes-base.httpRequest",
"position": [
1792,
432
],
"parameters": {
"url": "={{ $node[\"Variables\"].json.website_URL + \"/wp-json/wp/v2/tags\" }}",
"method": "POST",
"options": {},
"jsonBody": "={\n \"name\": \"{{ $('Split Out').item.json.tags_to_process.tag_name }}\", \"slug\": \"{{ $('Split Out').item.json.tags_to_process.tag_slug }}\"\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpBasicAuth",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"credentials": {
"httpBasicAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.3,
"alwaysOutputData": false
},
{
"id": "3ccc305a-d926-49c8-aa7b-6cf54466ab7a",
"name": "Code in JavaScript",
"type": "n8n-nodes-base.code",
"position": [
-560,
0
],
"parameters": {
"jsCode": "const data = $getWorkflowStaticData('global');\ndata.wp_tag_ids = '0';\nreturn items;"
},
"typeVersion": 2
},
{
"id": "a8e27a26-f66a-4ce5-81ca-2e392f57feac",
"name": "Prepare data",
"type": "n8n-nodes-base.code",
"position": [
2176,
0
],
"parameters": {
"jsCode": "const data = $getWorkflowStaticData('global');\nconst wpTagIds = String(data.wp_tag_ids || '0');\n\nconst tags = wpTagIds\n .split(',')\n .map(s => parseInt(s.trim(), 10))\n .filter(n => Number.isFinite(n) && n > 0);\n\n// \u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043f\u043e\u0441\u0442\u0430 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430\nconst row = $node[\"Loop Over Items\"].json;\n\n// 1) media_id, \u0435\u0441\u043b\u0438 \u0442\u044b \u0435\u0433\u043e \u0443\u0436\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b \u0432 item (\u043b\u0443\u0447\u0448\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442)\nlet mediaId = Number.isFinite(row.media_id) ? row.media_id : null;\n\n// 2) fallback: \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0432\u0437\u044f\u0442\u044c id \u0438\u0437 \u043d\u043e\u0434\u044b Upload $image to WP,\n// \u043d\u043e \u0411\u0415\u0417\u041e\u041f\u0410\u0421\u041d\u041e \u2014 \u044d\u0442\u0430 \u043d\u043e\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f.\nif (!Number.isFinite(mediaId)) {\n try {\n const uploadItems = $items(\"Upload $image to WP\"); // \u043c\u043e\u0436\u0435\u0442 \u0431\u0440\u043e\u0441\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u043d\u043e\u0434\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0430\u0441\u044c\n const uploadId = uploadItems?.[0]?.json?.id;\n if (Number.isFinite(uploadId)) {\n mediaId = uploadId;\n }\n } catch (e) {\n // upload node not executed -> ignore\n }\n}\n\n// \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c payload \u0434\u043b\u044f WP\nconst payload = {\n title: row.title || '',\n excerpt: row.excerpt || '',\n content: row.body || '',\n status: row.post_status || '',\n tags,\n};\n\n// \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c featured_media \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 id\nif (Number.isFinite(mediaId) && mediaId > 0) {\n payload.featured_media = mediaId;\n}\n\nreturn [{\n json: {\n ...row,\n wp_post_payload: payload,\n }\n}];\n"
},
"typeVersion": 2
},
{
"id": "91e83162-edd2-4efd-aa64-e16e7a54a724",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
1616,
336
],
"parameters": {
"color": 7,
"width": 480,
"height": 80,
"content": "## Create new ones\ncreate new tags & get their ids from WP if necessary"
},
"typeVersion": 1
},
{
"id": "fcc082c6-6dab-42d2-b406-d8b0ad5d28f6",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
1376,
336
],
"parameters": {
"color": 7,
"width": 176,
"height": 80,
"content": "## Get tag ids\nselect tag ids from WP"
},
"typeVersion": 1
},
{
"id": "b3d6cc64-95bc-495a-8e4f-967cc0668178",
"name": "Store tag_id",
"type": "n8n-nodes-base.code",
"position": [
2000,
432
],
"parameters": {
"jsCode": "const data = $getWorkflowStaticData('global');\n\nconst nextId = $json.id; // \u0438\u043b\u0438 $json.tag_id \u2014 \u0447\u0442\u043e \u0443 \u0442\u0435\u0431\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f ID\nconst idStr = String(nextId || '').trim();\n\nif (/^\\d+$/.test(idStr)) {\n const current = String(data.wp_tag_ids || '0');\n const parts = current.split(',').map(s => s.trim()).filter(Boolean);\n\n // \u0431\u0435\u0437 \u0434\u0443\u0431\u043b\u0435\u0439\n if (!parts.includes(idStr)) {\n data.wp_tag_ids = current + ',' + idStr;\n }\n}\n\nreturn items;\n"
},
"typeVersion": 2
},
{
"id": "31f78df4-caa3-48cf-b68c-704d160f218d",
"name": "Store tag_id1",
"type": "n8n-nodes-base.code",
"position": [
2000,
608
],
"parameters": {
"jsCode": "const data = $getWorkflowStaticData('global');\n\nconst nextId = $json.id; // \u0438\u043b\u0438 $json.tag_id \u2014 \u0447\u0442\u043e \u0443 \u0442\u0435\u0431\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f ID\nconst idStr = String(nextId || '').trim();\n\nif (/^\\d+$/.test(idStr)) {\n const current = String(data.wp_tag_ids || '0');\n const parts = current.split(',').map(s => s.trim()).filter(Boolean);\n\n // \u0431\u0435\u0437 \u0434\u0443\u0431\u043b\u0435\u0439\n if (!parts.includes(idStr)) {\n data.wp_tag_ids = current + ',' + idStr;\n }\n}\n\nreturn items;\n"
},
"typeVersion": 2
},
{
"id": "46844914-5e7e-4bb0-a03f-aa9272d2cadc",
"name": "Sticky Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1328,
-720
],
"parameters": {
"width": 912,
"height": 480,
"content": "## Google Sheets \u2192 WordPress Publisher\n\n**How it works**\n\nThis workflow reads rows from a Google Sheet where status = READY, then publishes each row as a WordPress post via the WP REST API. If image_url is present, it downloads the image and uploads it to WordPress Media, then attaches it as the featured image. If hashtags are present, it parses them, looks up matching WordPress tags by slug, creates missing tags, and collects their IDs. Finally, it builds the post payload (title/excerpt/content/tags/featured media), publishes the post, and updates the same Google Sheet row with status = POSTED, posted_at, and post_url.\n\n**Setup steps**\n- Connect Google Sheets credentials in n8n and set the spreadsheet URL in the Variables node.\n- Create WordPress credentials (Application Password / Basic Auth) and set your site URL in Variables.\n- Ensure your sheet has columns: id, status, title, excerpt, body, image_url, hashtags.\n- Add one test row with status = READY and run the workflow.\n\n**Customisation**\n\n- Change post status to draft, map extra fields (categories, author), or adjust tag parsing rules.\n- Use this template to organise your future posts [https://docs.google.com/spreadsheets/d/1lJDeaN75c1hBk0gddsdvbeXDuxDr5Q-NablHRSjvLjQ/edit?gid=0#gid=0](https://docs.google.com/spreadsheets/d/1lJDeaN75c1hBk0gddsdvbeXDuxDr5Q-NablHRSjvLjQ/edit?gid=0#gid=0)"
},
"typeVersion": 1
},
{
"id": "6a4472d4-5edd-4506-be93-0fa72401d521",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-400,
-720
],
"parameters": {
"width": 608,
"height": 400,
"content": "## Video Walkthrough\n@[youtube](W3xQ1t4irqc)\n"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"availableInMCP": false,
"executionOrder": "v1"
},
"versionId": "aefa6629-6dca-4b88-ab62-6f5ca543ab91",
"connections": {
"If": {
"main": [
[
{
"node": "Store tag_id1",
"type": "main",
"index": 0
}
],
[
{
"node": "Create new tag",
"type": "main",
"index": 0
}
]
]
},
"Split Out": {
"main": [
[
{
"node": "Loop Over Items1",
"type": "main",
"index": 0
}
]
]
},
"Variables": {
"main": [
[
{
"node": "Get row(s) in sheet",
"type": "main",
"index": 0
}
]
]
},
"If ($tags)": {
"main": [
[
{
"node": "Parse $tags",
"type": "main",
"index": 0
}
],
[
{
"node": "Prepare data",
"type": "main",
"index": 0
}
]
]
},
"If ($image)": {
"main": [
[
{
"node": "Load $image as binary",
"type": "main",
"index": 0
}
],
[
{
"node": "If ($tags)",
"type": "main",
"index": 0
}
]
]
},
"Parse $tags": {
"main": [
[
{
"node": "Split Out",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request": {
"main": [
[
{
"node": "Update row in sheet",
"type": "main",
"index": 0
}
]
]
},
"Prepare data": {
"main": [
[
{
"node": "HTTP Request",
"type": "main",
"index": 0
}
]
]
},
"Store tag_id": {
"main": [
[
{
"node": "Loop Over Items1",
"type": "main",
"index": 0
}
]
]
},
"Store tag_id1": {
"main": [
[
{
"node": "Loop Over Items1",
"type": "main",
"index": 0
}
]
]
},
"Create new tag": {
"main": [
[
{
"node": "Store tag_id",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[],
[
{
"node": "If ($image)",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items1": {
"main": [
[
{
"node": "Prepare data",
"type": "main",
"index": 0
}
],
[
{
"node": "Get tag_id from WP",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Get tag_id from WP": {
"main": [
[
{
"node": "If",
"type": "main",
"index": 0
}
]
]
},
"Get row(s) in sheet": {
"main": [
[
{
"node": "Code in JavaScript",
"type": "main",
"index": 0
}
]
]
},
"Update row in sheet": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Upload $image to WP": {
"main": [
[
{
"node": "If ($tags)",
"type": "main",
"index": 0
}
]
]
},
"Load $image as binary": {
"main": [
[
{
"node": "Upload $image to WP",
"type": "main",
"index": 0
}
]
]
},
"When clicking \u2018Execute workflow\u2019": {
"main": [
[
{
"node": "Variables",
"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.
googleSheetsOAuth2ApihttpBasicAuth
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow is for content teams, marketers, and solo site owners who draft posts in Google Sheets and want a reliable way to publish to WordPress automatically — including featured images and tags. Pulls rows from a Google Sheet where Processes rows one-by-one (safe for…
Source: https://n8n.io/workflows/13127/ — 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.
Creating high-quality, SEO-friendly blog posts consistently can be time-consuming. This template helps content creators, bloggers, SEO specialists, and agencies fully automate their blogging workflow.
wordpress_fb. Uses googleSheets, httpRequest. Event-driven trigger; 28 nodes.
Automatically discover trending developer and security topics, generate SEO-optimized blog posts, and publish them to WordPress as drafts — complete with AI-generated featured images. Discover trends
This workflow is perfect for content managers, SEO specialists, and website owners who want to easily analyze their WordPress content structure. It automatically fetches posts, categories, and tags fr
What Is TWZ n8n MailPoet Integration?