Search Console + Slack: instant SEO answers in chat
Your team asks simple SEO questions, and you end up doing the same manual routine again. Open Search Console, find the right property, export something, paste it into Slack, then explain it (again) in plain English.
SEO leads feel it first, but marketing managers and agency folks get pulled into it too. This Search Console Slack automation turns “what happened to clicks last week?” into a clean Slack reply your team can actually use.
You’ll set up a chat-style webhook, route the request, pull data from Google Search Console, and let OpenAI translate it into a consistent answer inside Slack.
How This Automation Works
Here’s the complete workflow you’ll be setting up:
n8n Workflow Template: Search Console + Slack: instant SEO answers in chat
flowchart LR
subgraph sg0["Tool calling Flow"]
direction LR
n6@{ icon: "mdi:play-circle", form: "rounded", label: "Tool calling", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set fields - Consruct API CALL", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set fields - Create searchCo..", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set fields - Create searchCo..", pos: "b", h: 48 }
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/>Search Console - Get Custom .."]
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/>## Search Console - Get List.."]
n13@{ icon: "mdi:cog", form: "rounded", label: "Array aggregation - response..", pos: "b", h: 48 }
n14@{ icon: "mdi:cog", form: "rounded", label: "Array aggregation - response..", pos: "b", h: 48 }
n7 --> n11
n7 --> n12
n6 --> n8
n8 --> n7
n11 --> n9
n12 --> n10
n9 --> n13
n10 --> n14
end
subgraph sg1["Postgres Chat Memory Flow"]
direction LR
n0@{ icon: "mdi:memory", form: "rounded", label: "Postgres Chat Memory", pos: "b", h: 48 }
n1@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set fields", 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/webhook.dark.svg' width='40' height='40' /></div><br/>Webhook - ChatInput"]
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/webhook.dark.svg' width='40' height='40' /></div><br/>Respond to Webhook"]
n5@{ icon: "mdi:wrench", form: "rounded", label: "Call Search Console Tool", pos: "b", h: 48 }
n15@{ icon: "mdi:robot", form: "rounded", label: "AI Agent", pos: "b", h: 48 }
n15 --> n4
n2 --> n15
n1 -.-> n15
n3 --> n2
n0 -.-> n15
n5 -.-> n15
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 n6 trigger
class n15 ai
class n1 aiModel
class n5 ai
class n0 ai
class n7 decision
class n11,n12,n3,n4 api
classDef customIcon fill:none,stroke:none
class n11,n12,n3,n4 customIcon
Why This Matters: SEO Updates Get Lost in Translation
Search Console is great at telling you what happened, but not at answering questions the way your team asks them. People want quick context in Slack: “Which pages dropped?”, “Is this query trend real?”, “Do we have an indexing issue?” So you become the translator. You also become the traffic cop for access, since not everyone has Search Console permissions (and frankly, not everyone should). The result is lots of tiny interruptions that break focus, plus answers that vary depending on who responded and how rushed they were.
The friction compounds. Here’s where it breaks down most often.
- Slack questions trigger a messy chain of exports, screenshots, and “give me five minutes” follow-ups.
- Different people interpret the same Search Console data differently, which causes debates instead of decisions.
- Property selection is easy to get wrong, especially when you manage multiple sites or client accounts.
- Access becomes a bottleneck, so insights live in one person’s head instead of the team’s workflow.
What You’ll Build: Ask in Slack, Get Search Console Answers Back
This workflow gives you a chat interface for Google Search Console data, powered by an AI agent. A request comes in through a secure webhook, gets cleaned up into structured fields, then routed based on what the person is asking. If they need search performance insights, the workflow calls the Search Console API and aggregates the response into a shape the AI can reason about. If they’re asking which sites/properties are available, it fetches and formats that list instead. Finally, OpenAI turns the raw API payload into a clear, consistent Slack-ready answer, using conversational memory so follow-up questions don’t start from zero every time.
The workflow starts with an incoming chat webhook and maps the message into a predictable format. From there, a switch routes the request to the right Search Console API call, then the results are aggregated and handed to the AI agent. The last step returns the response to your chat client so it lands back in Slack as a single, readable reply.
What You’re Building
| What Gets Automated | What You’ll Achieve |
|---|---|
|
|
Expected Results
Say your team asks five Search Console questions a day in Slack. Manually, each one usually takes about 10 minutes to find the right property, pull the report, sanity-check it, and write a reply, so that’s close to an hour daily. With this workflow, the question is submitted in seconds, the API fetch and AI summary usually finish in under a minute, and your “work” becomes a quick skim. Most teams get about 45 minutes back per day, and the answers stop depending on who happens to be online.
Before You Start
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Search Console for the performance and site property data.
- Slack to deliver answers where your team works.
- OpenAI API key (get it from your OpenAI dashboard).
Skill level: Intermediate. You’ll connect OAuth credentials, set scopes carefully, and test a webhook end-to-end.
Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).
Step by Step
A chat message hits your webhook. The workflow starts when your Slack-side command or chat UI sends a request to the public webhook. Because it’s publicly reachable, you’ll protect it with authentication (Basic Auth is common and works fine).
The message gets normalized. n8n maps the incoming fields into a consistent structure, so the rest of the workflow doesn’t have to guess what the user meant or where the text lives.
The request is routed, then Search Console is queried. A switch decides what to do next, like fetching Search Console insights versus retrieving the list of available properties. Then HTTP requests call the Search Console API, and the workflow reshapes the results into arrays that are easier to summarize.
The AI agent replies in plain English. The conversational agent combines the user’s question, the aggregated API response, and memory stored in Postgres. The final reply is returned through the webhook response node so Slack gets one clean answer instead of a pile of raw JSON.
You can easily modify the request types and reporting windows to match how your team asks questions. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Webhook Trigger
Set up the inbound chat endpoint that starts the workflow and authenticates requests.
- Add the Incoming Chat Webhook node and set HTTP Method to
POST. - Set Path to
a6820b65-76cf-402b-a934-0f836dee6ba0/chat. - Set Response Mode to
responseNodeand Authentication tobasicAuth. - Credential Required: Connect your
httpBasicAuthcredentials in Incoming Chat Webhook. - Connect Incoming Chat Webhook to Map Input Fields.
chatInput and sessionId in the JSON body so Map Input Fields can parse them correctly.Step 2: Connect Google Search Console
Authorize Google Search Console access and prepare the HTTP request nodes that fetch properties and insights.
- Open Fetch Search Console Insights and set URL to
=https://www.googleapis.com/webmasters/v3/sites/{{ $json.property }}/searchAnalytics/query. - Set Method to
POST, Specify Body tojson, and JSON Body to={ "startDate": "{{ $json.start_date }}", "endDate": "{{ $json.end_date }}", "dimensions": {{ $json.dimensions }}, "rowLimit": {{ $json.rowLimit }}, "startRow": 0, "dataState":"all" }. - Enable Send Headers and set Content-Type to
application/jsonin Fetch Search Console Insights. - Credential Required: Connect your
oAuth2Apicredentials in Fetch Search Console Insights. - Open Retrieve Search Properties and set URL to
=https://www.googleapis.com/webmasters/v3/sites. - Credential Required: Connect your
oAuth2Apicredentials in Retrieve Search Properties.
Step 3: Set Up Input Mapping and Tool Invocation
Normalize the incoming payload and build API request fields that drive the routing logic.
- In Map Input Fields, add assignments for chatInput, sessionId, and date_message using
={{ $json.body?.chatInput || $json.chatInput }},={{ $json.body?.sessionId || $json.sessionId }}, and={{ $now.format('yyyy-MM-dd') }}. - Configure Tool Invocation Trigger as the entry point for tool calls from the AI agent.
- In Build API Request Fields, map fields using expressions:
={{ $json.query.parseJson().request_type }},={{ $json.query.parseJson().startDate }},={{ $json.query.parseJson().endDate }},={{ $json.query.parseJson().dimensions }},={{ $json.query.parseJson().rowLimit }},={{ $json.query.parseJson().startRow}}, and={{ encodeURIComponent($json.query.parseJson().property) }}. - Connect Tool Invocation Trigger to Build API Request Fields, then to Route by Request Type.
Step 4: Configure the AI Conversation Layer
Set up the conversational agent with memory, the OpenAI model, and the Search Console tool integration.
- Open Conversational Data Agent and set Text to
=user_message : {{ $json.chatInput }} date_message : {{ $json.date_message }}. - Connect OpenAI Dialogue Model to Conversational Data Agent as the language model, and set Model to
gpt-4o. - Credential Required: Connect your
openAiApicredentials in OpenAI Dialogue Model. - Connect Postgres Memory Store to Conversational Data Agent as memory and set Table Name to
insights_chat_histories. - Credential Required: Connect your
postgrescredentials in Postgres Memory Store. - Connect Search Console Tool Invoke to Conversational Data Agent as a tool and set Name to
SearchConsoleRequestTool. - For AI tool nodes like Search Console Tool Invoke, add any required credentials on the parent workflow that it calls; the tool node itself does not store credentials.
- Connect Map Input Fields to Conversational Data Agent, then to Return Webhook Reply.
Step 5: Configure Routing and Response Aggregation
Route requests by type and format the Search Console responses for the agent.
- In Route by Request Type, create two outputs:
custom_insightsandwebsite_listbased on={{ $json.request_type }}and={{$json.request_type}}. - Connect the
custom_insightsoutput to Fetch Search Console Insights, then to Create Search Data Array, and finally to Aggregate Response Payload. - In Create Search Data Array, set searchConsoleData to
={{ $json.rows }}. - Connect the
website_listoutput to Retrieve Search Properties, then to Create Site List Array, and finally to Aggregate Response Payload 2. - In Create Site List Array, set searchConsoleData to
={{ $json.siteEntry }}. - In both Aggregate Response Payload and Aggregate Response Payload 2, set Aggregate to
aggregateAllItemDataand Destination Field Name toresponse.
Step 6: Test and Activate Your Workflow
Run a manual test to validate the chat-to-insights flow and then activate the workflow for production use.
- Click Execute Workflow and send a POST request to the Incoming Chat Webhook URL with a sample body containing
chatInputandsessionId. - Confirm that Map Input Fields outputs
chatInputanddate_message, and that Conversational Data Agent produces a response. - Verify that tool calls through Search Console Tool Invoke trigger Tool Invocation Trigger and that Route by Request Type sends requests to the correct Search Console path.
- Successful execution should end with Return Webhook Reply returning a conversational response enriched by Search Console data.
- Toggle the workflow Active to enable production use.
Troubleshooting Tips
- Google Search Console OAuth scopes matter a lot. If you keep getting refresh token issues, check your Google Cloud OAuth consent screen and the scopes attached to the credential 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 45 minutes if your Google OAuth app is already created.
No. You’ll mostly connect accounts and paste in a few credentials. The included code node is optional to tweak, not mandatory to run.
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 (often just a few dollars a month for light Q&A usage).
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. Most customizations happen in the “Route by Request Type” switch and the “Build API Request Fields” mapping, because that’s where you decide what data to pull and how to filter it. Common tweaks include changing the date range (last 7 vs last 28 days), forcing a specific Search Console property for a channel, and adding new question types like “top queries for a page” or “brand vs non-brand.”
Usually it’s OAuth scopes or an expired refresh token. Re-check the scopes on your Google Cloud OAuth client, then reconnect the credential inside n8n so it issues a fresh token. If it works once and then fails later, it’s often a permissions mismatch on the Search Console property or an app that wasn’t configured for the right access type.
A lot for typical team usage. If you self-host, volume mostly depends on your server and Google API limits. On n8n Cloud, your practical cap is your plan’s monthly executions, and this workflow is usually one execution per question (plus any tool-invocation subcalls).
Often, yes. This setup leans on an AI agent, memory, branching, and multi-step API handling, and n8n is simply more comfortable there than most “two-step Zap” style automations. Self-hosting is another big deal if your team asks lots of questions, because you’re not paying per tiny action forever. Zapier or Make can still be fine if you only want a basic “send a message when X happens” flow and you never need conversational context. If you’re unsure, Talk to an automation expert and you’ll get a straight recommendation based on your volume and security needs.
Once this is running, SEO answers stop being a scavenger hunt. Your team asks in Slack, and they get a clear reply back, fast.
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.