AutomationFlowsContent & Video › Publish SEO Wordpress Blog Posts From Google Sheets with Openai Gpt-4o-mini

Publish SEO Wordpress Blog Posts From Google Sheets with Openai Gpt-4o-mini

ByDistribution Engine @distributionengine on n8n.io

This workflow runs every 25 minutes to pull a keyword from Google Sheets, generate a Japanese SEO-ready WordPress post with OpenAI, publish it to WordPress, and then write the title, category, URL, and processing timestamps back to the same Google Sheet. Runs every 25 minutes on…

Cron / scheduled trigger★★★★☆ complexityAI-powered8 nodesWordPressGoogle SheetsOpenAI
Content & Video Trigger: Cron / scheduled Nodes: 8 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #17887 — we link there as the canonical source.

This workflow follows the Google Sheets → OpenAI 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 →

Download .json
{
  "id": "xfzu4UvAezrhVTic",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "CreatorHub\u7528_WordPress_Blog_Automation_v1",
  "tags": [],
  "nodes": [
    {
      "id": "21c7a9b2-9221-47c0-86bb-df12999f0bcd",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -144,
        -320
      ],
      "parameters": {
        "width": 512,
        "height": 688,
        "content": "# WordPress SEO Blog Automation\n\nAutomatically generate and publish SEO-ready WordPress articles from a Google Sheets keyword list using OpenAI.\n\n## How it works\n1. Runs automatically on a schedule.\n2. Reads the next keyword from Google Sheets.\n3. Generates a Japanese SEO article with OpenAI.\n4. Publishes the article to WordPress.\n5. Updates the original Google Sheets row with the result.\n\n## Setup\n- Connect your Google Sheets credential.\n- Replace YOUR_GOOGLE_SHEET_ID with your spreadsheet ID.\n- Use a sheet named \"Keywords\".\n- Connect your OpenAI credential.\n- Connect your WordPress credential.\n\n## Customization\nAdjust the schedule, OpenAI prompt, article length, WordPress categories, and publishing status to fit your workflow."
      },
      "typeVersion": 1
    },
    {
      "id": "f774afa6-968a-43cc-9ccb-e9909a031a9b",
      "name": "Publish Article to WordPress",
      "type": "n8n-nodes-base.wordpress",
      "position": [
        1136,
        0
      ],
      "parameters": {
        "title": "={{ JSON.parse($('Generate SEO Article with OpenAI').item.json.output[0].content[0].text).title }}",
        "additionalFields": {
          "slug": "={{ JSON.parse($('Generate SEO Article with OpenAI').item.json.output[0].content[0].text).slug }}",
          "status": "publish",
          "content": "={{ JSON.parse($('Generate SEO Article with OpenAI').item.json.output[0].content[0].text).content_html }}",
          "categories": "={{ JSON.parse($('Generate SEO Article with OpenAI').item.json.output[0].content[0].text).category_id }}"
        }
      },
      "credentials": {
        "wordpressApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "12a0822a-fdf8-42ac-b54d-a5c6e3c1f978",
      "name": "Get Next Keyword from Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        624,
        0
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Keywords"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_GOOGLE_SHEET_ID"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7,
      "alwaysOutputData": true
    },
    {
      "id": "58b76e68-0ab2-4099-b060-843e7aa4866a",
      "name": "Generate SEO Article with OpenAI",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        816,
        0
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "GPT-4O-MINI"
        },
        "options": {},
        "responses": {
          "values": [
            {
              "content": "=Create a Japanese SEO blog article for WordPress.\n\nReturn ONLY valid JSON.\nDo not wrap the JSON in markdown.\nDo not use ```json.\nDo not use code fences.\nReturn raw JSON only.\n\nGenerate all outputs in Japanese.\n\n{\n\"title\":\"\",\n\"slug\":\"\",\n\"category_id\":0,\n\"meta_description\":\"\",\n\"content_html\":\"\"\n}\n\nRules:\n\ntitle: Japanese SEO title, 30-45 Japanese characters.\nslug: short lowercase English slug using hyphens.\ncategory_id:\nIf the article is mainly about WordPress automation, return 2.\nIf the article is mainly a tutorial or beginner guide, return 3.\nIf the article is mainly about AI automation, return 4.\nIf the article is mainly about n8n workflows, return 5.\nIf the article is mainly a comparison, return 6.\nChoose the most appropriate category automatically based on the article topic.\nmeta_description: Japanese meta description, 100-140 Japanese characters.\ncontent_html: WordPress-ready HTML article.\ncontent_html must include h2 headings and paragraphs.\ncontent_html length: 1200-1800 Japanese characters.\nDo not include images.\nDo not include markdown.\nDo not include explanations outside JSON.\n\nWrite practical, experience-based content that helps readers solve a real problem.\nThe article should naturally lead readers toward automation using n8n and WordPress without being overly promotional.\n\nPrimary Keyword:\n{{ $json.Keyword }}"
            }
          ]
        },
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "8036b865-3d55-495a-a17d-3ec55b6bf7c5",
      "name": "Update Publishing Status in Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1344,
        0
      ],
      "parameters": {
        "columns": {
          "value": {
            "Title": "={{ JSON.parse($('Generate SEO Article with OpenAI').item.json.output[0].content[0].text).title }}",
            "Status": "Published",
            "Keyword": "={{ $('Get Next Keyword from Google Sheets').item.json.Keyword }}",
            "PostURL": "={{ $('Publish Article to WordPress').first().json.link }}",
            "Category": "={{ JSON.parse($('Generate SEO Article with OpenAI').item.json.output[0].content[0].text).category_id }}",
            "Processed": "TRUE",
            "ProcessedDate": "={{ $now }}",
            "PublishedDate": "={{ $now }}"
          },
          "schema": [
            {
              "id": "Keyword",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Keyword",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Category",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Category",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "PostURL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "PostURL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "PublishedDate",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "PublishedDate",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Processed",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Processed",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "ProcessedDate",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "ProcessedDate",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Keyword"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Keywords"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "=YOUR_GOOGLE_SHEET_ID"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "cd622d57-7409-4e1f-9316-882bd9a28933",
      "name": "Run Blog Automation on Schedule",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        432,
        0
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "minutes",
              "minutesInterval": 25
            }
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "929eb471-812b-4059-8eb7-62c903bef331",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        432,
        -80
      ],
      "parameters": {
        "color": 4,
        "width": 592,
        "content": "## 1. Generate SEO Article"
      },
      "typeVersion": 1
    },
    {
      "id": "0ab202de-cee3-4920-8f2d-005f2539849c",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1120,
        -80
      ],
      "parameters": {
        "color": 5,
        "width": 336,
        "content": "## 2. Publish and Track"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "ea6a0d1a-5ee0-4ec3-9eba-3abe2a07404b",
  "nodeGroups": [],
  "connections": {
    "Publish Article to WordPress": {
      "main": [
        [
          {
            "node": "Update Publishing Status in Google Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Run Blog Automation on Schedule": {
      "main": [
        [
          {
            "node": "Get Next Keyword from Google Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate SEO Article with OpenAI": {
      "main": [
        [
          {
            "node": "Publish Article to WordPress",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Next Keyword from Google Sheets": {
      "main": [
        [
          {
            "node": "Generate SEO Article with OpenAI",
            "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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow runs every 25 minutes to pull a keyword from Google Sheets, generate a Japanese SEO-ready WordPress post with OpenAI, publish it to WordPress, and then write the title, category, URL, and processing timestamps back to the same Google Sheet. Runs every 25 minutes on…

Source: https://n8n.io/workflows/17887/ — original creator credit. Request a take-down →

More Content & Video workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Content & Video

Description: This workflow fully automates your blog publishing process using n8n, AI, and WordPress. It pulls blog data from Google Sheets, generates SEO-optimized content with AI, creates feature im

XML, WordPress, Google Sheets +4
Content & Video

Automatically convert your WordPress articles into multilingual voiceovers with professional-quality audio. Want to add audio versions of your WordPress posts? Looking for a workflow that is fully aut

WordPress, Google Sheets, OpenAI +2
Content & Video

This workflow provides complete blog automation from trend detection to publication. It eliminates manual content research, writing, and publishing by using AI agents, Google Trends analysis, and Word

HTTP Request, OpenAI, Google Sheets +1
Content & Video

Automated Content Generation & Publishing - Wordpress. Uses wordpress, googleSheets, stickyNote, scheduleTrigger. Scheduled trigger; 17 nodes.

WordPress, Google Sheets, HTTP Request +1
Content & Video

This n8n workflow automates the entire process of content generation, image selection, and scheduled publishing to a self-hosted WordPress website. It is designed for bloggers, marketers, and business

WordPress, Google Sheets, HTTP Request +1