Huashu Design
alchaincyf · Skill
Turns a one-line request in your AI agent into a finished design: a launch animation, a clickable app prototype, an editable slide deck, an infographic or a se…
An n8n workflow that treats a Google Sheets tab as a blog desk. A model writes each post in stages from prompts you keep in the sheet, and finished posts go to WordPress at the time you set.
Blog posts written from Google Sheets and sent to WordPress is an n8n workflow in the Marketing & SEO category, listed by Mindket. It is free. This is version 1, last updated on . Download it on this page or copy its JSON, then import it into an n8n canvas. Nothing runs until you activate it in n8n.
Every hour
It starts at the top of every hour, or when you press Test workflow in n8n:
Drafts and finished text written into your sheet, posts live on WordPress, and a Log tab that records each step
What you need before you start.
Planning sheet
Holds the post rows, the prompts and the log, and takes each result back into its row.
NeedsA Google Sheets credential and one spreadsheet with three tabs
Language model
Writes the text for each writing Action, on the model that the Config tab names.
NeedsAn OpenAI API key, or an OpenRouter key and its Base URL
Blog
Receives each finished post through its XML-RPC address.
NeedsA WordPress address, a user name and an application password
Checked by Mindket on 13 Nov 2026
This n8n workflow turns one Google Sheets tab into a small blog desk. Each row is a post. The row’s Action names a step, such as a draft, and a model carries it out. Finished posts go to WordPress when their time comes. Twenty-two nodes do the work, beside thirteen sticky notes.
Solo bloggers and small content teams who plan posts in a spreadsheet and want a model to write them in stages. Skip it if you want a visual editor, since every prompt and every draft lives in sheet cells.
| Industry | Who uses it | How they use it | Example |
|---|---|---|---|
| Blogging | Solo bloggers | Plan posts in a sheet and publish on a date | A blogger lists ten topics, has each one drafted, and sets a time for the final text. |
| Agencies | Content agencies | Keep many client articles in one pipeline | An agency adds one row per article and uses the Context column to find each client’s tone line in Config. |
| Retail | Online shop owners | Publish how-to articles on a schedule | An owner drafts a care guide in the sheet and sets it to go live on Monday morning. |
| Education | Course creators | Turn outlines into posts | A course creator keeps outline notes in a row and has a model write a post from each. |
You need a Google account with one spreadsheet, a WordPress site, and an OpenAI key or an OpenRouter key.
It runs inside n8n, and once the workflow is active it wakes by itself every hour. You write in Google Sheets and read the result on your WordPress site.
Download saves a zip with workflow.json and Mindket’s setup notes in your downloads folder. Build the three tabs first, because every Google Sheets node finds them by name.
| Need | Detail |
|---|---|
| n8n | On n8n Cloud or on a server of your own |
| Google Sheets | A Google Sheets OAuth2 credential and one spreadsheet with the tabs Schedule, Config and Log |
| OpenAI | An API key, or an OpenRouter key with its Base URL on the credential |
| WordPress | A site that accepts XML-RPC, a user name and an application password |
workflow.json.Schedule, Config and Log. Give Config the headers Key and Value, and give Log the headers Date, Type and Message.Schedule a header row with Topic, Scheduled, Status, Action, Context and Title, plus one column for each text you want written, such as draft and final.Settings, replace <YOUR_SPREADSHEET_URL> with the spreadsheet’s address and <YOUR_WORDPRESS_DOMAIN> with your site’s domain, such as myblog.com.Settings, replace <YOUR_WORDPRESS_USERNAME> and <YOUR_WORDPRESS_APPLICATION_PASSWORD>. Make the password under Application Passwords in your WordPress profile.AgentLLM. For OpenRouter, put its Base URL on that credential.Config, add a row prompt_draft holding your prompt and a row prompt_draft_model holding a model name. Write a column name in double braces, such as {{ Topic }}, to fill in that row’s value.draft, then press Test workflow. Switch the workflow on when it behaves.Add a row per post and set its Action to the step you want next. The workflow runs that step once, stores the text in the column named like the Action, and sets Status to match. Change the Action to move the post on.
To publish, fill Title and final, set Scheduled to a time such as 2026-12-01 09:00:00, and set the Action to publish. The first hourly run after that time sends the post.
| To change | Where |
|---|---|
| The writing steps and their prompts | The prompt_ rows in the Config tab |
| The model for a step | The rows that end in _model in Config |
| Draft or live | published in PrepareXmlPost |
| The site and its login | Settings |
| How often it runs | ScheduleTrigger |
You add a row with the topic Cold brew at home and the Action draft. At the next run the workflow fills the draft prompt, asks the model, writes the text under draft and sets Status to draft.
Later you copy the text into final, add a Title, set a time and change the Action to publish. When that time passes, the post appears on your site and Status reads publish.
If you are new. n8n draws a workflow as boxes joined by lines, and each box, a node, does one job. A row is one post in your sheet. The Action is the step you want done on it. XML-RPC is an older way for a program to talk to a WordPress site.
For experts. PreparedData fills each double-brace field from the row first, then from Config, then from Config under the field’s name followed by the row’s Context. Config has no outgoing line, and other nodes read it by name. The chain has no output parser.
Title: Where to look closer Node | What it does | What to know `ScheduleTrigger` | Schedule Trigger 1.2, every hour | `ManualTrigger` starts the same path for tests `Settings` | Set 3.4, nine fields | The WordPress login sits here in plain text `fetchConfig` and `Config` | Google Sheets 4.5 read, then Code 2 | The Key and Value rows become one object `Schedule` | Google Sheets 4.5, read | It reads every row on every run `PreparedData` | Code 2, builds the prompt, the model and a flag | It looks up `prompt_` plus the Action’s name in `Config` `IfTakeAction` | If 2.2 | Only rows whose Action differs from Status go on `IfPromptExists` | If 2.2 | An Action with no prompt in `Config` stops here `AgentLLM` | OpenAI Chat Model 1.1 | The model name comes from the row’s `model` field `Basic LLM Chain` | Chain 1.5 with the row’s prompt | It has no tools and no output parser `RecombinedDataRow` | Code 2, tidies the reply | Plain text goes to the column named like the Action `SaveBackToSheet` | Google Sheets 4.5, update by `row_number` | Fields with no matching column are ignored `LogStatus` | Google Sheets 4.5, append to `Log` | It runs after the save `IfScheduledNow` | If 2.2 | It reads `Scheduled` as `yyyy-MM-dd HH:mm:ss` `PrepareXmlPost` | Code 2, builds the `wp.newPost` call | It escapes the text and sends `post_status` `CreatePost` | HTTP Request 4.2, raw `text/xml` | It posts to https, your domain and `/xmlrpc.php` `HandleXMLRPCResponse` | Code 2 | It returns the post id, or the fault code and text `PostingSuccessful` | If 2.2 | It checks that a post id came back `SetToPublish` | Google Sheets 4.5, update by `row_number` | It writes the Status `publish`
The original copy sent its posts as drafts and logged a line where the save step needed the row.
wp.newPost, read on 12 November 2026, lists four arguments and says a post is a draft unless post_status says otherwise. The original added a fifth flag that the method does not take, so its posts would have stayed drafts. Mindket’s copy sends post_status from the published flag in PrepareXmlPost. The flag is 1, so posts go live at once, and 0 keeps them as draftsrow_number. In this copy the save comes first and the log follows it[object Object] into the Action’s own column whenever the model answered in JSON. Mindket’s copy keeps those fields as they are and uses the Action’s column only for plain textSettings as plain text, so they are saved with the workflow and show in execution data. WordPress’s application passwords guide, read on 12 November 2026, says one can be used in place of the real password for XML-RPC, so never put your own password thereScheduled must read like 2026-12-01 09:00:00, in the time zone n8n runs in, or the row is never publishedConfig. The chain has no tools, so gpt-6-luna suits it. OpenRouter lists models as maker and name, such as openai/gpt-6-luna, so copy the exact name from its catalogpublish, an error logged, and a finished or future-dated row left alone. The stand-in has no DateTime.fromFormat, so that one test used DateTime.fromISOSettingsAn n8n workflow that treats a Google Sheets tab as a blog desk. A model writes each post in stages from prompts you keep in the
sheet, and finished posts are sent to WordPress at the time you set.
workflow.json: the workflow as n8n exports it, twenty-two working nodes and thirteen sticky notes. It holds no credential.README.md: these notes.<YOUR_SPREADSHEET_URL>, <YOUR_WORDPRESS_DOMAIN>, <YOUR_WORDPRESS_USERNAME> and <YOUR_WORDPRESS_APPLICATION_PASSWORD> inSettings. A blank leftover field was removed.PrepareXmlPost now sends post_status, set from its published flag, and no longer adds a fifth argument that wp.newPostRecombinedDataRow no longer writes [object Object] into the Action's column when the model answers in JSON.The file does not hold the spreadsheet. These names come from what the code reads, so check them against your own sheet.
Schedule: one post per row. The code reads Topic, Scheduled, Status, Action, Context, Title and final. It writesdraft, and it writes Status. Any other columns are yours.Config: the headers Key and Value. A row prompt_draft holds the prompt for the Action draft, and a rowprompt_draft_model holds its model name. Double braces such as {{ Topic }} are filled from the row, then from Config.Log: the headers Date, Type and Message.workflow.json.Settings, replace <YOUR_SPREADSHEET_URL> with the spreadsheet's address and <YOUR_WORDPRESS_DOMAIN> with your site'smyblog.com.Settings, replace <YOUR_WORDPRESS_USERNAME> and <YOUR_WORDPRESS_APPLICATION_PASSWORD>. Make the password underAgentLLM. For OpenRouter, put its Base URL on that credential.Config, add prompt_draft and prompt_draft_model rows.draft, then press Test workflow. Switch the workflow on when it behaves.ScheduleTrigger starts the run every hour, or ManualTrigger starts it from the editor. Settings passes on the links.fetchConfig and Config read the prompts. Schedule reads every post row.PreparedData builds the prompt and the model name for each row, and IfTakeAction keeps the rows whose Action differs fromIfPromptExists to Basic LLM Chain on AgentLLM. RecombinedDataRow tidies the reply,SaveBackToSheet writes it into the row and LogStatus adds a line to Log.IfScheduledNow. When the time has come, PrepareXmlPost builds the call, CreatePost sends itHandleXMLRPCResponse reads the reply.LogPublished logs the post id or the error, and when an id came back SetToPublish sets the Status to publish.prompt_ rows in Config._model in Config.published in PrepareXmlPost.Settings.ScheduleTrigger.wp.newPost, read on 12 November 2026, lists four arguments and says a post is a draft unlesspost_status says otherwise. The original added a fifth flag that the method does not take, so its posts would have stayedpost_status. The flag is 1, so posts go live at once, and 0 keeps them as drafts.row_number.Settings as plain text, so they are saved with the workflow and show in executionScheduled must read like 2026-12-01 09:00:00, in the time zone n8n runs in, or the row is never published.gpt-6-luna suits it. OpenRouter lists models as maker and name, such as openai/gpt-6-luna, so copy thexmlrpc.php, the publish step fails and the Log tab shows the error.publish, aDateTime.fromFormat, so that one test used DateTime.fromISO.NOTICE.md 619 B README.md 6 KB workflow.json 48 KB
alchaincyf · Skill
Turns a one-line request in your AI agent into a finished design: a launch animation, a clickable app prototype, an editable slide deck, an infographic or a se…
op7418 · Skill
Skill that makes single-file HTML slide decks, slide illustrations and platform covers in two visual styles, with a presenter mode for rehearsal. For speakers…
alirezarezvani · Skill
Adds 411 ready-made skills for Claude Code and other coding agents, grouped by role from engineering and product to marketing, finance and compliance. Installs…
nerijs · Kit
A pixel art style add-on for Stable Diffusion XL that turns text prompts into pixel-style images, with an optional LCM LoRA for faster runs. For game makers, d…
LiconStudio · Kit
Keeps characters, clothing, objects and backgrounds consistent in generated video by feeding the model up to five reference images. A LoRA for LTX-2.5 in Comfy…
nhathoangfoto · Kit
A LoRA for FLUX.2 Klein 9B that puts a character into the pose shown by a mannequin reference while keeping the character's face and style. For artists and des…