Connect Google Search Console to Looker Studio — and what to do when it hits the wall
Search Console is one of the few sources Looker Studio connects to natively, for free, in about ninety seconds. This guide does that part properly — the exact steps, plus the one setup choice that quietly decides which questions your dashboard will be able to answer for the rest of its life. Then it covers the four walls every Search Console dashboard eventually runs into, because "free and native" is not the same as "sufficient".
Connect it: the actual steps
You need a verified Search Console property and a Google account with at least restricted access to it. Then:
- In Looker Studio, choose Create → Data source and search for Search Console. It's a Google-built connector, so it sits near the top of the list with no partner badge and no price.
- Authorize the connector against the Google account that has access to the property.
- Pick the property. The list shows both domain properties (
sc-domain:example.com) and URL-prefix properties (https://example.com/). - Pick the table type — Site Impression or URL Impression. This is the choice that matters; the next section is entirely about it.
- Pick the search type — Web, Image, Video or News. It's fixed per data source, so a report that needs Web and Image needs two data sources.
- Connect, then Create report. Drop in a time series of clicks and you have a working dashboard.
The property picker is a trap worth naming. A domain property aggregates every subdomain and both protocols; a URL-prefix property counts only the exact prefix it was verified on. They are different datasets that produce different numbers for the same site, and a chart built on the wrong one looks completely plausible. Pick the one your team actually reports on, and write the choice down somewhere the next person will find it.
The choice that costs you later: Site Impression vs URL Impression
The connector asks you to pick one of two tables, and the difference is not cosmetic:
- Site Impression gives you Query, country, device and date — but no landing page.
- URL Impression gives you Landing Page, country, device and date — but no query.
Which means the single most natural SEO question there is — which queries bring traffic to this page? — cannot be answered by one Search Console data source in Looker Studio. Not by a clever chart, not by a calculated field. The pair simply isn't in either table.
The usual workaround is to create both data sources and blend them. It doesn't work, and it's worth understanding why rather than blaming your setup: a blend joins on the fields the two tables share — date, country, device — and the query-to-page relationship was never in either side to begin with. What comes back is a cross product wearing a table's clothes: every query multiplied against every page for that day, with numbers that look specific and mean nothing.
The API can do it. The connector chooses not to.
Here's the part that reframes the whole problem. Search Console's own Search Analytics API accepts query and page as dimensions in the same request. Anything reading that API directly can hand you the pair. The two-table split is a decision made inside the Looker Studio connector, not a limit in the data.
So the fix isn't a better chart. It's reading the same API somewhere that doesn't make you choose.
The four walls, in the order you'll hit them
1. Sixteen months, hard stop
Search Console retains roughly sixteen months of performance data. Looker Studio queries it live, so your dashboard's history is Search Console's history — there is no archive behind it. The first time someone asks for a two-year seasonality comparison, the answer is that the data no longer exists anywhere unless you were storing it yourself the whole time.
2. Anonymized queries mean the numbers never reconcile
Search Console filters out very low-frequency queries for privacy reasons. The consequence catches people out constantly: the sum of a query-level table will always be smaller than the site-level clicks card on the same page. Neither number is wrong; they're different populations. But a stakeholder staring at two totals that disagree will ask about it every single month, and a "top queries" chart is quietly omitting the entire long tail while looking complete.
3. The last two days aren't final
Search Console publishes fresh data within hours and then revises it upward as processing completes. A Monday dashboard that includes yesterday is showing a provisional number that Google will raise later in the week. Nothing on the Looker Studio canvas marks which rows are still settling — the sparkline dips at the right edge and someone reads it as a drop.
4. It stays in the canvas
Every new question is a new chart, built by hand, by whoever has edit rights. A blend tops out at five data sources and gives you join semantics rather than SQL. So when the question becomes "how did organic clicks track against paid spend last quarter", you are reconciling two dashboards by eye — which is exactly the moment people start wondering whether the canvas is the right container at all. We took that argument further in Looker Studio alternatives.
The other route: read the same API where you can join it
TableBI connects Search Console through the same OAuth flow, then keeps the data in two altitudes: search_console_raw, the lossless per-platform table with every dimension the API returns, and facts, where clicks and impressions sit in the same cross-channel definitions as your ad platforms. Setup is three commands:
# install the CLI and teach your agent to drive it npm i -g @tablebi/cli tablebi login tablebi install # browser opens for OAuth, then the backfill syncs in tablebi connect gsc --site sc-domain:example.com # confirm what landed, and how fresh it is tablebi sources
Now the query Looker Studio can't express is one statement — query and page in the same result set, no blend, no cross product:
# which queries bring impressions to which pages? tablebi ask "SELECT query, page, SUM(clicks) AS clicks, SUM(impressions) AS imp, AVG(position) AS pos FROM search_console_raw WHERE date >= (SELECT MAX(date) FROM search_console_raw) - 28 GROUP BY query, page ORDER BY imp DESC LIMIT 50"
Two details in that query are deliberate. The date filter anchors on MAX(date) rather than today's date — because of wall #3, "today" is not a row that exists yet, and anchoring on the calendar gives you an empty window every morning. And every answer comes back with a trust block: how fresh each source is, plus the caveats that matter here — that the last two days are provisional, and that query-level sums fall short of site totals by design. Your agent reads those and stops confidently reporting a revision as a decline.
If you want the full Search Console workflow rather than just the connection, that's Claude Code for SEO; if what you actually wanted was the raw API without writing an OAuth client, see the Search Console API alternative.
The question the canvas can't reach
The reason to move Search Console out of its own dashboard is rarely Search Console. It's that organic is one line in a picture that also contains paid, and the blend cap is where that picture stops being buildable:
# organic clicks next to paid spend, one result, same definitions tablebi ask "SELECT platform, SUM(clicks) AS clicks, SUM(cost) AS spend FROM facts WHERE date >= (SELECT MAX(date) FROM facts) - 28 GROUP BY platform ORDER BY clicks DESC"
Pin it to a live URL
When a view is worth keeping, pin it. What gets stored is the query, not a snapshot — so the URL refreshes itself every time the source syncs:
tablebi pin --title "Search Console — 28 days" \ --widget "Daily clicks::line=SELECT date, SUM(clicks) AS clicks FROM search_console_raw …" \ --widget "Top query × page=SELECT query, page, SUM(impressions) AS imp FROM search_console_raw …" ✓ published → https://dk.tablebi.com/d/dsh_… (public, read-only, self-refreshing)
Here's a real one — live Search Console data across a portfolio of sites, pinned exactly this way. Not a mockup; it refreshes as the sources sync: