Watch SEO and AI Search Every Day with n8n and Zabio
Set up an n8n workflow that checks Search Console, GA4, your top pages and robots.txt every morning, keeps a history of issues and emails what changed, the likely cause and what to do.
Updated November 2026
This template checks your sites every morning. It reads Search Console and Google Analytics 4, loads your home page, your top pages and robots.txt, and asks Google’s URL Inspection about pages that slipped. Plain code compares everything with the weeks before and keeps a history of issues. Zabio then writes a short explanation of each new problem: what happened, the likely cause and what to do.
You get an email only when something is new, worse or fixed. Urgent problems, like a home page that stops loading or a noindex tag on a top page, also go to WhatsApp, Slack, Discord or Telegram.
One workflow watches as many sites as you add to a table, which makes it a good fit for agencies.
How it works
| Check | Source | Flags |
|---|---|---|
| Clicks and impressions | Search Console | The last 7 days down more than 30% against the weekly average of the 4 weeks before |
| Pages losing clicks | Search Console | A page down more than 40% that had at least 10 clicks a week |
| Important queries | Search Console | A query from your money_queries list that was in the top 10 and lost 3 positions or more |
| Home page and top pages | Page checks | Errors, redirects, a noindex tag, a canonical pointing elsewhere |
| Page changes | Page checks | Title, description, canonical, robots and status changes since the last run |
| robots.txt | Page checks | Rules blocking Googlebot, or AI crawlers such as GPTBot, ClaudeBot and PerplexityBot |
| Indexing | URL Inspection | Pages Google reports as not indexed, or where Google picked another canonical |
| Tracking | GA4 | No visits recorded yesterday, or far fewer organic visits than Search Console clicks |
| Conversions | GA4 | Key events down more than 30%, or landing pages that stopped producing them |
| AI assistants | GA4 | Visits from ChatGPT, Perplexity, Gemini, Copilot, Claude and others, and drops in them |
Each issue is saved in a table with the day it was first seen. The next morning it counts as still open, worse or resolved, so the report never repeats yesterday’s news. The thresholds above are the defaults; you can change them in SEO Settings.
Note: Search Console data is final about 3 days later. The search figures cover the 7 days that ended 3 days ago, which keeps false alarms out. Page checks, robots.txt and Analytics run on today’s state.
What you need
| Item | Where | Notes |
|---|---|---|
| n8n | Your own n8n, or n8n on a RemarkableCloud AI server | Built-in nodes only. |
| Google Search Console | search.google.com/search-console | The Google account you connect must see each site. |
| Google Analytics 4 | Optional | Adds tracking, conversion and AI assistant checks. |
| A Google Cloud project | console.cloud.google.com | Free. Holds the OAuth client n8n signs in with. |
| A Zabio API key | zabio.ai | Writes the daily explanation. |
| An SMTP account | Your email provider | Sends the reports. |
Step 1: Import the template
Download the workflow file from the template page. In n8n, open Workflows, choose Import from File and select it. It arrives inactive, with empty credentials.
Step 2: Create the data tables
In n8n, go to Data tables and create three tables with exactly these names.
seo_sites, one row per site:
| Column | Type | What goes in it |
|---|---|---|
site_id | String | A short name, like acme. |
active | Boolean | false pauses the site. |
domain | String | The site’s address, like https://www.acme.com. |
gsc_property | String | The Search Console property: sc-domain:acme.com for a domain property, or https://www.acme.com/ for a URL-prefix property. |
ga4_property | String | The GA4 property ID (a number, from Admin > Property details). Leave it empty to skip GA4. |
language | String | en or es: the language of the report and alerts. |
report_email | String | Who gets the report. |
digest | String | changes sends an email only when something changed; always sends one every morning. |
money_queries | String | A JSON list of the searches that matter most, like ["emergency plumber miami", "water heater repair"]. |
alert_whatsapp, slack_webhook, discord_webhook, telegram_chat_id | String | Optional channels for urgent issues. See Urgent alerts. |
brand_names, competitors, ai_prompts | String | Used by the weekly template. They can stay empty here. |
seo_pages, filled in by the workflow: site_id, url, title, description, canonical, robots, location, body_hash, last_checked, last_changed, last_change (all String) and status (Number).
seo_issues, filled in by the workflow: site_id, issue_key, type, severity, page, label, detail, first_seen, last_seen, status, resolved_at (all String).
Step 3: Connect Google
n8n reads Search Console and GA4 with one Google OAuth2 credential.
- In the Google Cloud console, create a project, or pick one you already have.
- Open APIs & Services > Library and enable the Google Search Console API and the Google Analytics Data API.
- Open OAuth consent screen. Choose Internal if you use Google Workspace, otherwise External, and fill in the app name and your email.
- Open Credentials > Create credentials > OAuth client ID, choose Web application, and add the OAuth Redirect URL that n8n shows in its Google credential form as an authorized redirect URI.
- In n8n, create a Google OAuth2 API credential. Paste the client ID and secret, and set Scope to
https://www.googleapis.com/auth/webmasters.readonly https://www.googleapis.com/auth/analytics.readonly. - Click Sign in with Google with the account that can see your sites.
- Select this credential in Call Google APIs and Inspect URLs.
Tip: An External consent screen left in Testing expires the Google sign-in after 7 days. Set it to In production so the workflow keeps running. For an app only you use, Google shows an unverified-app warning at sign-in, which you can accept.
Step 4: Add the other credentials
| n8n credential | Used by | What to enter |
|---|---|---|
| Zabio API key (Header Auth) | Write Brief With Zabio | Name Authorization, Value Bearer YOUR_ZABIO_KEY. |
| SMTP | Email Report | Your mail server, user and password. |
| WhatsApp, Telegram | WhatsApp Alert, Telegram Alert | Only if you use those channels. |
Then open SEO Settings and set email_from, like SEO Watch <seo@yourcompany.com>.
Step 5: Run it once, then activate
- Click Execute workflow. The first run saves the current state of every page and sends a baseline report: the numbers, and any issue already there.
- Read the report and fix anything urgent.
- Activate the workflow. From the next morning you only hear about changes.
Urgent alerts
Four issues are urgent: the home page not loading, a noindex tag on a page with search traffic, robots.txt blocking Google, and Analytics recording no visits. They go to every channel the site has set up, the same morning, along with the email.
| Channel | Set in seo_sites | Notes |
|---|---|---|
| Slack | slack_webhook | An incoming webhook URL from your Slack app. |
| Discord | discord_webhook | A webhook URL from the channel’s Integrations settings. |
| Telegram | telegram_chat_id | Needs a Telegram bot credential in n8n. |
alert_whatsapp | A number with country code. See below. |
WhatsApp only lets a business message someone outside a 24-hour conversation with an approved template. To use it:
- In WhatsApp Manager, create a Utility template, for example
seo_alert, with two body variables: “Urgent SEO issue on {{1}}: {{2}}. The full report is in your email.” - Wait for Meta to approve it.
- In SEO Settings, set
wa_templateto the name and language, likeseo_alert|en, andwa_phone_number_idto your WhatsApp phone number ID.
The WhatsApp assistant guide explains how to get a WhatsApp number and its credential.
Settings
| Field in SEO Settings | Default | What it does |
|---|---|---|
top_pages | 50 | How many pages, by clicks, are checked each morning. |
max_inspections | 10 | URL Inspection calls per site per day. Google allows 2,000. |
drop_pct | 30 | Sitewide drop in clicks or impressions that counts as an issue. |
min_weekly_clicks | 20 | Below this weekly average, sitewide drops are ignored. |
page_drop_pct | 40 | Drop that counts for a single page. |
page_min_weekly_clicks | 10 | Pages with fewer weekly clicks are not checked for drops. |
conversion_drop_pct | 30 | Drop in GA4 key events that counts as an issue. |
money_position_drop | 3 | Positions an important query can lose before it is flagged. |
zabio_model | auto | The model that writes the explanation. |
What it costs
Google doesn’t charge for the Search Console and Analytics APIs at this volume. Zabio writes one short explanation per site on the days there is something to report, with model: auto on a fast, low-cost model. Each report shows its own AI cost at the bottom. Zabio’s models page lists current prices.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| “Search Console data could not be read” | Wrong gsc_property, or the Google account can’t see the site | Copy the property exactly as Search Console shows it, with sc-domain: for domain properties. |
| “Google Analytics data could not be read” | Wrong ga4_property or missing access | Use the numeric property ID, not the measurement ID that starts with G-. |
| The workflow stops after a week | The Google sign-in expired | Set the OAuth consent screen to In production and sign in again. |
| No email | Nothing changed, or report_email is empty | Set digest to always to get a daily email anyway. |
| The report has numbers but no explanations | The Zabio call failed | Open Write Brief With Zabio in the execution. 401 means a wrong key; 402 insufficient_credits means the balance is empty. |
| Every page shows as changed on the second day | A page builder changes titles or descriptions per visit | Check the page source; the workflow reads what Google would read. |
Still stuck? Open a ticket. If your n8n runs on a RemarkableCloud server, an engineer can look at the workflow with you.