WordPress + Google Sheets: posts published and logged
Publishing blog posts sounds simple until you’re doing it every week. Ideas get stuck, drafts live in random docs, WordPress uploads eat time, and you still end up with zero clean tracking when someone asks, “What did we publish last month?”
Marketing managers feel it when the content calendar slips. Agency owners feel it when client reporting turns into detective work. And solo operators feel it because frankly, you’re doing all of it. This WordPress Sheets automation takes you from topic → published post → logged URL without the busywork.
You’ll set up an n8n workflow that generates an SEO-ready long-form article, grabs a relevant Pexels featured image, publishes to WordPress, and writes the final URL and publish details to Google Sheets so it’s always reportable.
How This Automation Works
Here’s the complete workflow you’ll be setting up:
n8n Workflow Template: WordPress + Google Sheets: posts published and logged
flowchart LR
subgraph sg0["Manual Start Flow"]
direction LR
n0["<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/>Publish to WordPress"]
n1["<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 Media to WP"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Assign WP Featured Image"]
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Sanitize Links", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Cleanse HTML", pos: "b", h: 48 }
n5@{ icon: "mdi:memory", form: "rounded", label: "Memory Buffer", pos: "b", h: 48 }
n6@{ icon: "mdi:wrench", form: "rounded", label: "Fetch Brand Brief", pos: "b", h: 48 }
n7@{ icon: "mdi:play-circle", form: "rounded", label: "Manual Start Trigger", pos: "b", h: 48 }
n8@{ icon: "mdi:robot", form: "rounded", label: "Idea Generator", pos: "b", h: 48 }
n9["<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/>Retrieve Stock Image"]
n10["<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/>Download Media File"]
n11["<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/>Apply WP Excerpt"]
n12@{ icon: "mdi:robot", form: "rounded", label: "Generate Excerpt", pos: "b", h: 48 }
n13@{ icon: "mdi:database", form: "rounded", label: "Update Blog Index", pos: "b", h: 48 }
n14@{ icon: "mdi:database", form: "rounded", label: "Update Base Entry", pos: "b", h: 48 }
n15["<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/>Convert to Markdown"]
n16@{ icon: "mdi:play-circle", form: "rounded", label: "Scheduled Run Trigger", pos: "b", h: 48 }
n21@{ icon: "mdi:robot", form: "rounded", label: "Compose Image Query", pos: "b", h: 48 }
n22@{ icon: "mdi:robot", form: "rounded", label: "Draft Content", pos: "b", h: 48 }
n23@{ icon: "mdi:brain", form: "rounded", label: "LLM Writer Model", pos: "b", h: 48 }
n24@{ icon: "mdi:brain", form: "rounded", label: "LLM Image Model", pos: "b", h: 48 }
n25@{ icon: "mdi:brain", form: "rounded", label: "LLM Excerpt Model", pos: "b", h: 48 }
n26@{ icon: "mdi:brain", form: "rounded", label: "LLM Ideation Model", pos: "b", h: 48 }
n27["<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/>Revise Categories"]
n28@{ icon: "mdi:robot", form: "rounded", label: "Parse Structured Output", pos: "b", h: 48 }
n29["<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/>Web Research Request"]
n30@{ icon: "mdi:database", form: "rounded", label: "Review History Log", pos: "b", h: 48 }
n15 --> n13
n0 --> n21
n8 --> n27
n30 -.-> n8
n4 --> n0
n3 --> n22
n5 -.-> n8
n22 --> n4
n10 --> n1
n12 --> n11
n23 -.-> n22
n6 -.-> n8
n27 --> n29
n24 -.-> n21
n25 -.-> n12
n26 -.-> n8
n16 --> n8
n29 --> n3
n9 --> n10
n11 --> n15
n28 -.-> n8
n13 --> n14
n1 --> n2
n2 --> n12
n21 --> n9
n7 --> n8
end
subgraph sg1["Triggered by Subflow Flow"]
direction LR
n17@{ icon: "mdi:play-circle", form: "rounded", label: "Triggered by Subflow", pos: "b", h: 48 }
n18["<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/notion.dark.svg' width='40' height='40' /></div><br/>Notion Data Source"]
n19@{ icon: "mdi:cog", form: "rounded", label: "Aggregate Records", pos: "b", h: 48 }
n20@{ icon: "mdi:swap-vertical", form: "rounded", label: "Map Fields", pos: "b", h: 48 }
n18 --> n19
n19 --> n20
n17 --> n18
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 n7,n16,n17 trigger
class n8,n12,n21,n22,n28 ai
class n23,n24,n25,n26 aiModel
class n6 ai
class n5 ai
class n13,n14,n30,n18 database
class n1,n2,n9,n10,n11,n29 api
class n27 code
classDef customIcon fill:none,stroke:none
class n0,n1,n2,n9,n10,n11,n15,n27,n29,n18 customIcon
Why This Matters: Publishing Content Without Losing Control
Manual publishing creates a quiet tax on your week. First you hunt for a topic, then you research it, then you write (or rewrite), then you format everything for WordPress, then you go find a decent featured image, then you upload media, then you realize the excerpt is missing, then you try to remember which category you used last time. After all that, the final insult is reporting: the URL is in WordPress, the publish date is in someone’s calendar, and the “source of truth” is… a Slack message from three weeks ago.
It adds up fast. Here’s where it breaks down.
- Formatting long posts into clean WordPress HTML is tedious, and the mistakes usually show up after you hit publish.
- Featured images become a recurring bottleneck because sourcing, downloading, and uploading media is repetitive and easy to skip when you’re rushed.
- Teams end up republishing the same topic because nobody checks what’s already been covered before writing starts.
- Reporting becomes manual spreadsheet work since WordPress doesn’t automatically log posts into your campaign tracker.
What You’ll Build: An AI Blog Publisher That Tracks Every Post
This workflow acts like a content ops assistant that never forgets steps. It can run on a schedule (or manually) to generate a fresh blog topic, check a Google Sheet to confirm you haven’t already published it, and then build the full draft using your brand brief and goals. Next, it pulls in supporting context with a web research request (Perplexity-style research via HTTP), then drafts a complete long-form post in clean HTML that WordPress can publish without mangled formatting. After that, it searches Pexels for a relevant image, downloads it, uploads it to WordPress media, and assigns it as the featured image. Finally, it publishes the post, applies an excerpt, and logs the title, URL, and date back into Google Sheets so you have an archive you can filter, share, and report on.
The workflow starts with a trigger (scheduled, manual, or from a sub-workflow). AI generates and researches the topic, then writes and cleans the content. WordPress publication happens only after media is uploaded and the post metadata is ready, and Google Sheets gets the final “receipt” so nothing disappears.
What You’re Building
| What Gets Automated | What You’ll Achieve |
|---|---|
|
|
Expected Results
Let’s say you publish 3 posts a week. Manually, a typical “last mile” workflow is about 20 minutes formatting in WordPress, 10 minutes finding an image, 10 minutes uploading and setting media, and another 10 minutes logging the URL and date in a sheet, so roughly 50 minutes per post (not counting writing). With this automation, you’ll spend about 10 minutes upfront making sure your brand brief, categories, and credentials are set, then the run is hands-off while it writes, publishes, and logs. That’s about 2–3 hours back every week, and your tracking stops being a mess.
Before You Start
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- WordPress for publishing posts and media
- Google Sheets to store post history and URLs
- Pexels API key (get it from your Pexels developer dashboard)
Skill level: Intermediate. You’ll connect a few accounts, paste API keys, and update a couple of WordPress endpoint URLs in HTTP Request nodes.
Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).
Step by Step
A scheduled run (or manual trigger) kicks things off. You can run it daily, weekly, or whenever your publishing cadence demands it. There’s also a sub-workflow trigger if you want topics to come from another system later.
The workflow generates a topic, then checks your log. Google Sheets acts like a memory layer. If a similar title already exists in your history, the workflow can avoid duplicates before you spend tokens and time drafting another version of the same post.
Brand brief + research feed the draft. A “Fetch Brand Brief” tool-workflow node pulls your tone, structure, and goals. Then the workflow gathers supporting context via a web research HTTP request, sanitizes links, drafts the article, and cleans the HTML so WordPress renders it properly.
WordPress publication happens with the image and excerpt handled. The workflow composes an image search query, retrieves a Pexels image, downloads it, uploads it to WordPress media, and sets it as featured. After the post is published, it generates and applies an excerpt, converts a copy to Markdown for indexing, then writes the final URL and publish date to Google Sheets.
You can easily modify the idea source to use your own content backlog instead of AI-generated topics based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual and Scheduled Triggers
This workflow can start from a manual run, a schedule, or a subflow call. Configure the triggers you plan to use for production.
- Open Manual Start Trigger and keep it enabled for ad-hoc testing runs.
- Open Scheduled Run Trigger and set the schedule you want to use for automatic blog generation (add your preferred schedule settings here).
- Open Triggered by Subflow if this workflow is called by another workflow; ensure the parent workflow is configured to execute this subflow.
- Confirm that both Manual Start Trigger and Scheduled Run Trigger connect directly to Idea Generator as shown in the execution flow.
Tip: In production, use either Scheduled Run Trigger or Triggered by Subflow to avoid overlapping runs while keeping Manual Start Trigger for testing.
Step 2: Connect Notion and Google Sheets Sources
This workflow pulls structured data from Notion and maintains a publishing index in Google Sheets.
- Open Notion Data Source and select the Notion database to read from. Credential Required: Connect your Notion credentials.
- Confirm the flow Triggered by Subflow → Notion Data Source → Aggregate Records → Map Fields for structured input.
- Open Update Blog Index and connect it to the target Google Sheet where you track published posts. Credential Required: Connect your Google Sheets credentials.
- Open Update Base Entry and point it to the base tracking sheet that receives the final update. Credential Required: Connect your Google Sheets credentials.
⚠️ Common Pitfall: Ensure your Notion and Google Sheets accounts have edit access to the target databases and sheets, or the workflow will fail at Notion Data Source and Update Blog Index.
Step 3: Set Up AI Ideation and Research
The ideation layer uses an AI agent plus tools and memory to generate topics and research context.
- Open Idea Generator and confirm it is connected to LLM Ideation Model as the language model. Credential Required: Connect your OpenAI credentials in LLM Ideation Model.
- Verify that Fetch Brand Brief, Review History Log, and Parse Structured Output are attached to Idea Generator as tools/output parser.
- Confirm Memory Buffer is attached to Idea Generator to retain context between steps.
- Ensure the execution flow continues from Idea Generator → Revise Categories → Web Research Request.
Tip: Fetch Brand Brief, Review History Log, Parse Structured Output, and Memory Buffer are AI tool/sub-nodes. Add any required credentials at the parent Idea Generator level rather than inside each tool.
Step 4: Set Up Content Drafting and Cleanup
This segment drafts the article, sanitizes sources, and prepares clean HTML for publishing.
- Open Web Research Request and configure the research endpoint you want to use (this is the first HTTP step after category revision).
- Open Sanitize Links to define how links from research are cleaned before drafting.
- Open Draft Content and verify it uses LLM Writer Model as the language model. Credential Required: Connect your OpenAI credentials in LLM Writer Model.
- Confirm the flow Sanitize Links → Draft Content → Cleanse HTML → Publish to WordPress to ensure clean output.
Step 5: Configure WordPress Publishing and Media Pipeline
After publishing, the workflow generates a stock image, uploads it, and sets it as the featured image.
- Open Publish to WordPress and configure the post creation action. Credential Required: Connect your WordPress credentials.
- Open Compose Image Query and confirm it uses LLM Image Model for the prompt. Credential Required: Connect your OpenAI credentials in LLM Image Model.
- Configure the HTTP nodes in the media sequence: Retrieve Stock Image → Download Media File → Upload Media to WP → Assign WP Featured Image.
- Make sure your HTTP request nodes include authentication headers or tokens required by your image provider and WordPress REST API.
⚠️ Common Pitfall: The HTTP request nodes (Retrieve Stock Image, Download Media File, Upload Media to WP, Assign WP Featured Image, Web Research Request, Apply WP Excerpt) require correct authentication and endpoints. Double-check base URLs and auth headers to avoid silent failures.
Step 6: Generate Excerpt and Update Tracking
The workflow finalizes the post with an excerpt, converts the output to Markdown, and updates tracking sheets.
- Open Generate Excerpt and confirm it uses LLM Excerpt Model as the language model. Credential Required: Connect your OpenAI credentials in LLM Excerpt Model.
- Ensure the flow continues Assign WP Featured Image → Generate Excerpt → Apply WP Excerpt.
- Verify that Convert to Markdown follows Apply WP Excerpt and then sends data to Update Blog Index → Update Base Entry.
Step 7: Test and Activate Your Workflow
Run a manual test to validate the end-to-end pipeline before enabling scheduling.
- Click Execute Workflow while using Manual Start Trigger to run a full test.
- Confirm a successful run by checking that Publish to WordPress created a post, the featured image is set via Assign WP Featured Image, and the sheets were updated in Update Blog Index and Update Base Entry.
- Review outputs from Convert to Markdown and Cleanse HTML to verify formatting quality.
- When satisfied, activate the workflow and enable Scheduled Run Trigger for production use.
Troubleshooting Tips
- WordPress credentials can expire or need specific permissions. If things break, check your WordPress Application Passwords (or user role capabilities) first.
- If you’re using Wait nodes or external 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.
Quick Answers
About 30 minutes if your API keys and WordPress access are ready.
No. You’ll mainly connect accounts and replace a few placeholder URLs and IDs in 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 AI and image API usage, which is usually a few dollars a month at small volumes.
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, and you should. You can swap the Notion Data Source node for Airtable or a Google Sheet backlog, change the Scheduled Run Trigger cadence, or replace the Pexels HTTP Request with another image provider. Many teams also customize the “Fetch Brand Brief” tool-workflow node so each client (or product line) has its own writing rules.
Usually it’s an Application Password issue on WordPress or a wrong site URL in the HTTP Request nodes. Regenerate the WordPress application password, confirm the user has permission to upload media and publish posts, then update credentials inside n8n. If media upload works but publishing fails, check category IDs and the endpoint path you’re hitting. Also watch for security plugins blocking REST API requests.
If you self-host, volume is mostly limited by your server and your API limits.
Often, yes, because this workflow has branching logic, multi-step content generation, and several HTTP requests that are annoying (and expensive) to model in simpler automation tools. n8n is also easier to extend when you want extra checks, like “don’t publish if the draft mentions a competitor” or “route drafts to an editor first.” Zapier and Make can still work if you only want a basic “sheet row → WordPress draft” flow and you’re fine with fewer guardrails. The big difference is control: n8n lets you keep the whole publishing pipeline in one place, which makes troubleshooting less painful. If you’re torn, Talk to an automation expert and describe your cadence and review process.
Once this is running, publishing stops being a fragile checklist. Your WordPress output stays consistent, and Google Sheets quietly builds the history you’ll be grateful for later.
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.