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.

4.8 on G2
Google AdsSource
WeldWeld
Google BigQueryWarehouse

Checked against Weld and vendor docs on

Weld · New sync
Google AdsSourceGoogle AdsConnected
Tables to sync
  • campaign_stats25 cols
  • campaign22 cols
  • ad_group_stats28 cols
  • keyword_stats26 cols
  • account15 cols
  • campaign_hourly_stats26 cols
  • Extract
  • Load
  • Keep in sync
Google BigQueryDestinationGoogle BigQueryReady
google_ads dataset
  • 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

  • Flatpay
  • Holafly
  • eComplete
  • Dishoom
  • Danish Endurance
  • Female Invest
  • Son of a Tailor
  • Onomondo
  • Medik8
  • Pas Normal Studios
Options

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.

B

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.
C

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 it works

How to sync Google Ads to Google BigQuery with Weld.
In the app, with the API or an agent.

Weld · Data warehouse
Google BigQueryData warehouseGoogle BigQueryConnected
Data locationChosen when you connect
CredentialsService account or key, stored encrypted
Schema

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.

Open the schema explorer
  • 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.

All 32 tables
  • 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
Example query

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.

Google BigQuery · query
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 desc
Weld MCP server

Ask 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.

Claude CodeOpus 5
>

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.

●weld·search_available_references
⎿raw.google_ads.campaign
raw.google_ads.account
+ 30 more Google Ads tables
●weld·get_reference_schema
⎿campaign · 22 columns
joins account on account_id
●weld·run_query
⎿select a.id, count(*) from {{raw.google_ads.campaign}} c
join {{raw.google_ads.account}} a on c.account_id = a.id
group by 1
submitted
●weld·get_query_status
⎿DONE
●weld·get_query_result
⎿rows returned
✓Answered from Google Ads data in Google BigQuery
>Ask about your Google Ads data
Under the hood

Things to know.
Before you sync Google Ads.

Reverse ETL

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.
FAQ

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.

Google AdsSource
WeldWeld
Google BigQueryWarehouse