Google Sheets to WordPress, posts publish themselves
Your content plan looks great in a spreadsheet. Then reality hits. Research takes forever, drafts stall in “almost done,” and publishing becomes a weekly scramble that honestly drains momentum fast. This is exactly what Sheets WordPress automation fixes.
Content strategists feel it when a “simple” post turns into three hours of tabs and half-finished notes. SEO leads get stuck chasing consistency and internal links. And a small agency juggling client blogs has it worst, because every delay multiplies across accounts.
This workflow takes a topic from Google Sheets, researches it deeply (optional), generates images, publishes to WordPress, and backs everything up to Google Drive, Docs, and your tracking sheet. You’ll see how it works, what you need, and where teams usually trip up.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets to WordPress, posts publish themselves
flowchart LR
subgraph sg0["When Executed by Another Workflow Flow"]
direction LR
n8@{ icon: "mdi:play-circle", form: "rounded", label: "When Executed by Another Wor..", pos: "b", h: 48 }
n9@{ icon: "mdi:cog", form: "rounded", label: "Resize Image", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n11@{ icon: "mdi:cog", form: "rounded", label: "Wait1", pos: "b", h: 48 }
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Merge2"]
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Merge1"]
n14@{ icon: "mdi:wrench", form: "rounded", label: "Research Tool", pos: "b", h: 48 }
n15@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser1", pos: "b", h: 48 }
n16@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser4", pos: "b", h: 48 }
n17@{ icon: "mdi:robot", form: "rounded", label: "Initial Research", pos: "b", h: 48 }
n18@{ icon: "mdi:robot", form: "rounded", label: "Blog Planner", pos: "b", h: 48 }
n19@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n20@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model1", pos: "b", h: 48 }
n21@{ icon: "mdi:swap-vertical", form: "rounded", label: "Settings", pos: "b", h: 48 }
n22@{ icon: "mdi:database", form: "rounded", label: "Google Sheets In Progress To..", pos: "b", h: 48 }
n23@{ icon: "mdi:wrench", form: "rounded", label: "Research Tool1", pos: "b", h: 48 }
n24@{ icon: "mdi:cog", form: "rounded", label: "Wait2", pos: "b", h: 48 }
n25@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser3", pos: "b", h: 48 }
n26@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model2", pos: "b", h: 48 }
n27@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model3", pos: "b", h: 48 }
n28@{ icon: "mdi:wrench", form: "rounded", label: "Research Tool2", pos: "b", h: 48 }
n29@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n30@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model4", pos: "b", h: 48 }
n31@{ icon: "mdi:cog", form: "rounded", label: "Wait3", pos: "b", h: 48 }
n32@{ icon: "mdi:cog", form: "rounded", label: "Wait4", pos: "b", h: 48 }
n33@{ icon: "mdi:cog", form: "rounded", label: "Aggregate", pos: "b", h: 48 }
n34@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch Deep Research", pos: "b", h: 48 }
n35@{ icon: "mdi:wrench", form: "rounded", label: "Research Tool3", pos: "b", h: 48 }
n36@{ icon: "mdi:cog", form: "rounded", label: "Wait5", pos: "b", h: 48 }
n37@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser5", pos: "b", h: 48 }
n38@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model5", pos: "b", h: 48 }
n39@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model6", pos: "b", h: 48 }
n40@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Chapter", pos: "b", h: 48 }
n41@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Sub-Chapter", pos: "b", h: 48 }
n42@{ icon: "mdi:swap-vertical", form: "rounded", label: "Subchapters Output", pos: "b", h: 48 }
n43@{ icon: "mdi:swap-vertical", form: "rounded", label: "Final Chapters Output", pos: "b", h: 48 }
n44@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Chapters2", pos: "b", h: 48 }
n45@{ icon: "mdi:cog", form: "rounded", label: "Wait6", pos: "b", h: 48 }
n46["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Merge3"]
n47@{ icon: "mdi:cog", form: "rounded", label: "Wait7", pos: "b", h: 48 }
n48@{ icon: "mdi:robot", form: "rounded", label: "Chapter Research", pos: "b", h: 48 }
n49@{ icon: "mdi:robot", form: "rounded", label: "Subchapter Researcher", pos: "b", h: 48 }
n50@{ icon: "mdi:robot", form: "rounded", label: "Subchapter Copywriter", pos: "b", h: 48 }
n51@{ icon: "mdi:robot", form: "rounded", label: "Chapter Copywriter", pos: "b", h: 48 }
n52@{ icon: "mdi:robot", form: "rounded", label: "Main Chapter Researcher", pos: "b", h: 48 }
n53["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Merge Chapters"]
n54@{ icon: "mdi:database", form: "rounded", label: "Google Sheets Final Blog", pos: "b", h: 48 }
n55@{ icon: "mdi:database", form: "rounded", label: "Google Sheets Status Update", pos: "b", h: 48 }
n56@{ icon: "mdi:swap-vertical", form: "rounded", label: "Get Output", pos: "b", h: 48 }
n57@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out Subchapters", pos: "b", h: 48 }
n58@{ icon: "mdi:swap-vertical", form: "rounded", label: "Get Subchapters Output", pos: "b", h: 48 }
n59@{ icon: "mdi:swap-vertical", form: "rounded", label: "Get Title Chapter and Content", pos: "b", h: 48 }
n60@{ icon: "mdi:swap-vertical", form: "rounded", label: "Get Title Chapter And Content1", pos: "b", h: 48 }
n61@{ icon: "mdi:cog", form: "rounded", label: "Create Drive Folder", pos: "b", h: 48 }
n62@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out Chapters", pos: "b", h: 48 }
n63["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Upload Chapter Images"]
n64["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Update Image Meta Data"]
n65@{ icon: "mdi:cog", form: "rounded", label: "Upload Chapter Images To Drive", pos: "b", h: 48 }
n66@{ icon: "mdi:cog", form: "rounded", label: "Resize Featured Image", pos: "b", h: 48 }
n67@{ icon: "mdi:cog", form: "rounded", label: "Upload Featured Image To Drive", pos: "b", h: 48 }
n68@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check Inputs", pos: "b", h: 48 }
n69["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Get Post Sitemap"]
n70@{ icon: "mdi:cog", form: "rounded", label: "Get XML File", pos: "b", h: 48 }
n71@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out Links", pos: "b", h: 48 }
n72@{ icon: "mdi:cog", form: "rounded", label: "Limit Internal Links", pos: "b", h: 48 }
n73@{ icon: "mdi:cog", form: "rounded", label: "Aggregate Internal Links", pos: "b", h: 48 }
n74@{ icon: "mdi:swap-vertical", form: "rounded", label: "Get Initial Research Data", pos: "b", h: 48 }
n75@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out Main Chapters", pos: "b", h: 48 }
n76@{ icon: "mdi:cog", form: "rounded", label: "Aggregate All Chapters", pos: "b", h: 48 }
n77["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>HTTP Request Get Categories"]
n78@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields Categories", pos: "b", h: 48 }
n79@{ icon: "mdi:cog", form: "rounded", label: "Aggregate Categories", pos: "b", h: 48 }
n80@{ icon: "mdi:cog", form: "rounded", label: "Create Doc", pos: "b", h: 48 }
n81["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Combine Into Article"]
n82@{ icon: "mdi:swap-vertical", form: "rounded", label: "Final Article In Markdown", pos: "b", h: 48 }
n83["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/markdown.dark.svg' width='40' height='40' /></div><br/>Markdown To HTML"]
n84@{ icon: "mdi:swap-vertical", form: "rounded", label: "FInal Article In HTML", pos: "b", h: 48 }
n85@{ icon: "mdi:cog", form: "rounded", label: "Save Texts To Doc", pos: "b", h: 48 }
n86["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/wordpress.svg' width='40' height='40' /></div><br/>Post On Wordpress"]
n87["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Wait Featured Image"]
n88["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Upload Featured Image"]
n89["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Update Featured Image Meta D.."]
n90["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Set Featured Image For Post"]
n91["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Set Excerpt"]
n92@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Tags", pos: "b", h: 48 }
n93@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields", pos: "b", h: 48 }
n94@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out Tags", pos: "b", h: 48 }
n95["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>HTTP Request Create Tag"]
n96@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If Tag Already Exists", pos: "b", h: 48 }
n97@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If New Tag", pos: "b", h: 48 }
n98@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields2", pos: "b", h: 48 }
n99@{ icon: "mdi:cog", form: "rounded", label: "Aggregate Tag IDs", pos: "b", h: 48 }
n100@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields Final Tags", pos: "b", h: 48 }
n101["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Merge Tags"]
n102["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>HTTP Request Get Categories1"]
n103@{ icon: "mdi:cog", form: "rounded", label: "Convert to File", pos: "b", h: 48 }
n104["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>HTTP Request Open AI Image 1"]
n105@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out Feature Image", pos: "b", h: 48 }
n106@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Feature Image Data", pos: "b", h: 48 }
n107["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>HTTP Request Open AI Image "]
n108@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out Chapter Image", pos: "b", h: 48 }
n109@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Chapter Image Data", pos: "b", h: 48 }
n110@{ icon: "mdi:cog", form: "rounded", label: "Convert Data To File", pos: "b", h: 48 }
n111@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check empty output", pos: "b", h: 48 }
n11 --> n10
n24 --> n59
n31 --> n58
n32 --> n50
n36 --> n44
n45 --> n74
n47 --> n51
n13 --> n11
n12 --> n87
n46 --> n34
n21 --> n77
n33 --> n42
n80 --> n85
n56 --> n62
n56 --> n94
n56 --> n104
n97 --> n98
n101 --> n86
n93 --> n92
n91 --> n54
n18 --> n111
n68 --> n69
n68 --> n17
n98 --> n92
n70 --> n71
n9 --> n63
n14 -.-> n17
n92 --> n99
n92 --> n102
n53 --> n76
n23 -.-> n49
n28 -.-> n48
n35 -.-> n52
n94 --> n92
n103 --> n66
n103 --> n67
n10 --> n81
n10 --> n107
n71 --> n72
n48 --> n31
n69 --> n70
n17 --> n45
n83 --> n84
n99 --> n100
n40 --> n43
n40 --> n48
n19 -.-> n17
n86 --> n87
n85 --> n101
n51 --> n36
n111 --> n61
n111 --> n18
n20 -.-> n18
n26 -.-> n49
n27 -.-> n50
n30 -.-> n48
n38 -.-> n52
n39 -.-> n51
n62 --> n10
n42 --> n41
n61 --> n56
n44 --> n60
n44 --> n52
n87 --> n88
n79 --> n68
n81 --> n82
n110 --> n9
n110 --> n65
n72 --> n73
n34 --> n40
n34 --> n44
n84 --> n80
n43 --> n53
n96 --> n93
n96 --> n95
n41 --> n40
n41 --> n49
n66 --> n12
n57 --> n41
n50 --> n24
n49 --> n32
n63 --> n64
n88 --> n89
n76 --> n18
n78 --> n79
n100 --> n101
n58 --> n57
n64 --> n13
n95 --> n97
n52 --> n47
n108 --> n109
n105 --> n106
n75 --> n46
n73 --> n46
n54 --> n55
n29 -.-> n48
n109 --> n110
n106 --> n103
n82 --> n83
n74 --> n75
n15 -.-> n18
n25 -.-> n50
n16 -.-> n17
n37 -.-> n51
n77 --> n78
n107 --> n108
n90 --> n91
n102 --> n96
n104 --> n105
n59 --> n33
n60 --> n53
n65 --> n13
n67 --> n12
n22 --> n21
n89 --> n90
n8 --> n22
end
subgraph sg1["Schedule Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n1@{ icon: "mdi:database", form: "rounded", label: "Google Sheets Create Topics", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Topics", pos: "b", h: 48 }
n6@{ icon: "mdi:cog", form: "rounded", label: "Execute Workflow - Create A ..", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n7 --> n4
n4 --> n6
n0 --> n1
n1 --> n4
n6 --> n7
end
subgraph sg2["Flow 3"]
direction LR
n112["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>PerplexityAI API"]
n113@{ icon: "mdi:swap-vertical", form: "rounded", label: "Get Research Content", pos: "b", h: 48 }
n114@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields1", pos: "b", h: 48 }
n114 --> n112
n112 --> n113
end
subgraph sg3["On form submission Flow"]
direction LR
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/form.svg' width='40' height='40' /></div><br/>On form submission"]
n3@{ icon: "mdi:database", form: "rounded", label: "Google Sheets Create Topic -..", pos: "b", h: 48 }
n2 --> n3
end
subgraph sg4["When clicking ‘Test workflow’ Flow"]
direction LR
n5@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Test workflow’", pos: "b", h: 48 }
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n8,n0,n2,n5 trigger
class n15,n16,n17,n18,n25,n29,n37,n48,n49,n50,n51,n52 ai
class n19,n20,n26,n27,n30,n38,n39 aiModel
class n14,n23,n28,n35 ai
class n34,n68,n96,n97,n106,n109,n111 decision
class n22,n54,n55,n1,n3 database
class n63,n64,n69,n77,n88,n89,n90,n91,n95,n102,n104,n107,n112 api
class n81 code
class n5 disabled
classDef customIcon fill:none,stroke:none
class n12,n13,n46,n53,n63,n64,n69,n77,n81,n83,n86,n87,n88,n89,n90,n91,n95,n101,n102,n104,n107,n112,n2 customIcon
The Problem: Blog production dies in the handoff
Most teams don’t struggle with ideas. They struggle with follow-through. A topic gets picked, someone starts “quick research,” and suddenly you have 20 open tabs, random quotes in a doc, and no clean outline. Then comes the fiddly part: finding internal links, writing a meta description, generating images that fit your brand, uploading to WordPress, and logging what happened so you can track it later. Miss one piece and you either publish something thin, or you don’t publish at all.
It adds up fast. Here’s where it breaks down.
- A single long-form post can burn about 3 hours across research, writing, formatting, and uploading.
- Internal linking becomes guesswork, so posts don’t reinforce each other and topical authority grows slower.
- Status tracking is messy, which means duplicate work, forgotten drafts, and “did we publish this?” meetings.
- When writers change or clients revise direction, your process resets because nothing is standardized.
The Solution: Google Sheets topics become finished WordPress posts
This workflow turns your Google Sheet into a publishing queue. It checks for rows marked “To Do,” then spins up a full content run: real-time online research through a dedicated research sub-flow, an AI planner that builds a structured outline, and copywriting that expands each chapter (or goes deeper into subtopics when you enable the “Have Deeper Research” flag). While the article is being assembled, the workflow also pulls internal links from your WordPress sitemap, generates chapter images plus a featured image, and uploads those to WordPress and Google Drive. Finally, it publishes the post with categories, tags, excerpt, and meta description, then saves backups to Google Docs and logs everything back to Google Sheets.
The workflow starts with a schedule trigger (or a simple form submission). Then it runs a planning and research pass, writes the sections, and generates visuals. At the end, WordPress gets a complete post and your Google Sheets tracker gets a clean record of what was published and where.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you publish 3 posts per week. Manually, a typical post might take about 2 hours to research and outline, another hour to format in WordPress (headings, links, images, excerpt), and 10 minutes to log everything in a tracker, so you’re at roughly 10 hours weekly. With this workflow, you add topics to Google Sheets in about 10 minutes, then n8n runs the research, writing, images, publishing, and backups in the background. You still review and tune prompts over time, but the “hands-on” work can drop to a quick check instead of a full production sprint.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for topic queue, parameters, and status tracking
- WordPress to publish posts and upload media
- Google Drive + Google Docs for backups (images and Markdown docs)
- OpenAI API key (get it from the OpenAI API dashboard)
- Perplexity API key (get it from the Perplexity developer settings)
- WordPress Application Password (get it in WordPress Users → Profile)
Skill level: Intermediate. You’ll connect several accounts, confirm sheet columns match the workflow, and test each integration once.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A schedule (or form) kicks things off. The trigger flow runs every so often (many teams use something like every 10 minutes) and checks your “Create Topic” sheet for rows marked “To Do.”
The topic becomes a structured plan. The main flow pulls your site’s post sitemap, collects a batch of internal URLs, and calls the research sub-flow to gather real-time context. An AI planner then produces the outline, metadata, and image prompts.
Writing expands by chapters, with optional deeper research. If “Have Deeper Research” is enabled for that row, the workflow drills down into subtopics and sub-subtopics before writing, which usually produces more authoritative drafts. If it’s off, it still researches each chapter, just in a simpler loop.
Publishing and backups happen automatically. Images are generated, resized, uploaded to WordPress and Drive, the post is created in WordPress, and a full record (URL, HTML, Markdown, tags, and more) is saved back to Sheets and Docs.
You can easily modify the research depth and pacing to match your budget and publishing schedule. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Run Trigger
Set up the workflow entry points so content generation starts on schedule or via form submission.
- Open Scheduled Run Trigger and define the schedule that should kick off the topic pipeline.
- Review Form Submission Trigger if you want topics added on-demand from a form, and ensure the webhook is enabled.
- Keep Manual Test Start disabled unless you want an on-demand trigger for debugging.
- If this workflow is called by a parent workflow, confirm Triggered by Parent Flow is enabled and connected.
Step 2: Connect Google Sheets
Google Sheets is the central source of topics and status tracking for the pipeline.
- Connect Google Sheets credentials to Sheets Create Topics, Sheets Add New Topic, Sheets In-Progress Topic, Sheets Final Blog, and Sheets Status Update.
- Ensure the sheet structure expected by your workflow exists (topic list, in-progress tracking, and final blog updates).
- Keep retry settings enabled on nodes like Sheets Add New Topic, Sheets Final Blog, and Sheets Status Update to handle temporary Google API failures.
Step 3: Set Up Research & Planning AI Chain
These nodes run the research, planning, and LLM logic that builds the article outline and research payload.
- In Validate Inputs, define your validation rules so content only proceeds when required fields are present.
- Validate Inputs outputs to both Fetch Post Sitemap and Initial Research Agent in parallel; ensure both branches are configured to handle the same input payload.
- Configure OpenAI Chat Engine A as the language model for Initial Research Agent and ensure it uses your OpenAI settings.
- Confirm Structured Parser D is attached as the output parser for Initial Research Agent and that parsing rules match your desired schema.
- Set up Perplexity API Call and Collect Research Content for external research retrieval after Map Research Fields.
- Configure Blog Plan Builder with OpenAI Chat Engine B and Structured Parser A to generate the blog plan.
Step 4: Configure Output/Action Nodes
These nodes generate outputs to Google Docs, WordPress, and Drive once content is assembled.
- Connect Google Docs credentials for Create Document and Write Texts to Doc so drafts are stored in Docs.
- Connect WordPress credentials in Publish to WordPress and confirm the post fields are mapped to the content coming from Combine Tag Set.
- Ensure Sheets Final Blog and Sheets Status Update track success after Set Post Excerpt.
Step 5: Configure Chapter/Subchapter Loops and Content Assembly
These nodes iterate chapters and subchapters, then assemble the final article in Markdown and HTML.
- Verify chapter loops across Iterate Chapters, Iterate Chapter Set B, and Iterate Subchapters to ensure each subchapter is handled.
- Confirm the research/copywriting chain: Chapter Research Agent → Pause For Chapters → Gather Subchapter Data → Split Subchapters → Subchapter Research Agent → Subchapter Copywriter LLM.
- Set up Chapter Copywriter LLM after Pause For Copywriter to create chapter drafts before Pause For Main Loop.
- Ensure Assemble Output outputs to both Split Chapters and Split Tags and API Generate Feature Image in parallel, keeping these streams synchronized for downstream merges.
- Confirm Assemble Article → Markdown Article Output → Convert Markdown to HTML → HTML Article Output is intact.
Step 6: Configure Tags & Categories Logic
This branch manages WordPress categories, tags, and tag creation when missing.
- Set up API Get Categories and Map Category Fields before Compile Categories and Validate Inputs.
- From Split Tags, ensure Iterate Tags continues to both Compile Tag IDs and API Get Categories B so tags and categories remain synchronized.
- Configure Check Tag Exists to route new tags to API Create Tag, then Check New Tag → Map New Tag Fields.
- Confirm Compile Tag IDs → Map Final Tags → Combine Tag Set merges tags with the article payload before publishing.
Step 7: Configure Image Generation & Upload
Images are generated, converted, resized, uploaded, and assigned to the final WordPress post.
- Set up the featured image flow: API Generate Feature Image → Split Feature Image → Filter Feature Image → Convert Feature File.
- Convert Feature File outputs to both Resize Featured Visual and Drive Upload Featured Image in parallel; confirm both branches run successfully before Combine Streams B.
- Configure the chapter image flow: API Generate Chapter Image → Split Chapter Image → Filter Chapter Image → Convert Chapter File.
- Convert Chapter File outputs to both Adjust Image Size and Drive Upload Chapter Images in parallel, then merges via Combine Streams A.
- Verify image posting and metadata updates: Post Chapter Images → Update Image Metadata and Post Featured Image → Update Featured Image Metadata → Assign Featured Image.
Step 8: Configure Sub-Workflow Control and Wait States
Wait nodes throttle the pipeline and the sub-workflow execution must be configured for the topic loop to work.
- Open Run Sub-Workflow (Configure Required) and select the correct workflow to run for each topic iteration.
- Confirm all wait nodes (Pause Before Topics, Pause For Items, Pause For Subchapter, Pause For Chapters, Pause For Subwriter, Pause For Main Loop, Pause For Initial, Pause For Copywriter) are configured for your desired delays.
- Ensure Combine Streams A, Combine Streams B, and Combine Streams C merge branches correctly before re-entering the loop.
Step 9: Test and Activate Your Workflow
Validate each branch and then turn the workflow on for production use.
- Click Execute Workflow and run a single topic through Scheduled Run Trigger or Form Submission Trigger.
- Confirm successful outputs: a Google Doc created by Create Document, a WordPress post created by Publish to WordPress, and status rows updated by Sheets Final Blog and Sheets Status Update.
- Verify that featured images and chapter images appear in WordPress after Assign Featured Image.
- Once validated, toggle the workflow to Active for scheduled production runs.
Common Gotchas
- Google Sheets credentials can expire or the file permissions can block edits. If things break, check the n8n credential and confirm the workflow has access to the exact workbook and sheet tabs first.
- If you’re using Wait nodes or external image rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
Plan on about 60–90 minutes once you have all accounts and keys ready.
No. You’ll mostly connect credentials and match Google Sheet column names to the workflow.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI and Perplexity API costs, especially if you enable deeper research and generate multiple images per post.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, but you’ll change it in WordPress publishing rather than in the research parts. Most teams swap the “Publish to WordPress” node to create a draft status, keep the Google Docs backup as the canonical version, and add a “Needs Review” status back in Google Sheets. You can also adjust the “Have Deeper Research” flag so only selected rows run the heavier research loop.
Usually it’s the Application Password or the username tied to it. Regenerate the WordPress Application Password, then update the credential in n8n and test the “Publish to WordPress” node again. Also confirm REST API access isn’t blocked by a security plugin, and that the user role has permission to upload media, manage tags, and create posts. If your site uses unusual cache or WAF rules, allowlist n8n’s outbound IP if needed.
If you self-host, there’s no execution cap, so the limit is mostly your server and API rate limits.
For this kind of multi-stage content pipeline, n8n is usually the practical choice because you can branch, loop through chapters, and call sub-workflows without paying per tiny step. Zapier and Make can work, but long chains get expensive fast, and deep research logic becomes hard to maintain. Another big difference is control: self-hosting lets you run a lot more volume without worrying about task counts. The trade-off is setup time. If you want “connect two apps and go,” those tools feel simpler. Talk to an automation expert if you’re on the fence.
Once this is running, your spreadsheet becomes a real production system, not a wish list. The workflow handles the repetitive parts so you can focus on strategy, review, and publishing the pieces that actually move rankings.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.