Next Action Analyst

2026-07-30

GA4 BigQuery Export Not Showing Data After Linking? Here's the Exact Fix

You followed the steps, the GA4 property shows a linked BigQuery project under Admin, but when you open the BigQuery console there's no dataset, or there's a dataset with no tables, or the tables exist but yesterday's data never showed up. You're not missing a step — you're missing the timing or a permission, and it's fixable in the next ten minutes.

Why this happens

  1. You're checking too soon. The first export after linking is not instant. Daily export tables typically land within 24 hours (sometimes up to 48 for the very first sync), and if you enabled streaming export, that starts flowing separately and doesn't backfill history.
  2. The link was created but never completed. GA4's linking flow requires you to select a BigQuery project, choose data location, and hit "Submit" or "Link" on a final confirmation screen. If you closed the tab after selecting the project but before that last confirmation, GA4 shows "linked" in some cached views but no export job was ever scheduled.
  3. Missing IAM permissions on the BigQuery project. The Google user who set up the link needs at minimum BigQuery Admin or the combination of BigQuery Data Editor, BigQuery Job User, and BigQuery User roles. Without these, the export job silently fails to create the dataset.
  4. The BigQuery API isn't enabled on the destination project. If nobody has ever run a query in that project before, the BigQuery API can be disabled, which blocks GA4's export job from writing data even though the link itself was accepted.
  5. Wrong project selected during linking. Multiple GCP projects with similar names is the single most common self-inflicted error — you're checking Project A in the console while GA4 is actually exporting to Project B.
  6. Billing not enabled on the linked project. BigQuery requires an active billing account attached to the project, even if you're staying within the free tier. No billing account, no export job.
  7. Property-level export not actually configured for the stream you're checking. If you have multiple data streams (web, iOS, Android) but only enabled export for one, the others won't produce tables — this looks like "no data" if you're checking the wrong stream's expected events.

Fix, step by step

  1. In GA4, go to Admin > Product Links > BigQuery Links and confirm a link exists with the correct project ID (not just a similar-looking name) and the correct data location.
  2. Click into the link and verify both Daily and/or Streaming export are toggled on as expected — if both are off, no job was ever created.
  3. In Google Cloud Console, switch to the exact project ID shown in the GA4 link (not the project display name) and confirm the BigQuery API is enabled under APIs & Services.
  4. In that same project, go to IAM & Admin > IAM and confirm the account that performed the linking has BigQuery Admin or the Editor/Job User/User role combination.
  5. Confirm Billing is enabled for the project under Billing in Cloud Console — a project with no billing account cannot receive the export.
  6. Wait the full 24-48 hour window from the moment the link was confirmed (not from when you started the process) before troubleshooting further.
  7. In BigQuery, search for a dataset named analytics_XXXXXXXXX where the number matches your GA4 property ID exactly — check this, not just "any dataset."
  8. If the dataset exists but has no tables after 48 hours, unlink and re-link the property, making sure to click through to the final confirmation screen this time.
  9. If streaming export was enabled but daily wasn't, remember streaming tables (events_intraday_*) only show same-day data and get replaced by the daily events_* table — check both table prefixes separately.

Copy-paste setup verification checklist

GA4 → BIGQUERY EXPORT VERIFICATION CHECKLIST

[ ] GA4 property ID matches dataset name: analytics_
[ ] BigQuery project ID confirmed (copied directly from GA4 link, not typed)
[ ] BigQuery API enabled on that exact project
[ ] Billing account active on that exact project
[ ] IAM role on linking account: BigQuery Admin
    (or) BigQuery Data Editor + BigQuery Job User + BigQuery User
[ ] Daily export toggle: ON
[ ] Streaming export toggle: ON or OFF (intentional choice, not default)
[ ] Data location matches your compliance/region requirement
[ ] 24-48 hours elapsed since final "Submit" confirmation
[ ] Checked for table: events_YYYYMMDD (daily)
[ ] Checked for table: events_intraday_YYYYMMDD (streaming only)
[ ] Ran test query: SELECT COUNT(*) FROM `project.analytics_XXXXXXXXX.events_*`
    WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 3 DAY))
    AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())

How to verify it worked

Run the test query from the checklist above in the BigQuery console. A row count greater than zero confirms data is flowing. If it returns zero rows but no error, the tables exist and permissions are fine — you're just still inside the initial processing window. If the query itself errors out on "table not found," go back to steps 1-5 above; the link or permissions are the actual problem, not timing.

Once the export is confirmed and flowing, the real work starts — turning raw BigQuery event tables into decisions your team can act on without writing SQL every morning. That's the gap Next Action Analyst is built to close, taking exports like this one and surfacing the next action instead of just the next dataset.

Stop reading dashboards. Start acting on them.
Next Action Analyst turns your campaign export into a prioritized list of changes to make tomorrow — with the numbers that justify each one.