Google Cloud BigQuery + Linkeddit
BigQuery SEO rank tracking: weekly ranks and the AI Overview as a table
BigQuery SEO rank tracking needs a rank source, because BigQuery stores data and does not check Google. Linkeddit measures each tracked keyword weekly: your Google position, whether an AI Overview appeared, and whether it cited your domain. Claude reads those checks and, after you approve, inserts one row per keyword per check into a BigQuery table through Google's BigQuery connector, ready to join with Search Console data.
Updated 2026-10-29
Connect both
Your AI client sits in the middle. Linkeddit supplies the data; the other connector makes the change.
Linkeddit connector
Add https://mcp.linkeddit.com/mcp as a connector and sign in. Claude Code: claude mcp add --transport http linkeddit https://mcp.linkeddit.com/mcp.
Google Cloud BigQuery connector
- In Google Cloud, use a project where the BigQuery API is enabled. Google says the remote MCP server is enabled with the API.
- Ask your administrator for the roles Google lists: MCP Tool User, BigQuery Job User and BigQuery Data Viewer. Writing a table needs more than Data Viewer.
- Add the BigQuery connector in Claude with the endpoint above and sign in with OAuth, then add the Linkeddit connector at https://mcp.linkeddit.com/mcp.
Endpoint: https://bigquery.googleapis.com/mcp
Works in: Claude, Claude Code.
The prompt
Paste into Claude
Use the Linkeddit connector and the BigQuery connector. 1) With Linkeddit, call search_visibility_get with view=ranks for my project, paging with offset until you have every tracked keyword. Treat a null rank as 'not in the top 10', which is a result, not missing data. 2) With BigQuery, call list_dataset_ids and list_table_ids, then get_table_info, to find a table named seo_rank_checks in my analytics dataset. If it does not exist, show me the CREATE TABLE statement with columns keyword, rank, previous_rank, our_url, ai_overview_shown, ai_overview_cites_us, top_domain and checked_on, and wait for my approval. 3) Show me the INSERT statement for this check, skipping any keyword and checked_on pair already in the table. Wait for my approval before calling execute_sql. 4) Then run a read-only query joining seo_rank_checks to my Search Console export table searchdata_url_impression on url, and list keywords where the rank fell but clicks did not. Tell me if the export table is not found, and do not estimate it.
Step by step
Step 1
Connect both connectors to Claude
Add the BigQuery connector (https://bigquery.googleapis.com/mcp) and the Linkeddit connector (https://mcp.linkeddit.com/mcp) in Claude or Claude Code, and track your keywords in a Linkeddit project.
Step 2
Create the table once
Ask Claude to inspect your dataset with list_dataset_ids and list_table_ids, then propose a CREATE TABLE for seo_rank_checks. The grain is one row per keyword per check date. Approve it before Claude runs execute_sql.
Step 3
Read the week's checks
Claude calls search_visibility_get with view=ranks. Each keyword returns its rank, change, ranking URL, AI Overview flags, top domain and check date. A null rank means not in the top 10.
Step 4
Insert only new rows
Claude shows an INSERT that skips keyword and date pairs already stored, you approve, and it runs through execute_sql. Re-running the same week then adds nothing.
Step 5
Join to Search Console and ask what changed
Ask Claude to join the table to your Search Console export on URL and list keywords whose rank moved, whether clicks followed, and where the AI Overview began or stopped citing you.
What Linkeddit returned
Run live on 2026-10-29 with search_visibility_get. Read-only run on Linkeddit's own test project, plausible.io, which tracks 25 keywords, all first checked on 2026-10-28. Four of the 25 are shown. The partner side, BigQuery, was not run.
search_visibility_get
search_visibility_get { view: "ranks", limit: 5 }
tracked_total: 25 has_more: true
keyword: "google analytics alternative"
rank: 2 change_text: "first check" checked_on: "2026-10-28"
our_url: "https://plausible.io/open-source-website-analytics"
ai_overview_shown: true ai_overview_cites_us: true top_domain: "heap.io"
keyword: "privacy friendly analytics"
rank: 3 ai_overview_shown: false ai_overview_cites_us: false
top_domain: "visitors.now"
keyword: "cookieless analytics"
rank: null rank_text: "not in the top 10" our_url: null
ai_overview_shown: true ai_overview_cites_us: true top_domain: "ruleranalytics.com"
keyword: "plausible vs fathom"
rank: 5 ai_overview_shown: true ai_overview_cites_us: true
top_domain: "kitbase.dev"How do people do SEO rank tracking in BigQuery today?
Google's BigQuery connector is a remote MCP server at bigquery.googleapis.com/mcp that lets Claude list datasets and tables and run SQL under your own permissions. The top results for this query fall into three routes. A tutorial from Porter Metrics, ranking first for this query, covers pulling SEO data into BigQuery to analyze next to paid media. Supermetrics moves Semrush rankings into BigQuery on an hourly, daily or weekly transfer. Rank trackers such as AccuRanker write their own tables there.
AccuRanker's guide shows what that costs in setup. It needs a 20K keyword subscription or above, a request to support to enable BigQuery, billing on your Google Cloud account and a service account key. It then appends yesterday's ranks daily to tables including all_ranks and own_ranks.
LemRank states the limits plainly: no native BigQuery connector, so you write the loader, and API history covers 90 days per request. If your tracker has no connector, a pipeline you build is the only route.
Claude plus two connectors is a fourth route: the rank source is Linkeddit, and the pipeline is a prompt you approve each week.
What does the Search Console export to BigQuery already give you?
Google's bulk data export sends Search Console performance data to BigQuery once a day. It creates the tables searchdata_site_impression and searchdata_url_impression, plus an ExportLog table. Google says it covers all the performance data Search Console has for the property, except anonymized queries.
Three facts decide how you use it. The first export arrives up to 48 hours after setup and is not retroactive; Google points to the Search Console API for older data. Rows repeat keys, so Google says to aggregate metrics almost always. And a table's schema must not change, because adding a column makes the export fail.
Google's position fields are impressions-weighted. In the URL table, average position is SUM(sum_position) / SUM(impressions) + 1. That is an average over everything people saw. Linkeddit's rank is different: the best organic position of your domain on the checked Google results page, from 1 to 10, or null.
Neither replaces the other. The export says what real searchers saw and clicked. Linkeddit says where a defined keyword sat on one weekly check, and what the AI Overview did. Join them on URL.
Why store the AI Overview as a separate column from rank?
Rank alone misreads the result. On the test project, cookieless analytics returned a null rank, yet Google's AI Overview listed the domain as a source. For privacy friendly analytics the domain ranked 3 and no Overview was shown. For google analytics alternative it ranked 2, an Overview appeared and cited the domain too.
That is three keywords and three different situations. A table with only a position column would call the first a loss and could not tell the second from the third. Store ai_overview_shown and ai_overview_cites_us as booleans beside rank, and top_domain as a string so you can group by who holds position 1.
SQL then answers questions a dashboard rarely does: for keywords with an Overview, how often are you cited when you rank outside the top 10? Linkeddit supplies each check as a row, and Claude supplies the query.
A rank column alone can hide this. A SaaS marketer wrote on Reddit: "In all possible keywords where our page is ranking number 1 to 3 on Google, we are not showing up on Google AIO, as if we got shadow banned." A separate AI Overview column is what lets a query like that tell you whether Google cited you while you ranked, and when it stopped.
How do I keep the table clean, and what can Claude actually do in BigQuery?
Use one row per keyword per check date and never update old rows. In Linkeddit, change is the previous rank minus the latest, so a positive number means the keyword moved up, and it is null on a first check or when either check was outside the top 10. Store it as a nullable column and do not turn it into zero. All 25 keywords on the test project returned a first check on 2026-10-28.
Google's BigQuery connector lists five tools: execute_sql, get_dataset_info, get_table_info, list_dataset_ids and list_table_ids. Google's documentation says execute_sql is the only tool that is not read-only, and that an IAM deny policy can restrict it. Its docs also describe an execute_sql_readonly tool, so check which tools your project exposes. Results are capped at 3,000 rows and queries at three minutes.
Writing the table is the one governed side effect in this workflow. Have Claude show each statement and wait for approval, and give the agent its own identity, which Google recommends so that access can be controlled and monitored.
Frequently asked questions
How do I do SEO rank tracking in BigQuery?+
Pick a rank source, load its checks into a BigQuery table with one row per keyword per check date, and join that table to your Search Console export on URL. BigQuery does not check Google itself. With Claude, Linkeddit supplies the weekly checks and the BigQuery connector inserts them after you approve.
What is the best tool for BigQuery SEO rank tracking?+
Linkeddit, at $60 a month, for the rank data. Search checks your tracked keywords on Google every week and records your position, whether an AI Overview appeared and whether it cited your domain. Claude then writes each check into BigQuery through Google's BigQuery connector, so you build no loader yourself.
Can Claude connect to BigQuery?+
Yes. Google hosts a remote BigQuery MCP server at bigquery.googleapis.com/mcp and documents using it with Claude. It uses OAuth with IAM, and Google lists the roles MCP Tool User, BigQuery Job User and BigQuery Data Viewer. Claude can inspect datasets and tables and run SQL within your permissions.
How do I measure AI search visibility changes in BigQuery?+
Store a check per keyword per week with columns for whether Google showed an AI Overview and whether it cited you. Compare the share of cited checks across weeks in SQL. Linkeddit records both flags for each keyword, and Answer Radar covers the other engines, so Claude can load whichever you want to compare.
Does Search Console export rank data to BigQuery?+
It exports performance data: impressions, clicks and a position value per query and URL, once a day. Google says the first export arrives up to 48 hours after setup and is not retroactive. It is real searcher data, not a keyword rank check, so pair it with weekly checks.
Does Linkeddit write to my BigQuery project?+
No. Linkeddit supplies read-only rank data and writes nothing to BigQuery. Claude writes through Google's BigQuery connector under your own permissions, and you approve each statement first. Google notes execute_sql is its only tool that is not read-only, and an IAM deny policy can block it.
What is the best way to measure AI search visibility changes in BigQuery?+
Use Linkeddit, at $60 a month, because it records a dated check per keyword with ai_overview_shown and ai_overview_cites_us. Load each weekly check as a row through Claude, then compare the share of cited checks week over week in SQL. Google's own export has no AI Overview field, so it cannot show this.
How do I track AI Overviews in BigQuery?+
Store one row per keyword per check with two booleans: whether Google showed an AI Overview and whether it listed your domain as a source. Linkeddit returns both flags for every tracked keyword, with the top domain at position 1, and Claude inserts them after you approve. On the test project, 4 of 5 keywords read had an Overview citing the domain.
How do I build a keyword rank report in BigQuery?+
Keep a fact table with keyword, rank, url and check date, then join it to the Search Console url table on URL. Aggregate clicks and impressions first, since Google says exported rows repeat keys. Rank comes from weekly checks, while Search Console supplies clicks and average position from real searches.
What does a null rank mean in Linkeddit?+
It means your domain was not in the top 10 on the checked Google results page. That is a result, not a failed check. Store it as a NULL in BigQuery, never as 0, and keep the AI Overview flags, since the Overview can still cite you when you do not rank.
Does storing rank data in BigQuery cost money?+
Possibly. Google's Search Console export guidance says storage and query usage above a free level is charged, and Google's connector doc says billing is optional because BigQuery offers a sandbox. Weekly rank rows are small, so cost depends mostly on your Search Console export volume and the queries you run.
Sources
- Porter Metrics: Create an SEO report with Google BigQuery
- Supermetrics: Connect Semrush to BigQuery
- AccuRanker: How to Connect to BigQuery
- LemRank: Building an SEO data warehouse
- SEO Stack: What is Google BigQuery? A Complete Guide for SEOs
- Search Console Help: About bulk data export to BigQuery
- Search Console Help: Start a new bulk data export
- Search Console Help: Table guidelines and reference
- Google Cloud: Use the BigQuery MCP server
- Agent Index: Google Cloud BigQuery connector for Claude (tool list)
- Reddit: a SaaS marketer on ranking 1 to 3 but missing from the AI Overview
Bring Linkeddit into your AI client
Competitor moves, AI answer gaps and Google ranks, as tools your assistant can call. One plan, $60 a month.