n8n SEO Reporting Automation: A Weekly Report That Imports and Runs
Build n8n SEO reporting automation with GSC and GA4 auth, a JSON parse step, and a scheduled Sheets-to-stakeholder weekly report you can import once.
Search for SEO automation in n8n and you get listicles. "10 SEO workflows that transform your operations," each one a screenshot and a paragraph, none of them an actual importable report you can run Monday morning. The gap is glaring: nobody ships the one scheduled report that pulls Search Console and GA4, parses the JSON, and lands a clean rollup in a stakeholder's inbox.
n8n SEO reporting automation is that report. One workflow, one schedule, one Sheet, one email. This guide covers the GSC and GA4 auth that trips most people up, the parse step the listicles never mention, and the weekly Sheets-to-stakeholder cadence that makes the whole thing worth building.
The parse step is the part that quietly breaks every copy-paste attempt. The APIs return nested JSON; your Sheet wants flat rows. Without a parse node in between, you write garbage.
What an SEO reporting workflow can automate
A weekly report is a small pipeline that replaces a tedious manual export:
- Pull top queries, clicks, impressions, and position from Search Console.
- Pull sessions and conversions from GA4 for the same window.
- Compute week-over-week deltas.
- Flatten the nested API responses into Sheet rows.
- Write a dated tab and a rollup summary.
- Email the stakeholder a link plus the headline numbers.
That's the whole job. The hard parts aren't the nodes; they're the auth and the parse.
How to authenticate GSC and GA4 in n8n
This is where most builds die quietly.
For Search Console, use a Google OAuth2 credential scoped to the Search Console API and call searchanalytics.query. The catch: the authenticated identity has to be a verified owner or user of the exact property. A https://example.com URL-prefix property and a sc-domain:example.com domain property are different objects. Authenticate against the wrong one and the query returns an empty array with a 200, no error to chase.
For GA4, use the Google Analytics Data API (runReport) with the same OAuth credential or a service account added to the GA4 property with Viewer access. GA4's report payload is nested differently from Universal Analytics, so any tutorial older than 2023 will point you at endpoints that no longer exist.
If auth succeeds but the report comes back empty, it's almost never the workflow. It's the authenticated identity lacking access to the exact GSC property, or a date range that includes the last two to three days GSC hasn't finalized. Check the property URL type and pull the window two days back from today before you touch the nodes.
The reporting pipeline
Schedule (Mon 08:00) → GSC query → GA4 runReport
→ Parse + flatten JSON → Compute WoW deltas
→ Write dated Sheet tab → Build summary → Email stakeholder
1. Trigger weekly
A Schedule trigger fires Monday morning. Weekly is right for SEO; the data is too noisy day to day, and GSC lags by a couple of days anyway. Set the query window to the prior full week, ending two days before today.
2. Pull GSC and GA4
Call searchanalytics.query for top queries and pages. Call GA4's runReport for sessions and conversions on the matching dimensions. Both come back as nested JSON.
3. Parse and flatten
This is the step the listicles skip. The Search Console response nests data under rows[], each with a keys array and metric fields. A Code node flattens it:
return items[0].json.rows.map(r => ({
json: {
query: r.keys[0],
clicks: r.clicks,
impressions: r.impressions,
position: Number(r.position.toFixed(1)),
}
}));
Skip this and every Sheet cell reads [object Object]. That's the single most common "why doesn't my SEO report work" thread.
4. Compute deltas
Read last week's tab, join on query, and compute clicks and position deltas. The deltas are what a stakeholder actually reads; raw numbers without a trend are noise.
5. Write and email
Write a dated tab to the report Sheet, build a short summary (top movers, biggest drops, total clicks WoW), and email the stakeholder the Sheet link with the headline numbers in the body. They click through only if a number surprises them.
Implementation patterns
Pattern: parse node is mandatory, not optional. Treat every API-to-Sheet hop as needing a flatten step. The model here is the same one AI content workflows get wrong: the upstream node returns a shape the downstream node doesn't expect, and the fix is always an explicit parse in between.
Pattern: window ends two days back. Hardcode the report window to end today - 2 so GSC's unfinalized data never skews the latest numbers. A report that swings 30% every Monday because of unfinalized data destroys trust faster than no report.
n8n nodes you'll use most
| Node | Purpose |
|---|---|
| Schedule Trigger | Weekly Monday run |
| HTTP Request / Google API | GSC searchanalytics, GA4 runReport |
| Code | Flatten nested JSON, compute deltas |
| Google Sheets | Dated tabs, week-over-week store |
| Set | Build the email summary payload |
| Send Email / Gmail | Deliver the report to stakeholders |
Getting started
- Create a Google OAuth2 credential scoped to Search Console and the GA4 Data API.
- Confirm the identity has access to the exact GSC property and the GA4 property.
- Add a Schedule trigger for Monday morning with a window ending two days back.
- Wire the GSC and GA4 calls, then the Code node that flattens both responses.
- Add the delta computation against last week's tab.
- Write the dated tab and build the email summary.
- Run it once manually, confirm the Sheet has real rows (not
[object Object]), then let the schedule take over.
The Sheets-read, AI-process, distribute-on-a-schedule spine here matches the Content Scheduler & Distributor, which already wires the parse-and-send pattern.
Browse the n8n template catalog →The Content Scheduler & Distributor ships the scheduled-read, parse, and email-out pipeline this report needs: it reads a queue from Google Sheets, filters items for today, runs them through an OpenAI step with a proper parse, and emails a distribution summary. Swap the content step for the GSC and GA4 pulls and the reporting cadence is done. It's part of The Complete n8n Templates Bundle, a one-time lifetime license to every template now and later, sensible once you run more than one scheduled report.
Reporting pairs with the rest of the marketing stack. The data reporting automation guide generalizes this parse-and-deliver pattern to any dashboard, and the analytics automation post covers the GA4 specifics in more depth. Both lean on the same Content Scheduler & Distributor scheduling spine.
See reporting automation templates →Common questions
How do I connect Google Search Console to n8n?
Why does my SEO report come back empty even though auth works?
Do I need to parse the data before writing it to Sheets?
How often should an automated SEO report run?
Get the workflow templates this guide is built on
Import-ready n8n JSON, step-by-step setup, and tested end-to-end. One-time payment, own it forever.
Get 3 tested n8n templates, free
The full customer package for three real catalog templates — workflow JSON, step-by-step setup guide, credential checklist. Test-run on a live n8n instance like everything we sell. Plus new templates and automation guides in your inbox. No spam, unsubscribe anytime.
- 01Smart To-Do List ManagerPre-built n8n workflow template that automates productivity with OpenAI. Live in about 10 minutes.$14
- 02Email Follow-Up AutomatorPre-built n8n workflow template that automates crm with OpenAI. Live in about 15 minutes.$12
- 03Market Trend AnalyzerPre-built n8n workflow template that automates data processing with OpenAI. Live in about 10 minutes.$14
More automation guides

n8n Inventory Management Automation With Google Sheets and Hard Caps
The inventory templates ranking for this keyword all assume you're running Airtable or an ERP. That's fine for a warehouse. It's overkill for an indie seller with forty SKUs in a Google Sheet who just…

n8n Order Fulfillment Automation: Rates, Tracking, and No Double-Ships
Most fulfillment workflows you'll find do one thing: mark the order as fulfilled. That's a status flip, not fulfillment. Real fulfillment picks a carrier, buys a label, captures the tracking number, w…

n8n WooCommerce Automation: A Copy-Paste Order-to-Slack Workflow
The WooCommerce integration page on most automation sites is a node reference: here are the operations, here are the fields, good luck. The blog guides are worse. They're "8 WooCommerce automation ide…