
📋 What This Workflow Does:
The Problem It Solves: Imagine someone searches “how to bake chocolate cake” (they want to learn), but Google shows them your cake shop’s pricing page (you want them to buy). That’s a search intent mismatch—the searcher won’t find what they need, they’ll bounce, and you’ll lose potential conversions.
This workflow automatically:
- Pulls your top-performing keywords from Google Search Console
- Reads the actual content of each page
- Uses AI to determine if the page content matches what searchers expect
- Sends you a prioritized report of pages that need fixing
🔄 Workflow Explained:
Stage 1: Setup & Data Collection
Node | What It Does |
|---|---|
Manual Trigger | Start button—click this to run the workflow manually |
⚙️ Setup Configuration | Your settings: website URL, thresholds, email address, business description. Think of it as the workflow’s control panel. |
📊 GSC: Fetch Top Keywords | Connects to Google Search Console and pulls keyword data (which queries bring traffic, how many clicks, what pages rank). Uses a regex filter to focus only on main pages (homepage + first-level pages like |
Stage 2: Data Processing
Node | What It Does |
|---|---|
📋 Process & Filter GSC Data | Cleans up the GSC data: removes low-traffic keywords (below your thresholds), sorts by clicks, and keeps only the top 100 keywords. Adds helpful info like “traffic potential” scores. |
Split Keywords for Processing | Takes the list of 100 keywords and breaks them into individual items, so each keyword can be processed one by one. |
Batch Keywords (10 at a time) | Groups keywords into batches of 10. This prevents overwhelming the AI and web scraping services with too many requests at once. |
Stage 3: Content Analysis Loop
Node | What It Does |
|---|---|
Deduplicate Pages | Multiple keywords often point to the same page (e.g., “car insurance” and “auto insurance” both go to your insurance page). This node groups them together so we only scrape each page once—saving time and API costs. |
Filter Valid URLs | Safety check: only processes URLs that start with “http”. Filters out any bad data before scraping. |
Read URL Content (Jina AI) | Visits each page and extracts the text content in a clean format. If a page fails to load, it retries up to 2 times. Has a 60-second timeout for slow pages. |
Prepare AI Analysis Input | Packages everything the AI needs: the page content, the keywords pointing to it, and performance metrics. Trims content to 8,000 characters to keep costs reasonable. |
🧠 Claude: Intent Mismatch Analysis | The brain of the operation! Sends the data to Claude AI, which analyzes: (1) What is the searcher looking for? (2) What does this page actually offer? (3) Do they match? Returns structured analysis with severity scores and recommendations. |
Parse Claude Analysis | Extracts the AI’s response and converts it to structured data the workflow can use. Handles errors gracefully if the AI response isn’t perfectly formatted. |
Loop Back for Next Batch | After processing one batch, this sends the workflow back to process the next batch of 10 keywords. Continues until all keywords are analyzed. |
Stage 4: Report Generation
Node | What It Does |
|---|---|
Aggregate All Results | Collects all the individual analyses into one big dataset. |
📊 Generate Final Report | Crunches the numbers: How many mismatches? What’s the severity breakdown? Which pages need immediate attention? Creates prioritized lists and calculates traffic at risk. |
📧 Format HTML Email Report | Creates a beautiful, visual email report with color-coded severity badges, stats cards, and actionable recommendations. |
📧 Send Email Report | Delivers the HTML report to your inbox via Gmail. |
Stage 5: Data Storage
Node | What It Does |
|---|---|
Prepare Sheets Data | Formats the keyword-level data for storage. |
Create a Database Page (Notion) | Saves each keyword analysis to your Notion database for tracking over time. Stores: keyword, page URL, clicks, impressions, position, intent classification, page type, and whether a mismatch was detected. |
🎯 Understanding the Intent Classifications
Keyword Intent Types
Intent | What They Want | Signal Words |
|---|---|---|
INFORMATIONAL 📚 | Learn something | “how to”, “what is”, “why”, “guide”, “tutorial” |
TRANSACTIONAL 🛒 | Buy/convert now | “buy”, “price”, “order”, “subscribe”, “near me” |
COMMERCIAL_INVESTIGATION 🔍 | Research before buying | “best”, “review”, “vs”, “compare”, “alternative” |
NAVIGATIONAL 🧭 | Find a specific page | Brand name, “login”, “official” |
Page Types
Page Type | Description |
|---|---|
PRODUCT_PAGE | Selling a product or service |
PRICING_PAGE | Pricing, plans, packages |
BLOG_EDUCATIONAL | How-to guides, tutorials, learning content |
COMPARISON_PAGE | Reviews, comparisons, “best of” lists |
LANDING_PAGE | Lead capture, signup forms |
HOMEPAGE | Main site overview |
CATEGORY_PAGE | Product/service category listing |
SUPPORT_PAGE | Help docs, FAQs |
Mismatch Examples
If Keyword Intent Is… | But Page Type Is… | Problem |
|---|---|---|
INFORMATIONAL | PRODUCT_PAGE | Person wants to learn, but you’re selling → They’ll bounce |
TRANSACTIONAL | BLOG_EDUCATIONAL | Person wants to buy, but you’re teaching → Lost sale |
COMMERCIAL_INVESTIGATION | HOMEPAGE | Person wants comparisons, but sees brand overview → Not helpful |
⚙️ Setup Instructions
Prerequisites
- n8n instance (self-hosted or cloud)
- Google Search Console property verified
- Anthropic API key (for Claude)
- Gmail account with OAuth2
- Notion account with database created
- Jina AI account (free tier works)
Step 1: Import the Workflow
- Open n8n → Settings → Import
- Upload the JSON file
- Save the workflow
Step 2: Configure Credentials
Create these credentials in n8n (Settings → Credentials):
Credential | Used For |
|---|---|
Google Search Console OAuth2 | Fetching keyword data |
Jina AI API | Reading page content |
Anthropic API | Claude AI analysis |
Gmail OAuth2 | Sending email reports |
Notion API | Storing results |
Step 3: Set Up Notion Database
Create a Notion database with these properties:
Property | Type |
|---|---|
Name (Title) | Title (for keyword) |
Page URL | URL |
Clicks | Number |
Impressions | Number |
Position | Number |
Keyword Intent | Rich Text |
Page Type | Rich Text |
Mismatch Detected | Rich Text |
Step 4: Configure the Workflow
Edit the ⚙️ Setup Configuration node:
{
"site_url": "<https://yoursite.com/>",
"date_range_days": 30,
"min_clicks_threshold": 1,
"min_impressions_threshold": 10,
"top_keywords_limit": 100,
"report_email": "your@email.com",
"business_context": "Brief description of your business"
}
Update the GSC node regex filter if needed (currently filters for root + first-level pages only).
Update the Notion node with your database ID.
Step 5: Test & Activate
- Click “Test Workflow” to run manually
- Check for errors
- Toggle to “Active” for scheduled runs
💰 Cost Estimates
Service | Cost | Notes |
|---|---|---|
Claude Sonnet 4 | ~$0.90/run | 100 keywords ≈ 300K tokens |
Jina AI | Free | 1,000 requests/month included |
n8n | Varies | Self-hosted free, cloud varies |
Total | ~$4/month | Weekly runs |
🔧 Customization Options
Change the Schedule
Add a Schedule Trigger node connected to Setup Configuration:
- Cron expression:
0 9 * * 1= Every Monday at 9 AM
Adjust Thresholds
In Setup Configuration, change:
min_clicks_threshold: Minimum clicks to include a keywordmin_impressions_threshold: Minimum impressionstop_keywords_limit: How many keywords to analyze (max 100 recommended)
Change the GSC Filter
The current regex ^https:\\/\\/yoursite\\.com\\/$|^https:\\/\\/yoursite\\.com\\/[^\\/]+\\/?$ only includes:
- Homepage
- First-level pages (e.g.,
/about/,/services/)
To include deeper pages, modify or remove this filter in the GSC node.
🐛 Troubleshooting
Issue | Solution |
|---|---|
GSC returns no data | Check OAuth2 credentials, verify site property exists |
Jina timeout errors | Normal for slow pages—the retry will handle most cases |
Claude parse errors | Check AI response in execution logs—may need prompt adjustment |
Notion not saving | Verify database ID and property names match exactly |
Email not sending | Check Gmail OAuth2 credentials, verify “less secure apps” settings |
📊 Understanding Your Report
Severity Levels
Level | Score | Meaning | Action |
|---|---|---|---|
HIGH 🔴 | 76-100 | Critical mismatch, major CVR loss | Fix immediately |
MEDIUM 🟠 | 51-75 | Significant opportunity | Plan to address |
LOW 🔵 | 21-50 | Minor optimization needed | Nice-to-have |
ALIGNED 🟢 | 0-20 | Content matches intent | No action needed |
Key Metrics
- Mismatch Rate: % of keywords with intent mismatches
- Traffic at Risk: Total clicks going to mismatched pages
- CVR Opportunity: Estimated conversion rate improvement if fixed
📈 Best Practices
- Run weekly to catch new mismatches as rankings change
- Focus on HIGH severity first - biggest impact
- Track improvements in Notion database over time
- Create new content for keywords that don’t have a matching page
- Optimize existing pages by adding sections that match searcher intent
📝 Changelog
v1.0.0 - Initial Release
- GSC data collection with page-level regex filter
- Jina AI native node with retry logic
- Claude Sonnet 4 analysis
- Notion database storage
- HTML email reports with severity badges
- Intent classification: 4 types
- Page type classification: 8 types
- Severity scoring: 0-100 scale
FULL JSON CODE:
|
