n8n SEO Reporting: Automate Weekly Rank Tracking Reports with Google Sheets

Rank tracking is one of the most repetitive tasks in SEO — but it’s also one of the most critical. Knowing which keywords are climbing, dropping, or holding steady tells you exactly where to focus your optimization efforts. In this guide, you’ll build a fully automated weekly rank tracking report using n8n, the Google Search Console API, and Google Sheets, so your team always has fresh ranking data without anyone lifting a finger.

The Problem with Manual Rank Tracking

Most SEO teams rely on a combination of paid tools (Ahrefs, SEMrush, SERPWatcher) and manual exports to track keyword rankings. The problems with this approach are well-known:

  • Paid rank trackers can cost hundreds of dollars per month for large keyword sets
  • Manual exports are easy to forget or delay, leading to stale data
  • Data lives in siloed tools instead of a shared, accessible dashboard
  • It’s difficult to track position changes week-over-week automatically

By building your own rank tracking pipeline in n8n, you cut costs, centralize data, and get it delivered on a schedule — automatically.

Workflow Architecture Overview

Here’s the high-level architecture of the automated rank tracking workflow:

  1. Schedule Trigger — fires every Monday at 7 AM
  2. GSC API call — fetches query-level data for the current week and the prior week
  3. Data transformation — calculates position delta (change week-over-week)
  4. Google Sheets write — appends rows to a tracking sheet with a date stamp
  5. Conditional alert — sends a Slack message if any tracked keyword drops more than 5 positions

Step 1: Create the Tracking Google Sheet

Before building the workflow, set up your Google Sheet with the following columns:

  • Date — the week-ending date
  • Query — the search keyword
  • Page — the ranking URL
  • Position (Current) — average position this week
  • Position (Prior) — average position last week
  • Delta — change in position (negative = improved)
  • Clicks — clicks this week
  • Impressions — impressions this week
  • CTR — click-through rate

Name the first tab RankData and create a second tab called Dashboard where you can use pivot tables and charts to visualize trends over time.

Step 2: Build the n8n Workflow

Node 1: Schedule Trigger

Set up a weekly Schedule Trigger to fire every Monday morning. This ensures your team arrives at work to a freshly updated ranking report in their shared Google Sheet.

Node 2 & 3: Dual GSC API Calls (This Week + Last Week)

Make two parallel HTTP Request nodes that call the Google Search Console API — one for the current 7-day period and one for the prior 7-day period. Use n8n’s expression engine for dynamic date ranges:

// Current week
"startDate": "{{$now.minus(7, 'days').toFormat('yyyy-MM-dd')}}",
"endDate": "{{$now.toFormat('yyyy-MM-dd')}}"

// Prior week
"startDate": "{{$now.minus(14, 'days').toFormat('yyyy-MM-dd')}}",
"endDate": "{{$now.minus(7, 'days').toFormat('yyyy-MM-dd')}}"

Both calls should use ["query", "page"] as dimensions and request up to 5,000 rows.

Node 4: Merge — Combine Current and Prior Week Data

Use a Merge node in “Combine by Key” mode. Set the merge key to query (or query + page for page-level granularity). This joins each keyword’s current position with its prior-week position in a single data object.

Node 5: Code Node — Calculate Position Delta

Add a Code node to calculate the week-over-week change for each keyword:

return items.map(item => {
  const current = item.json.position_current || 0;
  const prior = item.json.position_prior || 0;
  const delta = prior - current; // positive = improvement
  return {
    json: {
      ...item.json,
      delta: parseFloat(delta.toFixed(1)),
      week_ending: new Date().toISOString().split('T')[0]
    }
  };
});

Node 6: Google Sheets — Append to RankData Tab

Connect a Google Sheets node set to Append Row mode. Map each field to the corresponding column in your RankData tab. Make sure to include the week_ending date field so you can filter and chart data over time.

Node 7: IF Node — Alert on Significant Drops

Add an IF node after the Code node that checks: delta < -5. This catches any keyword that dropped more than 5 positions week-over-week. Route the “true” branch to a Slack or Gmail notification node.

Your Slack message template might look like:

⚠️ Ranking Alert: "{{$json.query}}" dropped from position {{$json.position_prior}} to {{$json.position_current}} (-{{$json.delta}} positions) on {{$json.page}}

Step 3: Build a Google Sheets Dashboard

Once you have several weeks of data in your RankData tab, switch to the Dashboard tab and build a pivot table. Set:

  • Rows: Query
  • Columns: Week Ending
  • Values: Average Position

This gives you a keyword ranking history table that shows how each term has moved over time. Add a line chart to visualize your top 10 keywords’ position trends — a compelling visual for client reports or executive dashboards.

Advanced Enhancements

Multi-Site Tracking

To track multiple sites, wrap the entire workflow in a loop. Create a Set node at the top of the workflow that defines an array of site URLs, then use a Split In Batches node to process each site one at a time. Each site writes to its own tab in the Google Sheet.

Competitor Position Tracking

The GSC API only gives you data for your own site. To track competitor rankings, add an HTTP Request node that calls the DataForSEO SERP API for your target keywords. This gives you competitor position data you can merge with your own GSC data for a head-to-head comparison in the same sheet.

Automatic Report Email

Add a Gmail node at the end of the workflow that sends a weekly summary email. Use the Code node to calculate aggregate stats — total keywords tracked, average position change, number of keywords that improved vs. dropped — and format them into a clean HTML email body.

Why This Beats Traditional Rank Trackers

Commercial rank tracking tools charge based on the number of keywords you track — often $0.01–$0.10 per keyword per month at scale. If you’re tracking 10,000 keywords across 20 sites, that can easily be $1,000–$2,000 per month.

This n8n workflow uses Google Search Console data, which is free, accurate (it’s Google’s own data), and covers every keyword your site ranks for — not just a predefined list. The only cost is the n8n cloud subscription or self-hosted server time.

The trade-off is that GSC data is aggregated and delayed by 2–3 days, so it’s not suitable for real-time position checking. But for weekly strategic reporting, it’s more than sufficient — and far more cost-effective.

Getting Started

To implement this workflow, you need:

  1. An n8n instance (cloud or self-hosted)
  2. Google Search Console verified for your site
  3. OAuth2 credentials configured in n8n for Google APIs
  4. A Google Sheet with the column structure described above

Once the workflow is live, you’ll have a continuously updated ranking database that grows more valuable every week as you accumulate historical data. After 3–6 months, you’ll have a rich dataset that reveals seasonal trends, the impact of content updates, and the correlation between on-page changes and ranking movements — all without ever logging into a rank tracking tool again.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *