Google Search Console to Gmail, weekly SEO report ready
Your SEO numbers are in Google Search Console, but your weekly update is stuck in a messy loop of exporting, filtering, screenshotting, and second-guessing what changed.
This GSC email report automation hits SEO leads hardest. But marketing managers and agency owners feel it too, because nobody wants to spend Monday morning building the same report again.
This workflow pulls last week vs. the week before, splits brand vs non-brand clicks, calculates week-over-week changes, then sends a clean Gmail summary you can forward as-is.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Search Console to Gmail, weekly SEO report ready
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
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/code.svg' width='40' height='40' /></div><br/>Define Weeks"]
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/code.svg' width='40' height='40' /></div><br/>Brand Filter"]
n3["<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/>Brand Filter1"]
n4["<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/>Flatten8"]
n5["<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/>Flatten9"]
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If4", pos: "b", h: 48 }
n7["<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 2 Weeks Ago"]
n8["<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 Last Week"]
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/>Brand/NB Pull1"]
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/>Brand/NB Pull"]
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/>Total Metrics Pull1"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Total Metrics Pull"]
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/code.svg' width='40' height='40' /></div><br/>Add Brand Name"]
n14["<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 Time Periods"]
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/code.svg' width='40' height='40' /></div><br/>Generate Brand Performance T.."]
n16@{ icon: "mdi:message-outline", form: "rounded", label: "Weekly GSC Metric Email", pos: "b", h: 48 }
n6 --> n10
n6 --> n12
n6 --> n9
n6 --> n11
n4 --> n8
n5 --> n7
n2 --> n8
n1 --> n6
n3 --> n7
n10 --> n3
n13 --> n15
n9 --> n2
n8 --> n14
n0 --> n1
n7 --> n14
n14 --> n13
n12 --> n5
n11 --> n4
n15 --> n16
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 n0 trigger
class n6 decision
class n9,n10,n11,n12 api
class n1,n2,n3,n4,n5,n13,n15 code
classDef customIcon fill:none,stroke:none
class n1,n2,n3,n4,n5,n7,n8,n9,n10,n11,n12,n13,n14,n15 customIcon
The Problem: Weekly SEO Reporting Is Repetitive (and Error-Prone)
Weekly SEO reporting sounds simple until you actually do it. You open Search Console, set date ranges, export, then repeat for the previous week. Next comes the “brand vs non-brand” split, which usually means filters, regex, or a separate spreadsheet tab you don’t totally trust. Then you calculate changes for clicks, impressions, CTR, and average position, and you try to explain what moved without accidentally comparing the wrong windows. By the time you paste it into an email, the numbers feel stale and your confidence is lower than it should be.
It adds up fast. Here’s where it breaks down in real teams.
- You spend about an hour every week rebuilding the same view of performance from scratch.
- Brand vs non-brand segmentation turns into a fragile spreadsheet routine that breaks when naming conventions shift.
- Week-over-week deltas are easy to miscalculate, which means you can end up celebrating a “win” that isn’t real.
- Stakeholders get a wall of numbers, not a clear story, so you still have to answer follow-up questions all day.
The Solution: Google Search Console → Gmail Weekly Summary
This n8n workflow runs on a weekly schedule (for example, Monday morning) and builds your update automatically. It calculates the right date ranges, pulls Google Search Console metrics for “Last Week” and “2 Weeks Ago,” then merges the two windows so comparisons are consistent. In the middle, it separates brand and non-brand clicks using your segmentation rules, and it also retrieves totals so you’re not relying on a single query set. Finally, it builds a formatted performance table that includes raw values plus week-over-week % change for clicks, impressions, CTR, and position, with color cues so gains and drops are obvious at a glance. The finished summary is sent through Gmail, ready to forward to your team or clients.
The workflow starts with a scheduled trigger, then uses HTTP requests to pull GSC data for two time windows. After brand logic and merging, it generates a clean table and emails it automatically, so your “weekly report” becomes a recurring deliverable instead of a recurring task.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you report on 5 brand segments every Monday. Manually, you might spend about 10 minutes per segment pulling two date ranges, plus another 20 minutes cleaning up the totals, calculating changes, and writing the email, which is roughly 70 minutes each week. With this workflow, the trigger runs automatically and the email lands in Gmail after processing, usually within a couple minutes. Your weekly effort becomes “skim the table, add a sentence if needed, forward it.”
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Search Console as the source of SEO metrics.
- Gmail to deliver the weekly report email.
- OpenAI if you want AI-assisted summarization via the included AI Agent.
Skill level: Beginner. You’ll mainly connect accounts and adjust brand segmentation rules to match your naming.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A weekly schedule kicks it off. The workflow starts with a scheduled trigger (often Monday), so reporting happens even when your calendar is chaos.
Date ranges are computed for fair comparisons. A small code step calculates “Last Week” and “2 Weeks Ago,” which keeps week-over-week numbers consistent instead of accidentally comparing mismatched days.
Search Console data is pulled and segmented. HTTP requests retrieve totals and query-level data, then the workflow separates brand vs non-brand clicks using your label rules and merges everything into one dataset.
A performance table is built and emailed. The workflow calculates changes for clicks, impressions, CTR, and position, formats a clean table (including color-coded deltas), and sends it through Gmail to whoever needs it.
You can easily modify the brand segmentation logic to match how you track brands (domain, label, or custom filters) based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Trigger
Set the weekly schedule that starts the reporting workflow.
- Add the Scheduled Weekly Start node.
- Set the schedule rule to weekly with Trigger at Day as
Monday (1)and Trigger at Hour as15. - Connect Scheduled Weekly Start to Compute Week Ranges.
Step 2: Connect Google Search Console Data Requests
Configure the HTTP requests that pull GSC query and totals data for both time windows.
- In Fetch Brand Queries, set Method to
POSTand JSON Body to={ "startDate": "{{$json.startDate}}", "endDate": "{{$json.endDate}}", "dimensions": ["query"], "rowLimit": 5000 }. - In Fetch Brand Queries 2, use the same body:
={ "startDate": "{{$json.startDate}}", "endDate": "{{$json.endDate}}", "dimensions": ["query"], "rowLimit": 5000 }. - In Retrieve Totals A and Retrieve Totals B, set JSON Body to
={ "startDate": "{{$json.startDate}}", "endDate": "{{$json.endDate}}", "rowLimit": 5000 }. - Credential Required: Connect your googleOAuth2Api credentials in Fetch Brand Queries, Fetch Brand Queries 2, Retrieve Totals A, and Retrieve Totals B.
Parallel Execution: Branch by Label outputs to both Fetch Brand Queries and Retrieve Totals A in parallel, while its second branch outputs to Fetch Brand Queries 2 and Retrieve Totals B.
Step 3: Set Up Date Logic and Branching
Define the reporting windows and route data to the correct paths.
- In Compute Week Ranges, keep the provided jsCode to output two items labeled
2 Weeks AgoandLast WeekwithstartDateandendDate. - In Branch by Label, set the condition to compare Left Value
={{ $json.label }}with Right Value2 Weeks Ago. - Confirm Compute Week Ranges outputs to Branch by Label, Combine Two Weeks, and Combine Last Week in parallel.
Step 4: Configure Brand vs Non-Brand Processing
Filter branded queries, flatten totals, and align each week’s results.
- In Separate Brand Clicks and Separate Brand Clicks 2, replace
['BRAND TERMS']with your actual brand terms list. - In Flatten Totals A and Flatten Totals B, keep the provided jsCode to merge
startDate,endDate, and totals fromrows[0]. - Ensure Separate Brand Clicks 2 and Flatten Totals A both connect to Combine Two Weeks, and Separate Brand Clicks and Flatten Totals B both connect to Combine Last Week.
Parallel Execution: Compute Week Ranges outputs to Branch by Label, Combine Two Weeks, and Combine Last Week in parallel.
Step 5: Merge Time Windows and Label the Brand
Combine both weeks into one data object and tag it with the brand name.
- Connect Combine Two Weeks and Combine Last Week into Merge Time Windows.
- In Attach Brand Label, replace
brand: "BRAND NAME"with your actual brand name. - Connect Merge Time Windows to Attach Brand Label, then to Build Performance Table.
Step 6: Configure Output Email Delivery
Generate the HTML table and email it to your stakeholders.
- In Build Performance Table, keep the provided jsCode that builds
htmlTablewith weekly deltas and totals. - In Send Metrics Email, set Subject to
Weekly GSC Metric Send. - Set Message to
={{ $json["htmlTable"] }}so the HTML table is sent in the email body. - Credential Required: Connect your gmailOAuth2 credentials in Send Metrics Email.
Step 7: Test and Activate Your Workflow
Verify each branch produces the expected metrics table and email output.
- Use Execute Workflow to run the workflow manually from Scheduled Weekly Start.
- Check that Build Performance Table outputs a populated
htmlTablewith both2 Weeks Ago GSCandLast Week GSCrows. - Confirm the email from Send Metrics Email includes the HTML table with delta columns and metrics.
- Activate the workflow by toggling it to Active for weekly production runs.
Common Gotchas
- Google Search Console access can be the silent blocker. If the HTTP requests fail, confirm the property is correct and the connected Google account has permission in Search Console 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.
Frequently Asked Questions
Usually about 10 minutes if your Search Console access is already in place.
No. You’ll connect Google accounts and adjust a couple of brand-segmentation settings. The workflow logic is already built.
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 API costs if you keep the AI Agent enabled.
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 honestly it’s the first customization most teams do. You’ll update the brand segmentation logic where the workflow branches by label, then adjust the “Attach Brand Label” step so each row in the table is tagged correctly. Some people segment by domain, others by query patterns, and some by a custom label list. You can also swap the final Gmail send for Slack if you prefer updates in a channel.
Most of the time it’s permissions or the wrong property. Confirm the Google account connected in n8n is an owner (or has access) to the Search Console property you’re querying, then double-check the site URL format matches what Search Console expects. If it worked once and stopped, re-authenticate and rerun, because tokens can expire. Also watch for quota issues if you scale this across many properties.
For most small teams, “dozens” is fine on a normal schedule, and if you self-host you’re mainly limited by your server and Google’s API quotas.
For this use case, n8n is usually a better fit because you’re doing multi-step branching, merging two time windows, and running custom calculations before the email goes out. That kind of logic can get awkward (and pricey) in tools that charge per step or push you toward simpler flows. n8n also gives you the option to self-host, which is handy when you want predictable costs. Zapier or Make can still work if you only need a basic “send me metrics” email with minimal transformation. If you want help deciding, Talk to an automation expert.
Once this is running, your weekly SEO update becomes a reliable system instead of a recurring scramble. The workflow handles the repetitive parts, so you can focus on what the numbers actually mean.
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.