Back to blog
guides11 min read

GSC BigQuery Export: Setup, the Three Tables, and Your First Queries

The bulk export is the deepest Search Console data Google gives you, and it starts from zero on setup day. The full setup, the schema, and the SQL to start with.

Aditi ChaturvediAugust 31, 2026
TL;DR

Search Console's bulk data export streams your full performance data into BigQuery daily: more of the query long tail than the API returns, plus an aggregate row for anonymized queries. It never backfills, so the setup date decides how much history you will ever own. The path:

  1. PREPARE THE CLOUD PROJECT: A Google Cloud project with billing enabled, plus the two BigQuery roles for Search Console's service account. Ten minutes if the project exists.
  2. SWITCH THE EXPORT ON IN GSC: Settings, then Bulk data export: paste the project ID, pick a dataset location you will not want to change, confirm. First tables arrive within 48 hours.
  3. LEARN THE THREE TABLES: searchdata_site_impression for property trends, searchdata_url_impression for page-level work, ExportLog for pipeline health.
  4. MIND THE ZERO-BASED POSITION: Average position is sum_position divided by impressions, plus one. Skipping the plus one flatters every ranking you report.
  5. VERIFY MONTHLY: One saved query against ExportLog confirms the data kept arriving. A silently dead export discovered a year late defeats the whole point.

Under an hour end to end, most of it waiting on Google Cloud screens. Every day you delay is a day of the deepest data you will never have.

CrawlRaven reads your Search Console data daily over OAuth and turns it into a ranked plan, which answers most day-to-day questions without SQL. The BigQuery export answers a different one: owning the raw record, forever, at full depth. This guide sets it up properly. Try CrawlRaven free: 1 site, no credit card →

There is a version of your Search Console data that is deeper than the interface, deeper than the API, and permanent. Google will stream it to you daily, free, forever. The catch is one line in the documentation most people read too late: it starts from zero on the day you enable it.

That is the bulk data export to BigQuery, shipped in February 2023 and still the least-used serious feature in Search Console. This guide is the setup done right: the Cloud project, the switch, the three tables you get, the starter SQL, and the one arithmetic gotcha that flatters every ranking by one position.

What the export gives you that nothing else does

Three things, each unavailable anywhere else in the product:

  • Depth. The export carries more of the query long tail than the API returns, so the "small" queries that never make your 25,000 API rows still land in your tables.
  • The anonymized aggregate. Anonymized queries get one combined row per day, clicks and impressions with a null query string. It is the only place their size is visible at all.
  • Permanence. The interface forgets everything older than 16 months. Your dataset forgets nothing, which is the retention argument covered in keeping GSC data past the 16-month limit.

Step 1: Prepare the Google Cloud project

The export needs somewhere to write. You need Owner permission on the GSC property and admin rights on a Cloud project:

  1. Create or pick a Google Cloud project and note its project ID, the lowercase-with-hyphens one, not the display name.
  2. Enable billing on the project. The export will not run without it, even when usage lands inside the free allowances.
  3. Grant Search Console's service account its two BigQuery roles in that project, exactly as the GSC setup screen names them. The screen shows the account address to grant; copy it rather than retyping.
  4. Set a billing alert now, while you are in the console. A threshold you never hit costs nothing; a surprise invoice costs trust in the whole pipeline.

Step 2: Switch the export on in Search Console

  1. In Search Console, open Settings → Bulk data export.
  2. Paste the project ID from step 1.
  3. Pick the dataset location deliberately. Changing it later means a new dataset, so choose the region your other data lives in.
  4. Confirm, then wait up to 48 hours for the first daily tables. Empty until then is normal.
Backfill first, export second: in plain English

The export writes forward only. If the 16 months currently visible in Search Console matter to you, capture them with a one-time API pull before you think of the export as your archive, or accept the gap permanently. The full backfill routine is step 1 of the data retention guide.

Step 3: Learn the three tables

Once data flows, the dataset holds three tables, and knowing which one answers which question saves most of the early confusion:

What arrives in your dataset

The three tables the export writes

searchdata_site_impression
One row per day, query, country, device and search type, aggregated for the whole property
Property-level trends: totals, the branded split, the anonymized share
searchdata_url_impression
The same dimensions plus the URL, so one row per page per query per day
Page-level work: decay curves, striking distance lists, cannibalization checks
ExportLog
One row per successful daily export batch
Pipeline health: the table your monthly verification query reads

The practical split: property questions ("how did clicks trend this quarter?") read the site table, page questions ("which URLs are decaying?") read the URL table, and "is this thing still running?" reads ExportLog. The URL table is much larger, so point exploratory queries at the site table first and your bill will thank you.

Step 4: Run your first three queries

Three starters cover the first month of questions. Replace the dataset name with yours:

  1. Daily clicks trend, the sanity check that data is arriving and charts match the UI roughly:
SELECT data_date, SUM(clicks) AS clicks
FROM `yourproject.searchconsole.searchdata_site_impression`
GROUP BY data_date
ORDER BY data_date DESC
LIMIT 28;
  1. Top queries with correct positions, including the plus-one:
SELECT query,
  SUM(clicks) AS clicks,
  SUM(impressions) AS impressions,
  SUM(sum_position) / SUM(impressions) + 1 AS avg_position
FROM `yourproject.searchconsole.searchdata_site_impression`
WHERE is_anonymized_query = false
  AND data_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 28 DAY)
GROUP BY query
ORDER BY clicks DESC
LIMIT 50;
  1. Your anonymized share, the number the interface never states:
SELECT
  SUM(IF(is_anonymized_query, clicks, 0)) / SUM(clicks) AS hidden_share
FROM `yourproject.searchconsole.searchdata_site_impression`
WHERE data_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY);

The zero-based position gotcha

The export's sum_position counts the top ranking as 0, not 1. Average position is therefore sum_position / impressions + 1, and the plus one is not optional: without it, every ranking you report is one position better than Search Console shows, your "position 1" rows are impossible, and someone eventually notices in a meeting.

Read before your first query

Five gotchas that cost people their first afternoon

1Position is zero-based
sum_position counts the top spot as 0. Average position = sum_position / impressions + 1, and forgetting the + 1 flatters every ranking by one place.
2No backfill, ever
Tables start on setup day. The 16 months behind you need a one-time API pull, stored separately.
3Anonymized queries are one row
is_anonymized_query = true carries their combined clicks with a null query string. Exclude or include it deliberately, never accidentally.
4First data takes up to 48 hours
An empty dataset on day one is normal. Empty on day three means the setup failed.
5Storage grows daily forever
That is the point, but set a billing alert anyway. Costs stay small at small-site volumes and quietly scale with query volume.

Step 5: Put verification on a calendar

A retention pipeline's worst failure is silent death. Monthly, thirty seconds:

  • Check ExportLog has rows for last month. That is the whole check; save the query from step 4 style and rerun it.
  • Spot-compare one number against the Search Console UI, same property and date range. Expect close, not identical: anonymized handling and provisional recent days differ by design.
  • Re-annotate property changes. A move to a new domain property starts a new data lineage, and the note belongs in your SEO annotations the day it happens.

Tips before the dataset grows

  • Query the site table by default. It answers most questions at a fraction of the URL table's scan cost.
  • Always filter by data_date. The tables are date-partitioned, and a date filter is the difference between scanning a month and scanning the archive.
  • Decide the anonymized row's fate per query. Include it for totals, exclude it for query-level analysis, and be consistent, or your own numbers will disagree with each other.
  • Save every query you run twice. The saved-query list becomes your reporting layer faster than you expect.
  • Chart it if SQL fatigues you. Looker Studio pointed at your own dataset shows unlimited history, which the stock GSC connector never can.
Opinion· The best free SEO decision most teams never make
The export costs nearly nothing, takes an hour, and quietly builds the only complete record of your search performance that will exist. Teams skip it because the payoff is years away and the setup screen says BigQuery. Enable it the week you read this; the you of 2028 either owns three years of data or owns an excuse.

Why the export looks broken, and what to check

  • Dataset empty past 72 hours? The setup failed quietly. Recheck the pasted project ID, the service account roles, billing enablement, and that your GSC permission is Owner, then redo the Bulk data export screen.
  • Numbers never quite match the UI? By design. Anonymized queries, provisional recent days and different aggregation levels each contribute small gaps. Alarm at large divergence, not at pennies.
  • Costs creeping up? Almost always unfiltered queries over the URL table. Add date filters, query the site table where possible, and check nothing scheduled is scanning the full archive nightly.
  • A gap in the dates? Check ExportLog for the missing days, and whether the window is still inside GSC's 16 months. If it is, an API pull patches it; if not, the gap is permanent, and it argues for the monthly verification you skipped.

Where this fits in the toolchain

  • The export is the archive: raw, complete, permanent, and yours to query.
  • CrawlRaven is the reading layer for decisions: the same Search Console data synced daily, joined to GA4 and a 200-point crawl, returned as a ranked plan with annotations on the timeline. The warehouse tells you what happened; the join tells you what to fix first, like which archive rows are really striking distance keywords worth a push this month.
  • Free, on this site: the GSC regex generator builds the brand patterns your WHERE clauses will borrow for the branded split.

Enable it this week, run the three starter queries, put the verification on the calendar, and let it grow. The export is the rare SEO task you do once and benefit from for the life of the site.

Frequently asked questions

What is the Search Console bulk data export to BigQuery?

A daily feed Google added in February 2023 that writes your Search Console performance data into a BigQuery dataset you own. It carries more of the query long tail than the interface or API surface, includes a daily aggregate row for anonymized queries, and keeps accumulating for as long as the export stays on, which is what makes multi-year search analysis possible.

Does the BigQuery export include data from before I enabled it?

No. The export writes forward from the day you switch it on and never reaches backwards. The 16 months visible in Search Console today have to be captured separately with a one-time API pull if you want them, which is why the right order is backfill first, then enable the export.

How much does the Search Console BigQuery export cost?

The export itself is free; you pay Google Cloud's usage-based rates for BigQuery storage and queries. At small-site volumes both stay small, and BigQuery's free monthly allowances often cover them entirely. Set a billing alert on the project when you enable the export, so growth becomes a notification rather than a surprise invoice.

What tables does the export create?

Three. searchdata_site_impression holds property-level rows per day, query, country, device and search type. searchdata_url_impression adds the URL dimension, one row per page per query per day, and is where page-level analysis lives. ExportLog records each successful daily export, which makes it the table to check when you suspect the pipeline stopped.

Why is my average position wrong in BigQuery queries?

Almost certainly the zero-based position. The export's sum_position field counts the top ranking as 0, so average position is sum_position divided by impressions, plus 1. Skipping the plus one makes every ranking look one position better than Search Console reports, and it is the most common first-query mistake.

Why is my BigQuery dataset empty after enabling the export?

The first tables can take up to 48 hours to appear, so an empty dataset on day one is normal. Still empty after three days means the setup failed: recheck the project ID pasted into Search Console, confirm the service account was granted its BigQuery roles in the right project, and confirm you hold Owner permission on the property.

Do I need to know SQL to use the export?

For anything beyond charting, yes, at a basic level: the data arrives as tables, and questions are SELECT statements. The three starter queries in this guide cover totals, top queries and the anonymized share, and they are copy-paste editable. If SQL is a hard no, a connected reporting tool or Looker Studio on top of the dataset does the reading for you.

Aditi Chaturvedi
About the Author

Aditi Chaturvedi

15+ years of growing SaaS websites through SEO | Author, 200-Point Audit Checklist

Aditi has spent 15+ years helping SaaS companies scale organic traffic through technical SEO and content strategy. She is the author of the CrawlRaven 200-Point Audit checklist used by agencies and in-house teams to systematically improve search performance.

gsc bigquery exportsearch console bulk data exportsearch console bigquerygsc bulk export setup

Reader has enabled the BigQuery bulk export and can now query raw Search Console data, but the export delivers rows, not priorities: which page to fix first still requires joining crawl and engagement context.

The warehouse holds the record. The join reads it.

Daily GSC and GA4 sync, a 200-point crawl, one ranked plan. From $49 at launch, one time.

BigQuery gives you every row; it does not tell you Tuesday's priority. CrawlRaven reads the same Search Console data daily, joins it to GA4 engagement and crawl findings, and returns the ranked list of what to write, update and fix, with the evidence attached. Keep the export for the archive; use the join for the plan. Free plan covers 1 site, no credit card.

CrawlRaven connects Google Search Console and GA4, runs 200+ technical SEO checks, and joins all three into one prioritized fix list, so you know what is broken, what it is costing you, and what to fix first.

✓ No credit card required·200+ checks·GSC + GA4 + full-site crawl
Free plan — no credit card

Stop exporting. Start shipping.

Connect Search Console, import your Ahrefs or Semrush lists, and get one ranked plan. Start free with one site, or grab a limited lifetime deal from $39, only 10 licenses left.

3
Data sources joined
200+
Point audit checks
1
Ranked plan out