Blog · Connectors

GA4 to Tableau: every route, what each one costs, and what each one gets wrong

Published · 17 min read

To connect Google Analytics 4 (GA4) to Tableau, use Tableau's own Google Analytics 4 connector: under Connect, choose Google Analytics 4 (install it from Additional Connectors the first time), sign in with a Google account that can read the property, pick the account and property, set a date range, add dimensions and metrics, and Tableau loads the result as an extract. For one property and a modest report that is the right first try, with two catches. The connector can't query live, so every refresh goes back to the GA4 Data API and spends the property's quota, and its Tableau Exchange listing is now titled “Google Analytics 4 - Deprecated”, with a replacement due in release 26.3. Three other routes exist: GA4's BigQuery export, free to link and read through Tableau's BigQuery connector; a paid partner connector such as Windsor.ai, Coupler.io or CData; and a manual CSV export. TableBI is a fifth route of a different kind: it is not a Tableau connector, and it answers recurring GA4 questions outside Tableau. Below, each route is priced in money and upkeep, followed by the costs nobody quotes: licences, quota, withheld rows and numbers that don't match.

Route 1 — Tableau's own Google Analytics 4 connector

Tableau builds and supports a Google Analytics 4 connector, and Tableau's help page for it lists Tableau Cloud, Tableau Desktop and Tableau Server. It took over from Tableau's older Google Analytics connector, built for Universal Analytics, whose own page now says GA4 properties aren't supported. The connector reads the core reporting side of the Google Analytics Data API; cohort, pivot, realtime and funnel reports are not supported.

Setup, in six steps

  1. Under Connect, choose Google Analytics 4 from Additional Connectors, select Install and Restart Tableau, then choose it again from Installed Connectors. Its Tableau Exchange listing requires Tableau 2023.3 or later.
  2. Sign in with a Google account that can read the property, and tick the permission that lets Tableau see and download your Google Analytics data.
  3. Select the account and the property.
  4. Set the date range: fixed start and end dates, a range relative to a fixed start date, or a range relative to the refresh date, which moves every time the extract refreshes.
  5. Add dimensions and metrics. Some combinations are invalid, and Tableau points to Google's Dimensions & Metrics Explorer to check which ones work together.
  6. Open a sheet. Tableau creates the extract at that moment, and new data arrives only when that extract refreshes.

On Tableau Server, installing is an administrator's job. Salesforce's support article To Configure the Google Analytics 4 Connector in Tableau Server says the connector's .taco file must be copied into the server's Connectors directory and the server restarted, and that custom OAuth has to be configured for the site as well as for the server. Tableau's Google OAuth guide for Server adds that the OAuth client's Google Cloud project needs both the Google Analytics Admin API and the Google Analytics Data API enabled. On any deployment, Tableau's help page recommends a custom OAuth client, which it says frees you from Tableau's release cycles and its OAuth client rotation schedule.

What it costs

No connector fee. The spend is the Tableau licence of whoever builds the data source, because Tableau reserves creating and publishing new data sources for the Creator role; the licence section below prices that.

What it gets wrong

It cannot connect live. Tableau's help page says it supports only extracts for GA4, so a dashboard shows whatever the last refresh fetched. A refresh that is not set up as incremental is a full refresh, which, per Tableau's extract refresh documentation, replaces every row with data fetched from the source again. For this connector that means a new round of Data API requests covering the whole date range.

Every refresh draws on the property's quota. Tableau's help page says the connector is subject to the Data API's Core quotas. Google's quota table gives a standard GA4 property 200,000 Core tokens per day and 40,000 per hour, allows one Google Cloud project at most 14,000 tokens per property per hour, and caps concurrent requests at 10 per property. Most requests cost 10 tokens or fewer, but Google names more rows, more dimensions and metrics, complex filters, long date ranges, high-cardinality dimensions such as page path, and busier properties as reasons a request costs more. Daily quotas reset at midnight Pacific Standard Time.

Older copies stop at 10,000 rows. The connector's changelog on Tableau Exchange says version 1.1.0 fixed extracts that were limited to 10,000 rows of data, so a .taco file copied into a repository long ago is worth checking; the current version is 1.2.1.

The trap: Tableau is deprecating this connector. The Tableau Exchange listing is titled “Google Analytics 4 - Deprecated”, says Tableau is deprecating the connector for security reasons, and says a replacement connector will launch in release 26.3. On September 26, 2026, the newest Tableau Desktop version on Tableau's releases page was 2026.2.3. The listing says nothing about moving existing data sources to the replacement, so keep a list of every workbook built on this connector before that release lands.

Verdict: the fastest start for one property, a few dimensions and a daily extract, with a move to the replacement pencilled in. For page-level detail over long ranges, or several reports leaning on one property, look at route 2.

Route 2 — GA4's BigQuery export, then Tableau's BigQuery connector

GA4 can export raw events to a BigQuery project you own, and Tableau reads BigQuery through its Google BigQuery connector, which signs in with OAuth or a service-account key file and can query live; because of BigQuery's data volumes, Tableau recommends a live connection. From then on Tableau queries BigQuery, not the Data API, so refreshes no longer touch the property's API quota.

Setup, in five steps

  1. In Google Cloud, create or choose a project and enable the BigQuery API.
  2. In GA4, open Admin → Product links → BigQuery links and link the project. Google's setup guide requires at least the Editor role on the property and Owner access to the Cloud project.
  3. Choose a data location, the streams and events to export, and a daily export, a streaming export, or both.
  4. Wait: data should reach BigQuery within 24 hours of linking, and the daily export then delivers the previous day's events once a day.
  5. In Tableau, connect with Google BigQuery and open the dataset named analytics_<property_id>, where each day is its own events_YYYYMMDD table, per the BigQuery Export schema.

What it costs

Linking carries no GA4 fee. According to Google's BigQuery Export overview, the daily export handles up to 1 million events a day on a standard property, while the streaming export has no volume limit and adds $0.05 per gigabyte, which Google puts at roughly 600,000 events. BigQuery bills storage and queries above a free tier of 10 GiB of storage and 1 TiB of query processing a month, per BigQuery pricing as of September 2026. The BigQuery sandbox needs no credit card or billing account, but every table in it expires after 60 days, it supports neither streaming nor the Data Transfer Service, and its 10 GiB of storage is a lifetime allowance that expired tables do not give back, so a sandbox export holds at most the latest two months and stops growing once that allowance is spent.

On the Tableau side, the bill follows bytes scanned. A live data source over the events_* wildcard reads every daily table unless its custom SQL filters on _TABLE_SUFFIX, which BigQuery's wildcard-table documentation says can greatly reduce the bytes scanned.

The trap: the export starts the day you link. Google's setup guide describes data arriving within 24 hours of linking and a daily file of the previous day's events, and describes no export of the days before. Days missed because of an invalid payment method cannot be re-exported, and a standard property that keeps exceeding the million-event cap has its daily export paused, with the missed days not reprocessed. If a Tableau project is even likely, link the property now.

What it costs in upkeep

Modelling. Event parameters sit in a repeated event_params record that has to be unnested in SQL. Google's guide to UI-versus-export differences counts sessions as unique combinations of user_pseudo_id or user_id with ga_session_id, and warns that adding up per-day session counts double counts sessions that span more than one day. Each property exports to its own dataset, so a view across several properties is a UNION ALL across datasets in custom SQL.

A Google-native backfill: the Data Transfer Service

When report-level tables are enough, the BigQuery Data Transfer Service connector for GA4 copies GA4 report data into BigQuery on a daily schedule, as tables for ten standard reports including Traffic acquisition, Landing page, and Pages and screens, per Google's report transformation reference. Google says a GA4 transfer costs nothing to run beyond BigQuery storage and queries, and a backfill run can reach as far back as GA4's data retention allows, which the raw export cannot. The limits: it reads the Data API, so it spends the same property quota as route 1; a transfer takes one custom report, with at most 9 dimensions and 10 metrics and no custom dimensions; and Google warns that aggregated totals of distinct users and sessions may not match GA4.

Verdict: the sturdiest route for anyone who can own a Cloud project, the SQL and a billing alert. Link GA4 to BigQuery today, even if the Tableau work is months away.

Route 3 — a partner connector

Partners sell the GA4-to-Tableau hop, and the part to inspect is how their data enters Tableau:

  • Windsor.ai fills a Google Sheet that Tableau reads through its Google Drive connector. Its GA4-to-Tableau page recommends that path, saying Tableau has temporarily halted external connectors, and its pricing page says Tableau connects via Google Sheets or a database. Drive is the door because Tableau's own Google Sheets connector was fully deprecated in mid-2023. As of September 2026, Windsor.ai's pricing page listed Basic at $19 a month billed annually or $23 month to month, for 3 data sources, 75 accounts and a daily scheduled sync; its free plan retrieves only the past 30 days.
  • Coupler.io passes Tableau an integration link through Tableau's Web Data Connector, according to its GA4-to-Tableau guide, with up to 9 dimensions and 10 metrics per report. Tableau deprecated Web Data Connector 2.0 in the 2023.1 release, and its connector documentation says Tableau Cloud can't refresh a web data connector extract itself; Tableau Bridge can refresh some. As of September 2026, Coupler.io's pricing page listed Starter at $24 a month billed annually or $32 month to month, for 3 accounts, 1 destination, a daily refresh and 5,000 rows per run.
  • CData sells a Tableau connector for Google Analytics that supports GA4, with live or extract connections in Tableau Desktop, Server, Bridge and Prep. Its product page says Tableau Cloud doesn't support custom connectors, so Cloud users are pointed to CData Connect AI instead. As of September 2026, CData's order page listed a desktop licence at $499 a year, with server licences by quote.

What it costs: a subscription or licence for as long as the dashboards exist, priced by accounts, sources, rows or seats. What it gets wrong: a vendor fixes the plumbing, not GA4. A partner reading the Data API still spends the property's quota and still receives thresholded and (other) rows, and each hop above carries its own Tableau limit: a sheet read through Drive, a connector type Tableau has deprecated, or a custom connector that Tableau Cloud doesn't support. The Windsor.ai comparison covers how a pipeline differs from a backend you query directly.

Route 4 — download a report and open it in Tableau

Every GA4 report has Share this report → Download File, which offers a PDF, a CSV or an export to Google Sheets, and Google's export help says a CSV or Sheets export holds up to 100,000 rows; the Viewer role on the property is enough. Tableau opens the CSV as a text file and reaches the sheet through Google Drive.

What it gets wrong: the file is a snapshot with no refresh, so every reporting cycle needs someone to download it again. A report with secondary dimensions, filters or comparisons is also more likely to carry an (other) row, according to Google's guide to the (other) row, and the file keeps whatever the report withheld.

Verdict: right for one question on one day, wrong for anything someone expects to open again next week.

The five routes side by side

Money is half of each route's cost; the other half is who keeps it running and what the data leaves out.

RouteMoneySetupUpkeepHistoryWhat bites
Tableau's GA4 connectorNo connector fee; a Creator licence to build and publish the data sourceMinutes in Desktop; a .taco file, OAuth setup and a restart on Tableau ServerWatching refreshes and quota; a move to the replacement connectorThe date range set in the connectionExtracts only; 200,000 Core tokens per property per day on a standard property; thresholded and (other) rows; listed as deprecated
BigQuery export + BigQuery connectorFree to link; BigQuery storage and queries past the free tier; streaming $0.05 per GBHours: Cloud project, permissions, link; first data within 24 hoursSQL over nested event tables; bytes scanned by live queriesFrom the link date; report tables can be backfilled through the Data Transfer Service1 million events a day on a standard property's daily export; sandbox tables expire after 60 days
Partner connector (Windsor.ai, Coupler.io, CData)$19–$32 a month (Windsor.ai Basic, Coupler.io Starter) or $499 a year (CData desktop licence), September 2026Minutes to an hourRenewals, plan limits, and the hop into TableauVendor and plan dependent; Windsor.ai's free plan covers 30 daysSheets through Drive, a deprecated Web Data Connector, or a custom connector Tableau Cloud doesn't support; Coupler.io Starter stops at 5,000 rows per run
Manual exportFreeMinutesA person, every reporting cycleWhatever range the report shows100,000 rows per CSV or Sheets file; no refresh
TableBI — not a Tableau connectorFree for one source and one live dashboard; Operator $29 a month, by requestMinutes: CLI install and a Google sign-inNothing to schedule90 days on the first sync by default; longer with --daysFeeds no Tableau workbook; GA4 fields are date, property, channel, country and five measures

Tableau and vendor prices were read on their own pricing pages on September 26, 2026.

The costs nobody quotes

Moving rows is the part every vendor prices. These four costs decide what a GA4 workbook costs to run and whether anyone trusts it.

1. Tableau licences, by role

Tableau prices people, not connectors. Every deployment needs at least one Creator, only Creators can create and publish new data sources, and viewers need licences too unless the organization buys capacity-based viewer access through sales, per Tableau Cloud pricing. As of September 2026 the Standard edition lists Creator at $75, Explorer at $42 and Viewer at $15 per user per month, billed annually, and Enterprise lists $115, $70 and $35; Tableau Server pricing shows the same per-user prices, and Tableau says none of its products are sold on monthly plans. One analyst sharing a GA4 dashboard with ten client contacts on Standard therefore pays $75 + 10 × $15 = $225 a month, $2,700 a year, before any connector fee.

The free editions stop short of sharing. Tableau's edition comparison says Tableau Desktop Free Edition can't publish to Tableau Cloud or Tableau Server or share packaged workbooks, and Tableau Public's data sources are limited to Google Drive, JSON, Excel, OData, PDF, spatial, statistical and text files, with no Google Analytics; Tableau Desktop Public Edition is also not for commercial use.

2. One quota, every caller

The Data API quota belongs to the GA4 property, not to a workbook. Each request is charged to the property's hourly and daily buckets and to the calling project's hourly bucket for that property, per Google's quota table, so Tableau extracts, a partner connector, a transfer job and a script reading the same property all draw on one 200,000-token day. When any bucket is empty, the API rejects the request at once with a 429 error, according to Google's quota-management guide.

Tableau Cloud layers its own rules on top. It suspends a scheduled refresh after five consecutive failures until someone fixes the cause (refresh troubleshooting); it suspends full extract refreshes that run more often than weekly for workbooks nobody has used for 32 days (automatic suspension); and it stops any single refresh at 120 minutes (Tableau Cloud capacity). A run of quota errors can leave a GA4 extract suspended until someone notices.

3. Rows GA4 holds back

GA4 withholds data on purpose. Google's page on data thresholds says data may be withheld from reports, explorations and API calls that include demographics, and that rows with search-query information may be withheld when too few users are behind them; the thresholds are system defined and can't be adjusted. Google's quota table also allows each property 120 potentially thresholded requests an hour. Separately, when a table has more rows than its limit, GA4 folds the least common values into an (other) row. Google calls any dimension with more than 500 values high-cardinality, and its data-freshness page says stricter cardinality limits can apply before a day's daily data is ready, so an early-morning refresh is more likely to catch an (other) row.

The Data API flags both conditions in its response metadata, as subjectToThresholding and dataLossFromOtherRow. Tableau's GA4 help page doesn't mention either flag, so compare a long-tail breakdown in Tableau with GA4's own report before trusting it.

4. Numbers that never quite match

The GA4 interface, the Data API and the BigQuery export count differently by design. Google's guide to UI-versus-export differences expects discrepancies because modeling, Google signals and attribution are not fully present in the export, and because the interface and the API estimate active users and sessions with the HyperLogLog++ algorithm; it suggests comparing only data older than 72 hours. Google's data-freshness page adds that processing can take 24 to 48 hours, during which report numbers may change. User counts are distinct counts, too: someone who visits on five days is one user in GA4's report for that week but five in a SUM over daily rows. A workbook that mixes a connector extract with BigQuery tables will disagree with itself, and an extract refreshed this morning can disagree with GA4 tomorrow.

The fifth route: recurring GA4 questions, answered outside Tableau

TableBI is not a Tableau connector. It creates no Tableau data source and sends nothing to Tableau. It replaces the Tableau step for the GA4 questions that come back every week: TableBI syncs GA4 into its own store, your AI agent, Claude Code for example, queries that store in read-only SQL from the terminal, and an answer worth keeping becomes a live dashboard URL. If the destination has to be a Tableau workbook, routes 1 to 4 are the options.

terminal
# install the CLI and teach your agent the commands
npm i -g @tablebi/cli
tablebi login
tablebi install

# Google sign-in opens in the browser; with one property, the 90-day backfill starts
tablebi connect ga4

# several properties? the command lists them; connect each one by its ID
tablebi connect ga4 --account 123456789

# every connected source and the day it runs through
tablebi sources

Nothing is installed on your website. The first sync backfills the last 90 days by default, and --days asks for a longer window. Rows land in ga4_raw with four dimensions (date, property, channel, country) and five measures (page_views, sessions, users, conversions, revenue). Device, landing page, new users and engaged sessions are not synced, so a landing-page workbook still belongs to route 1 or route 2. In the cross-channel facts table, GA4 rows carry only the date and the property, which is why GA4 channel questions read ga4_raw.

The sync reads the same Data API as route 1, so it spends the same property quota, but it asks for three coarse dimensions (date, default channel group and country) instead of page-level detail.

claude code → tablebi
# sessions, conversions and revenue by channel over the latest 28 days of data
tablebi ask "SELECT channel, SUM(sessions) AS sessions,
               SUM(conversions) AS conversions, SUM(revenue) AS revenue
             FROM ga4_raw
             WHERE date > (SELECT MAX(date) FROM ga4_raw) - INTERVAL 28 DAY
             GROUP BY channel ORDER BY sessions DESC"

Several properties share that one table, so comparing them is a GROUP BY rather than a union:

claude code → tablebi
# every connected property side by side, same 28-day window
tablebi ask "SELECT property, SUM(sessions) AS sessions,
               SUM(conversions) AS conversions, SUM(revenue) AS revenue
             FROM ga4_raw
             WHERE date > (SELECT MAX(date) FROM ga4_raw) - INTERVAL 28 DAY
             GROUP BY property ORDER BY sessions DESC"

Both windows anchor on MAX(date), the newest day actually synced, not on today's date. Users are left out of both queries on purpose: they don't add up across rows, for the distinct-count reason above. Every answer also carries a trust block listing the day each source runs through and the caveats that apply, such as GA4's latest 24 to 48 hours still being processed.

Pin the answer to a live URL

The tablebi pin command stores the query rather than a snapshot and publishes a read-only URL that refreshes as GA4 syncs. Anyone with the link can open it without a login or a Tableau licence.

claude code → tablebi
tablebi pin --title "GA4 channels" \
  --widget "Daily sessions::line=SELECT date, SUM(sessions) AS sessions FROM ga4_raw GROUP BY date ORDER BY date" \
  --widget "Sessions by channel, 28 days::hbar=SELECT channel, SUM(sessions) AS sessions FROM ga4_raw WHERE date > (SELECT MAX(date) FROM ga4_raw) - INTERVAL 28 DAY GROUP BY channel ORDER BY sessions DESC"
# prints the dashboard's public URL, e.g. https://<workspace>.tablebi.com/d/dsh_…

The scope is deliberately narrow. TableBI connects Google Search Console, GA4 and Google Ads, which are live, Meta Ads in beta (only people added to our Meta app as test users can authorize while Meta's App Review is pending), and CSV upload, and nothing else. It has no white-label reports, no scheduled PDF or email delivery, no alerts and no rank tracking; it isn't an MCP server, because your agent drives the CLI directly; and nothing is installed on your website. The free plan covers one source and one live dashboard, and each GA4 property counts as one source; the $29-a-month Operator plan is switched on by request during early access, as the pricing page explains.

Which route to pick

  • Tableau's GA4 connector for one property, a handful of dimensions and a daily extract, when the report must live in Tableau and nobody wants another bill; expect to move it to the replacement connector.
  • The BigQuery export for raw events, several properties in one model, or refreshes that never touch the Data API quota. Link it today, because it only collects from the link date, and add the Data Transfer Service when you need report tables with history.
  • A partner connector when a subscription costs less than an engineer's time and its route into Tableau works on your Tableau deployment.
  • A manual export for a one-off answer under 100,000 rows.
  • TableBI when the recurring question is how channels, countries or properties performed, the reader is an AI agent or someone holding a link, and nobody needs a Tableau canvas for it.

Microsoft's side of the same problem is covered in GA4 to Power BI, and Search Console's route into Tableau in Connect Google Search Console to Tableau. For the agent-side GA4 workflow, see Claude Code + GA4; every source TableBI connects today is in the connector list in the docs.

FAQ

Does Tableau have a GA4 connector?

Yes. Tableau builds a Google Analytics 4 connector for Tableau Desktop, Tableau Server and Tableau Cloud that reads GA4's core reports through the Google Analytics Data API. It supports extracts only, every refresh spends the property's Data API quota, and its Tableau Exchange listing now marks it deprecated, with a replacement due in release 26.3.

How do I connect Google Analytics to Tableau?

In Tableau Desktop, choose Google Analytics 4 under Connect (install it from Additional Connectors the first time), sign in with a Google account that can read the property, select the account and property, set a date range, and add dimensions and metrics. Opening a sheet creates the extract. For raw events instead of report rows, link GA4 to BigQuery and point Tableau's Google BigQuery connector at the export.

Is Tableau's Google Analytics 4 connector deprecated?

Tableau says it is deprecating it. The connector's Tableau Exchange listing, titled Google Analytics 4 - Deprecated, gives security reasons and says a replacement connector will launch in release 26.3. On September 26, 2026, the newest Tableau Desktop version on Tableau's releases page was 2026.2.3.

Can Tableau connect live to GA4?

Not through Tableau's own connector, which supports extracts only. For live queries the data has to sit somewhere Tableau can query directly: GA4's BigQuery export, which Tableau's BigQuery connector can query live, or a third-party connector such as CData's, which offers live or extract connections in Tableau Desktop and Tableau Server.

Can I connect GA4 to Tableau for free?

Not for anything you share. Tableau Public's data sources don't include Google Analytics, and Tableau Desktop Free Edition can't publish to Tableau Cloud or Tableau Server or share packaged workbooks. Sharing needs annual Tableau licences: as of September 2026, the Standard edition lists a Creator at $75 and a Viewer at $15 per user per month, billed annually. GA4's BigQuery export is free to link, and the BigQuery sandbox is free but expires tables after 60 days and caps storage at 10 GiB for the life of the project.

Why don't my GA4 numbers in Tableau match GA4?

Because each route reads a different version of the data. Connector extracts come from the Data API, which can withhold thresholded rows and fold rare values into an (other) row; the BigQuery export holds raw events without Google's modeling or Google signals data; and GA4 estimates users and sessions with the HyperLogLog++ algorithm. GA4 can also take 24 to 48 hours to process a day, so an extract refreshed early can differ from the same report later.

Sources

Try it

Search Console, GA4 and Google Ads live, Meta Ads in beta, CSV by upload: in your agent today, with no BigQuery project and no licence per viewer.

terminal
npm i -g @tablebi/cli && tablebi install