See it work
AI SEO & GEO · 2026-06-12 (updated 2026-07-10) · 11 min read · WildRun AI

Google Search Console BigQuery Export: Complete 2026 Guide

Learn how to set up Google Search Console BigQuery export, understand the three data tables, avoid the anonymized query trap, and run your first SQL queries.

Google Search Console BigQuery Export: Complete 2026 Guide

If you manage a website's SEO and rely on Google Search Console's standard interface, you are working with a filtered view of your own data. The default UI limits keyword reports to roughly 1,000 rows per query, clips history at 16 months, and silently omits queries that don't meet Google's privacy threshold. The bulk data export to Google BigQuery removes the row cap, extends your storage window indefinitely, and opens a SQL interface that lets you ask questions the dashboard cannot answer.

This guide covers what the export actually includes, how the three core tables work, what the setup requires, how to keep query costs under control, how to catch a broken export before it costs you a month of data, and where the approach falls short. The goal is to help you decide whether it's worth the effort — not to convince you it always is.

What the bulk data export actually gives you

Google launched the Search Console bulk data export in early 2023. Once configured, it sends a complete daily snapshot of your property's search performance data to a BigQuery dataset inside your own Google Cloud project. You own the data; Google just writes to it.

The defining advantage over other export methods is no row limit. The Search Console API caps responses at 25,000 rows per request, which means large sites never see their full keyword picture. The bulk export sends every row — every query, every page URL, every country-device combination — for each day. For sites with millions of keyword impressions, this is the most complete organic search dataset Google provides.

What it doesn't give you: real-time data, retroactive history, or a fix for anonymized queries. Data arrives once per day, typically within a few hours of midnight UTC. The export starts from the day you configure it — historical data does not backfill. And the anonymized query problem (more on this below) follows you into BigQuery exactly as it exists in the standard interface.

The three tables you need to understand

Every bulk data export populates three tables in your BigQuery dataset. Knowing which table answers which question saves time and keeps query costs predictable.

searchdata_site_impression

This table aggregates data at the site level. Each row is a unique combination of query, country, device, search type, and date — there is no page URL dimension here. It's the right starting point for keyword trend analysis, CTR benchmarking, and understanding which query categories drive traffic over time.

Core columns: query, country, device, search_type, data_date, impressions, clicks, and sum_top_position. Average position is calculated by dividing sum_top_position by impressions and adding 1 — it's not stored directly. This table is the most affordable to query and should be your default starting point.

searchdata_url_impression

This table adds the page URL dimension. Each row is a unique combination of query, URL, country, device, search type, and date. It also includes boolean fields — is_organic, is_video, is_image_top_stories, is_job_listing, is_amp_top_stories — that let you segment performance by result type, plus around three dozen dimension and metric columns in total. This is the table you use when you need to answer questions like "which pages rank for which queries" or "how does video result placement affect CTR."

This table is significantly larger than the site-level table and can be expensive to query without proper filtering. Always add a WHERE data_date >= clause before running queries. Scanning the full table without a date filter on a busy site can process gigabytes of data in a single run and generate a real bill.

ExportLog

A lightweight audit table that records which dates loaded successfully and flags any errors. It's not used for analysis, but it's the first place to check when your data seems to have a gap. If a day's data is missing from your performance queries, check ExportLog before assuming a query bug — though note it only confirms whether a date loaded, not the cause of a failure (see the monitoring section below for that).

Setting up the export: the exact steps

Setup requires actions in two separate Google products. Both must be completed before data starts flowing.

Google Cloud side

Create a Google Cloud project and enable billing. BigQuery requires an active billing account even to receive the export — there is no billing-free path. Once billing is active, enable the BigQuery API and BigQuery Storage API from the API Library.

Then grant the Search Console export service account the permissions it needs to write to your project. Add search-console-data-export@system.gserviceaccount.com as a principal with two IAM roles: BigQuery Job User (at the project level) and BigQuery Data Editor (at the dataset or project level). Missing either role will cause the export to fail silently.

Search Console side

In Search Console, open Settings → Bulk data export. Enter your Google Cloud project ID, choose a dataset region (select one geographically near where you'll run queries — us-central1 is the most cost-efficient for most US-based teams), and confirm. Google typically confirms whether the export succeeded within 48 hours and emails property owners either way.

Total setup time is typically 20–30 minutes. The first day's data generally arrives within a day or two of completing the configuration. There is nothing to do in between except wait.

Monitoring the export and troubleshooting failures

Setup is not "configure once and forget." When a non-transient error interrupts a day's export, Search Console retries the next day, and it holds onto the unexported data for about a week before dropping it for good — so a short blip rarely costs you data, but a week-long outage does.

Two things matter for catching problems early. First, export errors surface on the Bulk data export settings page inside Search Console itself, not inside BigQuery — the ExportLog table records which dates loaded, not why a date failed. Second, if you need more detail than a pass/fail signal, Cloud Logging captures the underlying export activity; filtering Cloud Logs Explorer for search-console-data-export surfaces the service account's write attempts and any permission or quota errors behind them.

After fixing a configuration issue, Search Console's Test report button checks project access and permissions immediately, but it does not trigger a new export and cannot catch quota-related failures on its own — check back about a day later to confirm the next scheduled export actually succeeded. Platform-level outages do happen: Search Engine Roundtable reported a widespread bulk export outage that left properties without fresh data for over a week, which is a good reason to spot-check the ExportLog table periodically instead of assuming the pipeline is silently healthy.

The anonymized query problem — set honest expectations here

This is the limitation that most guides undersell. Google anonymizes queries that don't meet its privacy threshold — searches made by too few users to report without potentially identifying an individual. The exact cutoff is not published, and it varies by property, country, and search type.

A 2025 analysis tracking 22 billion clicks found that 46.77% of Search Console data was anonymized as of April 2025. Nearly half the clicks in that dataset were attached to queries that could not be identified. This figure varies widely by site — enterprise e-commerce sites skew lower; niche professional services sites skew higher.

The BigQuery export does not improve this number. It exports the same data that Search Console holds — including anonymized queries that appear as blank strings or are simply absent from the query dimension. If you believe BigQuery will surface the hidden keyword data your Search Console interface isn't showing, it will not.

For businesses serving specific local markets — a specialty outdoor retailer in Bend, OR, a regional contractor in Central Oregon — the anonymized rate is often above average because individual niche queries naturally see fewer total searches nationwide. This is worth modeling before you invest time in the setup.

Your first two useful SQL queries

Once data starts arriving, these two queries give immediate signal. Both use the site-level table to minimize query costs. Replace your_project with your actual Google Cloud project ID.

Top queries by clicks — last 30 days

SELECT
  query,
  SUM(clicks)       AS total_clicks,
  SUM(impressions)  AS total_impressions,
  ROUND(SUM(clicks) / NULLIF(SUM(impressions), 0) * 100, 2) AS ctr_pct,
  ROUND((SUM(sum_top_position) / SUM(impressions)) + 1.0, 1) AS avg_position
FROM `your_project.searchconsole.searchdata_site_impression`
WHERE data_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
  AND search_type = 'WEB'
GROUP BY query
ORDER BY total_clicks DESC
LIMIT 100;

Month-over-month click trend by search type

SELECT
  search_type,
  DATE_TRUNC(data_date, MONTH) AS month,
  SUM(clicks)       AS monthly_clicks,
  SUM(impressions)  AS monthly_impressions
FROM `your_project.searchconsole.searchdata_site_impression`
WHERE data_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 6 MONTH)
GROUP BY 1, 2
ORDER BY 2 DESC, 3 DESC;

For visualization, connect Looker Studio directly to your BigQuery dataset rather than exporting to Sheets. This avoids size limits and keeps dashboards current without manual refreshes. Looker Studio's BigQuery connector is free and handles authentication through your Google account.

Once your pipeline is stable, filtering by search appearance type — to isolate AI Overview impressions and clicks separately from standard blue-link results — becomes one of the most valuable analyses available. The strategic context for why that matters is in our guide to ranking in Google AI Overviews.

Querying efficiently: partitioning, clustering, and avoiding surprise bills

Both searchdata_site_impression and searchdata_url_impression are partitioned by data_date. That structure only saves money if your queries take advantage of it — a query that skips the date filter forces BigQuery to scan every partition in the table. Four habits keep costs predictable:

Filter on data_date first. Every query should include a WHERE data_date >= ... clause before any other condition. This is the single biggest cost lever — a query scanning 24 months of the URL-level table without a date filter can process the entire table on every run.

Never SELECT *. BigQuery charges by bytes scanned per column, not per row. Pulling every column from searchdata_url_impression, which carries roughly three dozen dimension and metric fields, costs far more than naming the five or six columns you actually need.

Check the estimated bytes processed before running. The BigQuery console shows an estimate as you type, before you click Run. For any query touching the URL-level table, glance at that number first; if it's in the hundreds of gigabytes, add a filter and check again.

Remember rows are not pre-aggregated. Search Console does not guarantee the export consolidates rows by date, query, or URL — the same query and URL combination can appear on more than one row for a given day. Always wrap metrics in SUM() and GROUP BY the dimensions you care about; treating a raw row count as a metric will overstate your numbers.

What BigQuery actually costs for this use case

The Search Console bulk data export is free. BigQuery charges for two things once you enable billing.

Storage runs approximately $0.02 per GB per month for active data, dropping to $0.01/GB for long-term storage (data untouched for 90+ days). A mid-size site exporting two years of daily data typically lands in the 5–20 GB range — that's under $5/month in storage costs.

Query processing is priced at $5 per terabyte on the default on-demand model, with the first 1 TB free each month. Most analysis queries against the site-impression table for a single property cost fractions of a cent. The expensive queries are those that scan the full URL-impression table without a date filter. One accidental full-table scan on a large property can process hundreds of gigabytes and generate a real charge. Always scope your date range first.

You can set dataset-level partition expiration to automatically delete data older than a defined threshold — useful if you want to cap storage costs and don't need multi-year history. See the BigQuery partition expiration documentation for the two-line configuration.

When this is NOT the right solution

Your site gets fewer than a few hundred clicks per day. At low traffic volumes, the anonymized query share dominates the dataset. You will spend setup time and pay storage costs to maintain a dataset where roughly half the queries are unidentifiable. The standard Search Console interface gives equivalent signal with no infrastructure overhead.

You need data from before your setup date. The export is not retroactive. There is no mechanism to import the 16 months of data Search Console already holds. If pre-setup history is essential, third-party connectors like Supermetrics can pull historical data into BigQuery via the Search Console API — but they face the same 25,000-row API limit, so large sites will still see incomplete history.

No one on your team writes SQL. BigQuery's value is entirely in what you query. The data will accumulate unused if there's no SQL capability in-house. Looker Studio can bring a visual layer to the data for non-SQL users, but segmenting by specific dimensions, calculating derived metrics, and joining to other data sources all require SQL.

You want an out-of-the-box SEO dashboard. Tools like SEMrush and Ahrefs provide richer competitive intelligence, rank tracking, and pre-built reporting with zero infrastructure setup. If your goal is weekly traffic monitoring rather than custom data pipelines, those tools are a more direct path.

Making it work once the data is flowing

The teams that extract durable value from GSC BigQuery exports treat it as infrastructure, not a one-time report. You configure it once, let it accumulate months of consistent data, and then query it as specific business questions arise: did the site migration hurt mobile CTR? Which informational queries drive high impressions but zero conversions? Which pages are losing ranking for their target queries over a 6-month window?

The real payoff comes from joining GSC data with other first-party sources — your CRM, booking records, or call logs. Search query volume tells you what people searched; downstream conversion data tells you what search actually produced. The ROI calculator on this site shows how that kind of search-to-outcome attribution changes how you evaluate content and SEO investment.

A concrete join: GSC and GA4 in the same query

If your GA4 property also has its BigQuery export enabled, both datasets live in tables you control, which means a direct SQL join instead of exporting each tool separately and reconciling numbers in a spreadsheet. Match GSC's data_date against GA4's daily event tables, for example:

SELECT
  s.query,
  s.data_date,
  SUM(s.clicks)      AS gsc_clicks,
  SUM(s.impressions) AS gsc_impressions,
  COUNT(DISTINCT g.user_pseudo_id) AS ga4_sessions
FROM `your_project.searchconsole.searchdata_site_impression` s
LEFT JOIN `your_project.analytics_XXXXXXXX.events_*` g
  ON PARSE_DATE('%Y%m%d', g._TABLE_SUFFIX) = s.data_date
  AND g.event_name = 'session_start'
WHERE s.data_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
GROUP BY 1, 2
ORDER BY gsc_clicks DESC;

That single query answers a question neither tool answers alone: which queries drive search visibility that actually converts into sessions, versus queries that generate impressions with no downstream engagement.

Understanding how raw GSC data fits into a search strategy that accounts for AI-generated results, answer engines, and LLM citations is a separate but related challenge. Our overview of SEO vs. AEO vs. GEO lays out how the measurement frameworks differ across each channel.

If you want help connecting search data infrastructure to actual business outcomes — including how AI-assisted analytics can surface the signal buried in your anonymized query share — book a demo and we can walk through what makes sense for your property size and goals.

Frequently asked questions

Does the Google Search Console BigQuery export include anonymized queries?

No. The export includes all data that Search Console holds, but anonymized queries — those not issued by enough users to meet Google's privacy threshold — still appear as blank strings or are absent from the query dimension. A 2025 analysis found roughly 47% of clicks across a large sample came from anonymized queries. BigQuery does not fix this.

How far back does the BigQuery export go?

The export is not retroactive. It starts from the day you configure it and accumulates forward. Search Console holds up to 16 months of data in its own interface, but none of that historical data is automatically backfilled into BigQuery. You need to have started the export to have the data.

What does the Google Search Console BigQuery export cost?

The export itself is free. BigQuery charges approximately $0.02 per GB per month for storage and $5 per terabyte of query processing, with the first 1 TB per month free. For a typical single-property setup, storage costs are a few dollars per year and most queries stay within the free processing tier.

What is the difference between searchdata_site_impression and searchdata_url_impression?

searchdata_site_impression aggregates by query, country, device, and search type — no page URL. It's the cheaper table to query and the right starting point for keyword analysis. searchdata_url_impression adds the page URL and roughly three dozen dimension and metric fields, including boolean flags for result types like video and image results, but is larger and more expensive to query.

How often does Search Console data arrive in BigQuery?

Data loads once per day, typically within a few hours of midnight UTC. There is no real-time or intraday refresh. If you need same-day data, the bulk export is not the right tool.

Do I need SQL skills to use the BigQuery export?

You need basic SQL to get meaningful value from the data. The setup itself is straightforward and takes about 30 minutes, but querying, segmenting, and joining the data all require SQL. Looker Studio can connect to the dataset for visual dashboards, but custom analysis requires someone who can write queries.

Can I join Google Search Console BigQuery data with Google Analytics 4 data?

Yes. Both the GSC bulk export and the GA4 BigQuery export write to tables inside your own Google Cloud project, so you can join them directly in a single SQL query instead of exporting each tool separately and reconciling numbers by hand. The common join key is date, matched against GA4's daily event tables, which lets you connect search impressions and clicks to downstream sessions and conversions.

Ready to stop losing calls?

Free 30-minute consult. We build a live mockup of your agent on the call — no slides.

Book Your Free Demo