We held a webinar yesterday on how to work with Google Ads data in BigQuery. Because everyone who’s been in those raw tables knows..
It’s a lot. It’s complicated. It’s a jungle!
If you haven’t seen it yet: the Google Ads BigQuery Data Transfer dumps dozens of tables into your dataset. p_ads_ClickStats_*, p_ads_AdGroupBasicStats_*, p_ads_KeywordStats_*, ...CampaignConversionStats_*.. with a naming scheme that feels like it was designed by the API team at 5pm on a Friday.
The metrics and dimensions live in multiple tables, and have A LOT of columns. Getting something actionable out of this without knowing the schema is genuinely hard work. And not much community content can be found online, you’re on your own.
That’s why we built the Google Ads module for GA4Dataform Premium.
What it does
The module takes those raw Data Transfer tables and transforms them into something you’d actually want to query.
You get clean, joined reports at every level you care about: campaign, ad group, ad, and keyword. Each report table has all the metrics you need in one place: impressions, clicks, cost, and your conversion actions as their own columns. No joining back to a ConversionStats table. No guessing which Criteria_* field maps to your campaign name.
Your conversion actions are configured once, in YAML, and come out as clean named columns:
conversion_action_names:
- name: 'Purchase'
renameTo: 'transaction'
- name: 'Add to Cart'
renameTo: 'add_cart'
That gives you conversions_transaction and conversions_value_transaction in every report table. Consistent, documented, queryable.
The things that make a real difference
A few details worth calling out.
Multiple accounts. If you run multiple Google Ads accounts, you can connect all of them. Not just accounts under the same MCC, any customer IDs. The output tables consolidate them, and every row has customer_id so you can always split by account.
GCLID table. We output a deduplicated, incremental GCLID table. A GCLID is the click ID Google Ads puts in your URLs when someone clicks an ad. That ID also lands in your GA4 data. Join the two, and you can connect an ad click directly to a GA4 session and transaction. If you’ve ever wanted true ad-to-purchase tracking without relying on Smart Bidding’s black box, this is the building block.
Incremental processing. Some of the raw Ads tables get expensive to reprocess every day if your account is large. The module processes only new data where it matters.
BI tool ready. Every table has human-readable column names, documented grain, and joins to clear dimension tables. Looker Studio, Metabase, Superset, a curious AI agent — whatever is querying your data will get something it can work with.
The slides from the webinar
On May 6 we ran a webinar on attribution with GA4 and Google Ads. Part of it covered the Google Ads module and how it fits into a DWH setup. The slides are available here.
This is a Premium feature
The Google Ads module is part of GA4Dataform Premium. If you’re on Core and running Google Ads, this is probably the most practical reason to upgrade. You’re paying for the ads, you might as well be able to query the data cleanly.
To enable it, add this to your config:
# includes/custom/modules/google_ads/config.yaml
enabled: true
google_ads_sources:
- customer_id: '123456789'
dataset: 'google_ads'
# you can add multiple datasets, too, they will be rolled up
conversion_action_names:
- name: 'Purchase'
renameTo: 'transaction'
That’s the minimum, and it works!
Your turn
If you’re on Premium and already have the Google Ads Data Transfer set up: try enabling the module and running a campaign report query or plug a table directly in Data Studio.

Swap in your actual conversion action names, run it for the last 30 days, and see if the numbers match what you’re used to seeing in the Google Ads UI.
If they don’t match exactly, the most common cause is the refresh window. Set it to 30 days in your Data Transfer configuration and run a backfill. Conversion differences should be below 1-2%. Non-conversion metrics should be 1:1.
Let us know what you find.



