Google Ads to BigQuery
Sync Google Ads campaigns, ad groups, ads, keywords and their daily and hourly performance into BigQuery. Google's own Data Transfer Service does this at no transfer charge and is a good fit inside Google Cloud; Weld lands 42 tables that sit next to your other marketing and revenue sources and can push audiences back to Google Ads.
Checked against Weld and vendor docs on
- campaign_stats25 cols
- campaign22 cols
- ad_group_stats28 cols
- keyword_stats26 cols
- account15 cols
- campaign_hourly_stats26 cols
- Extract
- Load
- Keep in sync
- google_ads.campaign_statsSynced
- google_ads.campaignSyncing
- google_ads.ad_group_statsSynced
- google_ads.keyword_statsSynced
- google_ads.accountSynced
- google_ads.campaign_hourly_statsSynced
- Google Ads tables
- 32
- fields, typed
- 591
- agent context included
- MCP
Trusted by data and AI teams
Three ways to get Google Ads data into BigQuery
Google's BigQuery Data Transfer Service has a Google Ads connector with no transfer charge, so start there if Google Ads is your only source. The differences show up in table design, refresh behaviour and how many other sources you need in the same warehouse.
BigQuery Data Transfer Service
- Best for
- Google Ads data in BigQuery at no transfer charge
- Effort
- Low: configure in the Google Cloud console
- Freshness
- At most once every 24 hours
- Good to know
- Loads date-partitioned match and stats tables. Refresh window of 7 days by default, up to 30. Incremental transfers are not supported, and custom GAQL reports cannot use WHERE, ORDER BY or LIMIT.
Custom script on the Google Ads API
- Best for
- Teams with engineers to own a pipeline
- Effort
- High: OAuth, GAQL queries, API version upgrades
- Freshness
- Whatever you schedule
- Good to know
- Full control over which GAQL queries run, but you maintain the code and move it to new Google Ads API versions yourself.
Weld
- Best for
- Google Ads next to your other marketing and revenue data
- Effort
- Low: authorise, pick accounts and reports, schedule
- Freshness
- Incremental syncs on your schedule
- Good to know
- 42 tables of objects and daily and hourly reports, with country, province and device splits. Reverse ETL can update Google Ads customer lists from BigQuery.
How to sync Google Ads to Google BigQuery with Weld.
In the app, with the API or an agent.
What lands in Google BigQuery
Every Google Ads table, keys intact.
Weld's Google Ads tables come in two kinds: objects, which describe how the account is set up, and reports, which hold daily or hourly performance. Most reporting starts from these.
- campaign_stats25 columns
- campaign_id→ campaignlong
- account_id→ accountlong
- campaign_namestring
- datedate
- account_descriptive_namestring
Daily cost, clicks, impressions, conversions and conversion value per campaign, split by device and ad network type. Sum across those splits for campaign totals.
- campaign22 columns
- idPKlong
- account_id→ accountlong
- ad_serving_optimization_statusstring
- advertising_channel_sub_typestring
- advertising_channel_typestring
Campaign settings: name, status, channel type, start and end dates, bidding and optimisation score. Joins to the stats tables on campaign id.
- ad_group_stats28 columns
- ad_group_id→ ad_grouplong
- account_id→ accountlong
- campaign_id→ campaignlong
- ad_group_namestring
- datedate
The same daily metrics one level down, per ad group, with campaign and account columns for rollups.
- keyword_stats26 columns
- ad_group_id→ ad_groupstring
- campaign_id→ campaignstring
- resource_namestring
- customer_idstring
- customer_resource_namestring
Daily performance per keyword criterion, with ad group and campaign ids. Pair with ad_group_criterion for keyword text and match type.
- account15 columns
- idPKlong
- auto_tagging_enabledboolean
- currency_codestring
- descriptive_namestring
- final_url_suffixstring
One row per ad account with currency code and time zone. Use it to label spend with the right currency when you sync several accounts.
- campaign_hourly_stats26 columns
- campaign_id→ campaignlong
- account_id→ accountlong
- campaign_namestring
- datedate
- hourlong
Campaign metrics by date and hour, for intraday pacing and dayparting analysis.
- account
- campaign
- ad_group
- campaign_criterion
- ad_stats
- audience_stats
- ad
- ad_group_criterion
- ad_group_province_stats
- ad_group_hourly_stats
- ad_group_stats
- ad_group_country_stats
- campaign_hourly_stats
- keyword_stats
- campaign_stats
- search_term_keyword_stats
- search_term_stats
- campaign_budget
- user_list
- campaign_criterion_proximity
- campaign_criterion_schedule
- user_interest
- campaign_bid_modifier
- campaign_bidding_strategy
- account_hourly_stats
- account_stats
- ad_group_bidding_strategy
- label
- mobile_device
- operating_system_version
- and 2 more
Monthly spend, conversions and ROAS by campaign.
In Google BigQuery SQL.
Runs in BigQuery against the tables Weld lands, here in a dataset named google_ads. Google Ads reports cost in micros, so cost_micros is divided by one million; the account's currency_code says which currency that is.
1select2 date_trunc(s.date, month) as month,3 a.currency_code,4 s.campaign_name,5 round(sum(s.cost_micros) / 1e6, 2) as spend,6 sum(s.clicks) as clicks,7 round(sum(s.conversions), 1) as conversions,8 round(safe_divide(sum(s.conversions_value), sum(s.cost_micros) / 1e6), 2) as roas9from google_ads.campaign_stats as s10join google_ads.account as a on a.id = s.account_id11group by month, a.currency_code, s.campaign_name12order by month desc, spend descAsk your agent.
It queries Google BigQuery for you.
Connect Claude, Cursor, ChatGPT or your own agent to Weld over MCP. It reads the Google Ads context, finds the tables it needs and runs the query in Google BigQuery.
How many campaign rows do we have per account? Use our Google Ads data in Google BigQuery.
Reading the Google Ads context first, so the query uses the right tables and keys.
Things to know.
Before you sync Google Ads.
ELT vs. reverse ETL: Google Ads and Google BigQuery
ELT (Extract, Load, Transform) moves data from Google Ads into Google BigQuery for analysis. This is the approach shown on this page, and the one to use for dashboards, reports, and data models.
Reverse ETL works the other direction: it pushes enriched data from Google BigQuery back into Google Ads. For example, you could sync computed lead scores or customer segments from your warehouse into Google Ads to personalize outreach.
Weld supports both directions, so you can build a complete data loop between Google Ads and Google BigQuery.
Google BigQuery to Google Ads- Money is stored in micros
- Google Ads returns monetary amounts in micros, where one million equals one unit of the account's currency. Divide cost_micros and the other _micros columns by 1,000,000, and keep accounts in different currencies apart.
- Stats tables are split by device and network
- Report tables such as campaign_stats carry device and ad_network_type columns, so one campaign has several rows per day. Group by the columns you need, or sum across them for daily totals.
- Rate limits are shared across your account
- Google Ads applies global rate limits to everything that uses the API for your account. If other tools call it too, syncs may slow down; Weld throttles its Google Ads syncs once usage reaches 80% of the limit.
- Permissions differ for reading and writing
- Syncing data into BigQuery needs viewer access to the ad accounts. Pushing customer lists back to Google Ads with reverse ETL needs editor access.
Common questions.
About Google Ads to Google BigQuery.
Start syncing Google Ads to Google BigQuery.
Set up your Google Ads data pipeline in minutes. No credit card required. Free for 14 days.