Google Search Console + Slack: SEO movers alerts
Your SEO numbers move every week, but the “why” gets buried in tabs, exports, and dashboards that don’t tell you what actually changed. By the time you spot a real drop (or a surprise win), the moment has passed and you’re reacting instead of steering.
This GSC Slack alerts setup hits SEO leads and content teams hardest. Growth-minded marketing managers feel it too, especially when leadership wants answers on Monday morning. The outcome is simple: fewer check-ins, faster detection, and a weekly report you can act on in minutes.
This workflow compares last week vs. the week before, flags meaningful movers by segment (brand, nonbrand, content categories), then pings Slack only when it matters and emails a Top 25 up/down report. You’ll see what it does, what you need, and how to tailor it to your site.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Search Console + Slack: SEO movers alerts
flowchart LR
subgraph sg0["Scheduled Run Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Scheduled Run 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/>Compute Week Ranges"]
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Branch by Week Label", pos: "b", h: 48 }
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/httprequest.dark.svg' width='40' height='40' /></div><br/>GSC Request Prior"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>GSC Request Recent"]
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/>Annotate Prior Week"]
n6["<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/>Annotate Recent Week"]
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/code.svg' width='40' height='40' /></div><br/>Normalize Prior Rows"]
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/code.svg' width='40' height='40' /></div><br/>Normalize Recent Rows"]
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/merge.svg' width='40' height='40' /></div><br/>Combine Week Streams"]
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/code.svg' width='40' height='40' /></div><br/>Compare Week Metrics"]
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/code.svg' width='40' height='40' /></div><br/>Segment Queries"]
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/code.svg' width='40' height='40' /></div><br/>Aggregate by Query"]
n13@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Route by Segment", pos: "b", h: 48 }
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/code.svg' width='40' height='40' /></div><br/>Brand Movers Filter"]
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/>Brand Top25 Table"]
n16["<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/slack.svg' width='40' height='40' /></div><br/>Brand Slack Alert"]
n17["<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+Recipe Movers"]
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/code.svg' width='40' height='40' /></div><br/>Brand+Recipe Top25"]
n19["<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/slack.svg' width='40' height='40' /></div><br/>Brand+Recipe Slack"]
n20["<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/>Recipe Movers Filter"]
n21["<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/>Recipe Top25 Table"]
n22["<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/slack.svg' width='40' height='40' /></div><br/>Recipe Slack Alert"]
n23["<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/>Nonbrand Movers Filter"]
n24["<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/>Nonbrand Top25 Table"]
n25["<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/slack.svg' width='40' height='40' /></div><br/>Nonbrand Slack Alert"]
n26["<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 Top25 Sets"]
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/>Compose Email Body"]
n28@{ icon: "mdi:message-outline", form: "rounded", label: "Send Report Email", pos: "b", h: 48 }
n2 --> n3
n2 --> n4
n27 --> n28
n9 --> n10
n5 --> n7
n26 --> n27
n13 --> n14
n13 --> n15
n13 --> n18
n13 --> n17
n13 --> n21
n13 --> n20
n13 --> n24
n13 --> n23
n6 --> n8
n7 --> n9
n8 --> n9
n4 --> n6
n3 --> n5
n10 --> n11
n1 --> n2
n15 --> n26
n18 --> n26
n21 --> n26
n24 --> n26
n12 --> n13
n0 --> n1
n14 --> n16
n17 --> n19
n20 --> n22
n23 --> n25
n11 --> n12
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 n2,n13 decision
class n3,n4 api
class n1,n5,n6,n7,n8,n10,n11,n12,n14,n15,n17,n18,n20,n21,n23,n24,n27 code
classDef customIcon fill:none,stroke:none
class n1,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n14,n15,n16,n17,n18,n19,n20,n21,n22,n23,n24,n25,n26,n27 customIcon
The Problem: SEO “monitoring” creates noise, not clarity
Most teams don’t have an SEO monitoring problem. They have an attention problem. Google Search Console is packed with data, but week-over-week movement gets lost because you’re scanning totals, not changes, and certainly not changes by segment. So you export, filter, build a spreadsheet, then try to remember what “normal” looks like. Meanwhile, the one query that dropped hard keeps bleeding clicks for days. Or a page suddenly takes off and nobody notices, which is honestly painful.
It adds up fast. And the friction compounds when you’re juggling brand terms, category pages, and different stakeholders who all want a different view.
- Weekly GSC check-ins turn into a manual audit that can take about 2 hours once you include exporting, filtering, and sanity-checking.
- Small changes create false alarms, so your team starts ignoring the dashboards entirely.
- Segmenting brand vs. nonbrand (and content types) usually lives in someone’s head or a messy spreadsheet.
- When a real anomaly happens, you discover it late, and the “what changed?” question becomes a scramble.
The Solution: Weekly GSC mover detection with Slack pings + a Top 25 email
This n8n workflow runs on a schedule (typically Monday), pulls two weeks of Google Search Console data, and compares them to find meaningful movers. It cleans and normalizes rows so “prior week” and “recent week” metrics line up, then calculates deltas and percent change for clicks, CTR, impressions, and average position. Next, it segments queries and pages into groups that match how you think about SEO, like brand, nonbrand, and a content category (the example uses “Recipes,” but it can be any section of your site). From there, it filters for big shifts (defaults are ±200 clicks and ±30%), alerts Slack only when thresholds are crossed, and emails a full HTML report with Top 25 increases and Top 25 decreases per segment, including linked URLs.
The workflow starts with a weekly trigger and a “week range” calculation so the comparison is consistent. It then fetches prior and recent GSC performance via HTTP requests, merges both streams, computes week-over-week changes, and routes results by segment. Finally, Slack receives the “pay attention” moments, and Gmail delivers the full Top 25 table report to whoever needs the detail.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you track 4 segments (brand, nonbrand, blog, and a category like “recipes”). Manually, it’s common to spend about 30 minutes per segment exporting GSC, comparing weeks, sorting by clicks, and pulling URLs, so you’re at roughly 2 hours every Monday. With this workflow, you spend about 10 minutes once to define your brand terms and URL filters, then the weekly run is automatic. You only open GSC when Slack flags a real mover, and the Top 25 email gives you the full picture without extra work.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Search Console for weekly performance data
- Slack to receive mover alerts
- Gmail to send the Top 25 HTML report
- OpenAI API key (get it from your OpenAI dashboard)
Skill level: Intermediate. You’ll connect accounts, edit segmentation rules, and test one weekly run.
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. n8n runs on the day you choose (Monday is typical) and computes two clean week ranges so the comparison stays consistent over time.
Search Console data is pulled twice. The workflow uses HTTP requests to fetch “prior week” and “recent week,” then annotates and normalizes both sets so the rows can be compared reliably.
Changes are calculated and segmented. It merges the two weeks, computes delta and percent changes (clicks, CTR, impressions, position), then routes items into segments like brand, nonbrand, and content categories based on your query terms and URL patterns.
Alerts and reporting happen at the end. Slack receives a message only when movers cross your thresholds, and Gmail sends a full HTML report showing Top 25 increases and decreases per segment with linked URLs for quick review.
You can easily modify the movement thresholds and segment definitions to match your site’s size and how your team reports SEO progress. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Trigger
Set the weekly schedule that kicks off the Search Console comparison workflow.
- Add and open Scheduled Run Trigger.
- Set the schedule rule to the cron expression
0 15 * * 1so the workflow runs every Monday at 15:00. - Connect Scheduled Run Trigger to Compute Week Ranges.
Step 2: Connect Google Search Console
Configure weekly date windows, branch by week label, and request GSC data for both periods.
- In Compute Week Ranges, keep the provided JavaScript that outputs
priorWeekandlastWeekranges. - In Branch by Week Label, set the condition Left Value to
{{ $json.label }}and Right Value topriorWeek. - In GSC Request Prior, set Method to
POSTand JSON Body to={"startDate":"{{ $json.startDate }}","endDate":"{{ $json.endDate }}","dimensions":["page","query"],"rowLimit":2500,"dataState":"all"}. - Credential Required: Connect your googleOAuth2Api credentials in GSC Request Prior.
- Repeat the same configuration in GSC Request Recent with the identical JSON body.
- Credential Required: Connect your googleOAuth2Api credentials in GSC Request Recent.
Step 3: Set Up Processing and Comparison
Normalize both weeks, merge the streams, and calculate deltas for clicks, CTR, impressions, and positions.
- Connect GSC Request Prior → Annotate Prior Week → Normalize Prior Rows.
- Connect GSC Request Recent → Annotate Recent Week → Normalize Recent Rows.
- Combine both normalized streams in Combine Week Streams.
- Send Combine Week Streams into Compare Week Metrics to compute deltas and percent changes.
Step 4: Configure Segmentation and Routing
Segment queries into brand, recipes, brand+recipes, and nonbrand flows, then route each segment for alerts and top-25 tables.
- In Segment Queries, update the brand terms inside the line
query.includes("BRAND TERM 1", "BRAND TERM 2", "ETC.")to match your own brand keywords. - Connect Compare Week Metrics → Segment Queries → Aggregate by Query → Route by Segment.
- Confirm Route by Segment uses
{{ $json.segment }}and output keys forbrand,brand+recipes,recipes, andnonbrand. - Route by Segment outputs to both Brand Movers Filter and Brand Top25 Table in parallel.
- Also route the remaining branches to Brand+Recipe Movers and Brand+Recipe Top25, Recipe Movers Filter and Recipe Top25 Table, and Nonbrand Movers Filter and Nonbrand Top25 Table respectively.
Step 5: Configure Slack Alerts and Email Output
Send high-movement alerts to Slack and compile top movers into a weekly email report.
- Connect Brand Movers Filter → Brand Slack Alert, Brand+Recipe Movers → Brand+Recipe Slack, Recipe Movers Filter → Recipe Slack Alert, and Nonbrand Movers Filter → Nonbrand Slack Alert.
- Credential Required: Connect your slackApi credentials in Brand Slack Alert, Brand+Recipe Slack, Recipe Slack Alert, and Nonbrand Slack Alert.
- Merge the four table outputs into Merge Top25 Sets with Number of Inputs set to
4. - Connect Merge Top25 Sets → Compose Email Body → Send Report Email.
- In Send Report Email, set Message to
{{ $json.body }}and Subject to{{ $json.subject }}. - Credential Required: Connect your gmailOAuth2 credentials in Send Report Email.
Step 6: Test and Activate Your Workflow
Run a full test to confirm both the Slack alerts and weekly email report are produced correctly.
- Click Execute Workflow starting from Scheduled Run Trigger to run the full path.
- Verify that Compare Week Metrics outputs delta fields like
deltaClicksandpercentChangeClicks. - Check for Slack messages from Brand Slack Alert, Brand+Recipe Slack, Recipe Slack Alert, and Nonbrand Slack Alert when thresholds are met.
- Confirm the email from Send Report Email includes four titled tables and a subject like
Top Weekly SEO Movers – YYYY-MM-DD. - When satisfied, switch the workflow to Active for weekly production runs.
Common Gotchas
- Google Search Console access can be the culprit. If the HTTP requests fail, confirm your OAuth permissions and that the connected account has access to the correct property.
- 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
About 15–25 minutes if your segments are already defined.
No. You will mainly connect accounts and edit a few filters. The workflow’s logic is already built; you’re just tailoring it to your site.
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 usage costs (usually small for weekly summaries).
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’ll adjust the segmentation logic so queries and URLs route into the right bucket, then tune thresholds per segment if needed. Common tweaks include adding brand term variations, splitting content types by URL path (like /blog/ vs /product/), and creating a “category pages” segment for templates.
Usually it’s permissions or the wrong property. Confirm the connected Google account has access in Search Console, then recheck the property URL format (domain property vs URL-prefix) used by the HTTP requests. If you recently changed passwords or admin settings, re-authorizing the connection in n8n often fixes it. Rate limits can also bite if you add lots of segments at once, so reduce the scope and test again.
Plenty for most small and mid-sized sites, because it runs weekly and then filters down to the Top 25 movers per segment.
Often, yes, because the “compare two date ranges, normalize rows, segment, then generate a ranked HTML table” part gets complicated fast in simpler tools. n8n handles branching and data shaping without turning into a pile of brittle steps, and you can self-host to avoid execution caps. Zapier or Make can still work if you only want a basic “send me a weekly export” automation. If you’re on the fence, Talk to an automation expert and map it to your reporting needs first.
Once this is running, your Monday “SEO check” becomes a quick read and a couple of decisions, not a half-day chore. The workflow watches the swings. You act on the ones that matter.
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.