🔓 Unlock all 10,000+ workflows & prompts free Join Newsletter →
✅ Full access unlocked — explore all 10,000 AI workflow and prompt templates Browse Templates →
Home n8n Workflow
January 22, 2026

WordPress to Google Sheets, always accurate content reports

Lisa Granqvist Partner Workflow Automation Expert

Your content report is only as good as your last export. And honestly, exports get forgotten, overwritten, or quietly go stale while everyone keeps making decisions from them.

This WordPress Sheets sync problem hits marketing managers first, but content strategists and agency owners feel it too. You want one spreadsheet that always reflects what’s live on your site, without chasing teammates for “the latest version.”

This workflow connects WordPress to Google Sheets and keeps posts, categories, tags, and media updated automatically. You’ll see how it works, what you need, and what results to expect.

How This Automation Works

Here’s the complete workflow you’ll be setting up:

n8n Workflow Template: WordPress to Google Sheets, always accurate content reports

Why This Matters: Content Reporting That People Actually Trust

Content reporting breaks in boring ways. Someone exports posts from WordPress, pastes them into a sheet, and calls it a dashboard. A week later, categories have changed, tags were cleaned up, and five new posts went live. Now your “content inventory” is quietly wrong. That’s when you waste hours arguing about numbers, re-checking URLs, and rebuilding reports you already built once. The real cost isn’t the export itself. It’s the constant second-guessing and the missed opportunities when you can’t see what’s actually happening on the site.

It adds up fast. Here’s where it breaks down in day-to-day work.

  • Teams lose about 1–2 hours a week re-exporting and cleaning lists of posts and metadata.
  • Category and tag changes don’t make it into reporting, so SEO audits start from bad assumptions.
  • Media tracking is usually missing entirely, which makes it hard to spot old assets or broken links.
  • Different people keep their own spreadsheets, and nobody knows which one is “the source of truth.”

What You’ll Build: A Live WordPress Content Database in Google Sheets

You’ll set up an n8n workflow that pulls content directly from the WordPress REST API and writes it into a structured Google Sheet. It can run on a schedule (like nightly) or start instantly via a webhook when you need a fresh snapshot for a meeting. The workflow fetches posts in pages, expands the results into individual rows, and updates your “Posts” tab. Then it does the same for categories and tags, so your taxonomy reporting stays accurate. Finally, it syncs your media library into a “Media” tab, which is a surprisingly useful view when you’re cleaning up old assets or building a content refresh plan.

The workflow starts with a scheduled trigger or an incoming webhook. From there, it loops through WordPress endpoints with pagination logic, updating Google Sheets as it goes. When it finishes, you have a sheet that matches what’s in WordPress right now, not what was true last month.

What You’re Building

Expected Results

Say your site publishes 20 posts a month and you run a weekly content report. Manually, you might export posts, categories, and tags, then clean and paste it all, which is easily about 45 minutes each time (and longer when someone changed categories). That’s about 3 hours a month, plus the occasional “wait, why is this missing?” debugging. With this workflow, your weekly refresh is basically zero effort: let the schedule run overnight, or hit the webhook and wait a few minutes for the sync to finish.

Before You Start

  • n8n instance (try n8n Cloud free)
  • Self-hosting option if you prefer (Hostinger works well)
  • WordPress site with REST API accessible
  • Google Sheets to store Posts, Categories, Tags, Media tabs
  • WordPress Application Password (create it in WP Users → Profile)

Skill level: Beginner. You’ll connect accounts, paste your site URL, and confirm your sheet tabs match the workflow.

Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).

Step by Step

Choose how it starts (schedule or on-demand). The workflow can run from a Scheduled Trigger (for example, every night) or from an Incoming Webhook Trigger when you want a refresh right now.

Initialize paging so you don’t miss anything. It sets page variables, then uses a counter and “page limit” checks to loop through WordPress results until everything is retrieved.

Pull posts, then write clean rows into Sheets. n8n calls the WordPress posts endpoint with an HTTP Request, splits the list into individual post items, then syncs those into your Google Sheets “Posts” tab.

Repeat the same pattern for categories, tags, and media. Categories and tags are fetched and synced to their own tabs, while media runs through its own pagination loop so larger libraries still complete reliably.

You can easily modify the per-page limit and sheet columns to match your reporting style. See the full implementation guide below for customization options.

Step-by-Step Implementation Guide

Step 1: Configure the Trigger Type

This workflow can start on a schedule or via a webhook to initialize paging variables for WordPress data syncing.

  1. Open Scheduled Run Trigger and set the schedule rule to run every 3 days using the existing interval configuration.
  2. Open Incoming Webhook Trigger and confirm the Path is 4c34beca-b5d7-48bd-bd11-f24f760c039d for manual or external triggering.
  3. Connect both triggers to Init Page Variables so either trigger initializes the paging state.

Step 2: Connect WordPress (HTTP Basic Auth)

HTTP requests pull posts, categories, tags, and media from WordPress. Each request uses HTTP Basic Authentication.

  1. In Fetch WP Articles, set URL to {{$json.base_url}} and enable Send Query.
  2. Set query parameters in Fetch WP Articles to: per_page={{$json.per_page}}, page={{ $json.current_page }}, _embed=wp:featuredmedia,wp:term, _fields={{$json.fields}}, orderby=date, order=desc.
  3. Credential Required: Connect your httpBasicAuth credentials in Fetch WP Articles.
  4. In Retrieve WP Categories set URL to https://ozwebexpert.com/wp-json/wp/v2/categories and keep Execute Once enabled.
  5. Credential Required: Connect your httpBasicAuth credentials in Retrieve WP Categories, Fetch Media Library, and Fetch WP Tags.
  6. In Fetch WP Tags confirm the URL is https://ozwebexpert.com/wp-json/wp/v2/tags with query parameters per_page=100 and _fields=id,name,slug.

Step 3: Set Up Paging and Post Sync Logic

This section initializes paging variables, fetches posts in pages, and keeps iterating until all pages are processed.

  1. In Init Page Variables, set JSON Output to { "base_url": "https://ozwebexpert.com/wp-json/wp/v2/posts", "fields": "id,slug,link,date,title,excerpt,categories,tags,featured_media,_embedded", "per_page": 10, "current_page": 0 }.
  2. Keep the code in Advance Page Counter as-is to increment current_page for each loop.
  3. Connect Advance Page Counter to Fetch WP Articles so each increment fetches a new page of posts.
  4. In Expand Post Items, set Field to Split Out to body and Include to allOtherFields.
  5. In Page Limit Check, keep the condition comparing {{ $('Advance Page Counter').item.json.current_page }} to {{ $('Fetch WP Articles').item.json.headers['x-wp-totalpages'] }} to stop looping at the last page.

Page Limit Check outputs to both Retrieve WP Categories, Init Media Variables, and Fetch WP Tags in parallel.

Step 4: Configure Media and Tag Sync Branches

Two additional branches pull media and tag data and iterate through their pages independently.

  1. In Init Media Variables, set JSON Output to { "base_url": "https://ozwebexpert.com/wp-json/wp/v2/media", "per_page": 10, "current_page": 0 }.
  2. Keep the code in Advance Media Counter to increment current_page for media pagination.
  3. In Fetch Media Library, set URL to {{$json.base_url}} with query params per_page={{ $json.per_page }}, page={{ $json.current_page }}, and parent_exclude=0.
  4. In Expand Media Items, set Field to Split Out to body.
  5. Keep the Media Page Check condition comparing {{ $('Advance Media Counter').item.json.current_page }} to {{ $('Fetch Media Library').item.json.headers['x-wp-totalpages'] }} for loop control.
  6. In Expand Tag Items, set Field to Split Out to body to unpack tag results from Fetch WP Tags.

Step 5: Configure Google Sheets Output Nodes

Each dataset is appended or updated in its own sheet using matching IDs.

  1. In Sync Posts Sheet, keep Operation set to appendOrUpdate, Document ID set to https://docs.google.com/[YOUR_ID], and Sheet Name set to Posts.
  2. Map columns in Sync Posts Sheet to the post fields, such as id={{ $json.body.id }}, title={{ $json.body.title.rendered }}, and categories={{ $json.body.categories[0] }}.
  3. In Sync Category Sheet, keep Operation set to appendOrUpdate, Sheet Name set to Categories, and match on category_id.
  4. In Sync Media Sheet, keep Operation set to appendOrUpdate, Sheet Name set to Media, and map values like url={{ $json.source_url }} and media_id={{ $json.id }}.
  5. In Sync Tag Sheet, keep Operation set to appendOrUpdate, Sheet Name set to Tags, and match on tag_id.
  6. Credential Required: Connect your googleSheetsOAuth2Api credentials in Sync Posts Sheet, Sync Category Sheet, Sync Media Sheet, and Sync Tag Sheet.

⚠️ Common Pitfall: Ensure each Google Sheet has the exact column headers defined in the node mappings (e.g., id, category_id, tag_id, media_id) or append/update will not match correctly.

Step 6: Test and Activate Your Workflow

Validate that each branch runs and writes data to your Google Sheets before enabling the schedule.

  1. Click Execute Workflow to test with the Scheduled Run Trigger or send a request to the Incoming Webhook Trigger URL.
  2. Confirm that Sync Posts Sheet, Sync Category Sheet, Sync Media Sheet, and Sync Tag Sheet each append or update rows in your target spreadsheet.
  3. Verify that Page Limit Check and Media Page Check stop looping after the final page based on the response headers.
  4. Once verified, toggle the workflow to Active to enable scheduled runs in production.
🔒

Unlock Full Step-by-Step Guide

Get the complete implementation guide + downloadable template

Troubleshooting Tips

  • WordPress HTTP Basic Auth credentials can expire or lack access. If requests start failing, check your WordPress Application Password and user role permissions 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.
  • Google Sheets OAuth2 can silently lose access after password or admin changes. Reconnect the Google account in n8n credentials, then reselect the spreadsheet ID in each Sheets node.

Quick Answers

What’s the setup time for this WordPress Sheets sync automation?

About 30 minutes if your WordPress and Google accounts are ready.

Is coding required for this WordPress Sheets sync?

No. You will connect credentials, update a few URLs, and paste your spreadsheet ID.

Is n8n free to use for this WordPress Sheets sync 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 any hosting cost if you self-host, plus normal Google/WordPress account costs.

Where can I host n8n to run this automation?

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.

Can I modify this WordPress Sheets sync workflow for different use cases?

Yes, and you should. Most people start by changing the WordPress endpoint URL in the HTTP Request nodes (for example, to include custom post types) and adjusting the per_page setting to speed up large syncs. You can also swap the Scheduled Trigger for webhook-only runs, depending on how you report. Finally, update the Google Sheets nodes to map extra fields you care about, like author, slug, or last modified date.

Why is my WordPress connection failing in this workflow?

Usually it’s an incorrect Application Password or the wrong REST API base URL. Regenerate the Application Password in WordPress, update the HTTP Basic Auth credential in n8n, and double-check you’re calling /wp-json/wp/v2/ on the right domain. If it works in a browser but not in n8n, permissions are the next suspect. Rate limits can show up too if you run the sync too often on a large site.

What volume can this WordPress Sheets sync workflow process?

For most small to mid-sized sites, it can comfortably sync thousands of posts and media items per run, because it paginates results and keeps looping until it’s done.

Is this WordPress Sheets sync automation better than using Zapier or Make?

Often, yes. This workflow needs pagination, looping, and multi-tab writes (posts, tags, categories, media), and n8n handles that without turning into a pile of separate zaps/scenarios. Self-hosting is also a big deal if you expect frequent syncs. That said, if you only need a simple “new post → add one row” setup, Zapier or Make can be faster to click together. Talk to an automation expert if you want help picking the cleanest option for your reporting stack.

Once this is running, your content sheet stays current without you babysitting it. The workflow handles the repetitive syncing so you can focus on decisions, not exports.

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.

Lisa Granqvist

Workflow Automation Expert

Expert in workflow automation and no-code tools.

×

Use template

Get instant access to this n8n workflow Json file

💬
Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Launch login modal Launch register modal