Google Ads Module
This feature is exclusive for Premium users!
The Google Ads module transforms raw Google Ads Data Transfer tables into a more analysis-ready, efficient format. It joins metrics and dimensions from different raw Google Ads tables (BasicStats, ConversionStats, Lookup tables) and enables simplified reporting across ad entities.
Key Features​
- Multiple Customer IDs: Consolidate data from multiple Google Ads accounts (not just under the same MCC account)
- Dimension Lookups: Maintain latest metadata for ad entities (campaigns, ads, ad groups, keywords, gclid)
- GCLID: deduplicated, incremental GCLID table that can be joined to other data sources (such as GA4) in downstream queries
- Conversion Action Handling: Flexible configuration for multiple conversion actions
- Incremental Processing: Process only new data from certain raw Ads tables that can get costly in high volume accounts
Google Ads BigQuery Data Transfer​
- Include all relevant tables in your Google Ads BigQuery Data Transfer.
- Set the Refresh window to 30 (which is the maximum)
- If your metrics do not match very closely to the Google Ads UI - try to run a backfill, sometimes the data can get stale (especially if you didn't set the
Refresh window). Conversion differences should be below 1-2%, non-conversion metrics should be mostly 1:1.
Limitations​
- Only Primary Conversions are supported (for now)
- GCLID join query is not provided (for now)
- Only the latest entity information is stored in the
dim_gads_*tables gads_paid_organic_search_term_metricstable is only available if Search Console and Google Ads are connected- Custom reports of the Google Ads Data Transfer are not supported (for now)
Configuration​
The module uses a YAML configuration file: includes/custom/modules/google_ads/config.yaml
# set by Superform Labs team to indicate changes
version: 1
# true/false to toggle this feature, default is false
enabled: false
# list of Google Ads Customer IDs to use as sources
# if you use MCC (Manager) accounts - use the customer ID of the topmost account to include all subaccounts
gads_sources:
# - customer_id: '123456789'
# gcp_project: 'dataform-package'
# dataset: 'google_ads'
# - customer_id: '9876554321'
# gcp_project: 'ga4dataform-demo'
# dataset: 'google_ads'
# list the names of conversion actions you need
# these will have their own conversion columns (conversions_* and conversions_value_*)
conversion_action_names:
- name: 'Purchase'
renameTo: 'transaction'
- name: 'Add to Cart'
renameTo: 'add_cart'
- name: '30s on page'
renameTo: 'engagement'
Configuration Options​
Essential Settings​
| Setting | Description | Example |
|---|---|---|
enabled | Enable/disable the module | true or false |
version | Configuration version (set by Superform Labs) | 1 |
Data Sources​
Define one or more Google Ads accounts to process:
gads_sources:
- customer_id: '123456789'
gcp_project: 'ga4dataform-com'
dataset: 'google_ads'
- customer_id: '9876554321'
gcp_project: 'ga4dataform-demo'
dataset: 'google_ads'
If you use MCC (Manager) accounts - use the customer ID of the topmost account to include all subaccounts.
| Field | Required | Description |
|---|---|---|
customer_id | Yes | Google Ads customer ID (10 digits, no dashes) |
dataset | Yes | BigQuery dataset containing raw Google Ads tables |
gcp_project | No | GCP project name (uses default if omitted) |
Conversion Actions​
Configure which conversion actions to track as separate columns:
# Simple format
conversion_action_names: ['Purchase', 'Lead', 'Signup']
# With custom column names
conversion_action_names:
- name: 'Purchase'
renameTo: 'transaction' # Creates: conversions_transaction and conversions_value_transaction
- name: 'Add to Cart'
renameTo: 'cart_add' # Creates: conversions_cart_add and conversions_value_cart_add
- 'Lead Form Submit' # Creates: conversions_lead_form_submit and conversions_value_lead_form_submit
# Mixed format
conversion_action_names:
- name: 'Purchase'
renameTo: 'txn'
- 'Lead' # No rename
- name: 'Signup'
Generated Columns:
conversions_{name}: Conversion countconversions_value_{name}: Conversion value
Use renameTo to create cleaner column names. For example, "Add to Cart" becomes conversions_cart_add instead of conversions_add_to_cart. If you don't use renameTo, the field name is still sanitized (lower case + underscore separator).
Conversions in Google Ads Data Transfer are attributed to the click date, not the conversion date. For example, a conversion that occurs on January 15th from a click on January 10th will be attributed to January 10th.
Table Structures​
The module follows the following structure:
- Dimension Tables (
dim_gads_*): Latest metadata for campaigns, ad groups, ads, keywords, accounts. These are materialized in thesuperform_transformations_*dataset. - Metric Tables (
gads_*_metrics): Daily performance data with basic stats (impressions, clicks, cost) and conversions at various grains. These are materialized in thesuperform_outputs_*dataset. - GCLID Table (
gads_gclid): GCLID is a special output table as it contains click-level information that is joined withdim_tables.
Dimension Tables​
dim_gads_accounts (table)​
Granularity: One row per Google Ads account
Latest metadata for each Google Ads customer account.
| Column | Description |
|---|---|
account_last_updated | Date when this account metadata was last updated |
customer_id | Google Ads customer ID |
customer_descriptive_name | Account name |
customer_currency_code | Account currency (e.g., USD, EUR) |
customer_time_zone | Account timezone |
customer_auto_tagging_enabled | Whether auto-tagging is enabled |
customer_manager | Whether this is a manager account |
customer_test_account | Whether this is a test account |
Google Ads calls an "account" a "customer" which can be confusing.
dim_gads_campaigns (table)​
Granularity: One row per campaign per account
Latest metadata for each campaign.
| Column | Description |
|---|---|
campaign_last_updated | Date when this campaign metadata was last updated |
campaign_id | Campaign ID |
customer_id | Google Ads customer ID |
campaign_name | Campaign name |
campaign_status | Campaign status (ENABLED, PAUSED, REMOVED) |
campaign_advertising_channel_type | Channel type (SEARCH, DISPLAY, VIDEO, etc.) |
campaign_advertising_channel_sub_type | Channel sub-type |
bidding_strategy_name | Name of bidding strategy |
campaign_bidding_strategy | Bidding strategy resource name |
campaign_bidding_strategy_type | Type of bidding strategy |
campaign_budget_amount | Daily budget amount |
campaign_budget_total_amount | Total budget amount (for non-daily budgets) |
campaign_budget_explicitly_shared | Whether budget is shared |
campaign_budget_has_recommended_budget | Whether recommended budget exists |
campaign_budget_period | Budget period (DAILY, CUSTOM) |
campaign_start_date | Campaign start date |
campaign_end_date | Campaign end date |
campaign_experiment_type | Experiment type if campaign is an experiment |
campaign_serving_status | Serving status |
campaign_tracking_url_template | Tracking template |
campaign_url_custom_parameters | Custom URL parameters |
campaign_maximize_conversion_value_target_roas | Target ROAS for maximize conversion value |
campaign_manual_cpc_enhanced_cpc_enabled | Whether enhanced CPC is enabled |
campaign_percent_cpc_enhanced_cpc_enabled | Whether percent CPC enhanced CPC is enabled |
dim_gads_ad_groups (incremental)​
Granularity: One row per ad group per campaign per account
Latest metadata for each ad group.
| Column | Description |
|---|---|
ad_group_last_updated | Date when this ad group metadata was last updated |
ad_group_id | Ad group ID |
campaign_id | Campaign ID |
customer_id | Google Ads customer ID |
ad_group_name | Ad group name |
ad_group_status | Ad group status (ENABLED, PAUSED, REMOVED) |
ad_group_type | Ad group type (SEARCH_STANDARD, DISPLAY_STANDARD, etc.) |
ad_group_ad_rotation_mode | Ad rotation mode |
ad_group_cpc_bid | CPC bid amount |
ad_group_cpm_bid | CPM bid amount |
ad_group_cpv_bid | CPV bid amount |
ad_group_display_custom_bid_dimension | Display custom bid dimension |
ad_group_effective_target_cpa | Effective target CPA |
ad_group_effective_target_cpa_source | Source of effective target CPA |
ad_group_effective_target_roas | Effective target ROAS |
ad_group_effective_target_roas_source | Source of effective target ROAS |
ad_group_tracking_url_template | Tracking template |
ad_group_url_custom_parameters | Custom URL parameters |
campaign_bidding_strategy | Campaign bidding strategy |
campaign_bidding_strategy_type | Campaign bidding strategy type |
campaign_manual_cpc_enhanced_cpc_enabled | Campaign enhanced CPC enabled |
campaign_percent_cpc_enhanced_cpc_enabled | Campaign percent CPC enhanced enabled |
dim_gads_ads (incremental)​
Granularity: One row per ad per ad group per campaign per account
Latest metadata for each ad creative.
| Column | Description |
|---|---|
ad_last_updated | Date when this ad metadata was last updated |
ad_group_ad_ad_id | Ad ID |
ad_group_id | Ad group ID |
campaign_id | Campaign ID |
customer_id | Google Ads customer ID |
ad_group_ad_ad_name | Ad name |
ad_group_ad_ad_type | Ad type (RESPONSIVE_SEARCH_AD, EXPANDED_TEXT_AD, etc.) |
ad_group_ad_status | Ad status (ENABLED, PAUSED, REMOVED) |
ad_group_ad_ad_strength | Ad strength (POOR, AVERAGE, GOOD, EXCELLENT) |
ad_group_ad_policy_summary_approval_status | Policy approval status |
ad_group_ad_ad_final_urls | Final URLs |
ad_group_ad_ad_final_mobile_urls | Final mobile URLs |
ad_group_ad_ad_tracking_url_template | Tracking template |
ad_group_ad_ad_display_url | Display URL |
ad_group_ad_ad_device_preference | Device preference |
ad_group_ad_ad_added_by_google_ads | Whether ad was added by Google Ads |
ad_group_ad_ad_system_managed_resource_source | System managed resource source |
| Responsive Search Ad fields | |
ad_group_ad_ad_responsive_search_ad_headlines | RSA headlines |
ad_group_ad_ad_responsive_search_ad_descriptions | RSA descriptions |
ad_group_ad_ad_responsive_search_ad_path1 | RSA path 1 |
ad_group_ad_ad_responsive_search_ad_path2 | RSA path 2 |
| Expanded Text Ad fields | |
ad_group_ad_ad_expanded_text_ad_headline_part1 | ETA headline 1 |
ad_group_ad_ad_expanded_text_ad_headline_part2 | ETA headline 2 |
ad_group_ad_ad_expanded_text_ad_headline_part3 | ETA headline 3 |
ad_group_ad_ad_expanded_text_ad_description | ETA description 1 |
ad_group_ad_ad_expanded_text_ad_description2 | ETA description 2 |
ad_group_ad_ad_expanded_text_ad_path1 | ETA path 1 |
ad_group_ad_ad_expanded_text_ad_path2 | ETA path 2 |
| Responsive Display Ad fields | |
ad_group_ad_ad_responsive_display_ad_headlines | RDA headlines |
ad_group_ad_ad_responsive_display_ad_descriptions | RDA descriptions |
ad_group_ad_ad_responsive_display_ad_long_headline | RDA long headline |
ad_group_ad_ad_responsive_display_ad_business_name | RDA business name |
ad_group_ad_ad_responsive_display_ad_call_to_action_text | RDA call to action |
| App Ad fields | |
ad_group_ad_ad_app_ad_headlines | App ad headlines |
ad_group_ad_ad_app_ad_descriptions | App ad descriptions |
dim_gads_keywords (incremental)​
Granularity: One row per keyword per ad group per campaign per account
Latest metadata for each keyword.
| Column | Description |
|---|---|
keyword_last_updated | Date when this keyword metadata was last updated |
ad_group_criterion_criterion_id | Keyword criterion ID |
ad_group_id | Ad group ID |
campaign_id | Campaign ID |
customer_id | Google Ads customer ID |
ad_group_criterion_keyword_text | Keyword text |
ad_group_criterion_keyword_match_type | Match type (EXACT, PHRASE, BROAD) |
ad_group_criterion_status | Keyword status |
ad_group_criterion_system_serving_status | System serving status |
ad_group_criterion_approval_status | Approval status |
ad_group_criterion_negative | Whether this is a negative keyword |
ad_group_criterion_effective_cpc_bid | Effective CPC bid |
ad_group_criterion_effective_cpc_bid_source | Source of effective CPC bid |
ad_group_criterion_effective_cpm_bid | Effective CPM bid |
| Quality Score fields | |
ad_group_criterion_quality_info_quality_score | Quality score (1-10) |
ad_group_criterion_quality_info_creative_quality_score | Creative quality score |
ad_group_criterion_quality_info_post_click_quality_score | Post-click quality score |
ad_group_criterion_quality_info_search_predicted_ctr | Predicted CTR |
| Position Estimate fields | |
ad_group_criterion_first_page_cpc | First page CPC estimate |
ad_group_criterion_first_position_cpc | First position CPC estimate |
ad_group_criterion_top_of_page_cpc | Top of page CPC estimate |
ad_group_criterion_position_estimates_estimated_add_clicks_at_first_position_cpc | Estimated additional clicks |
ad_group_criterion_estimated_add_cost_at_first_position | Estimated additional cost |
ad_group_criterion_final_urls | Final URLs |
ad_group_criterion_final_mobile_urls | Final mobile URLs |
ad_group_criterion_tracking_url_template | Tracking template |
ad_group_criterion_final_url_suffix | Final URL suffix |
campaign_bidding_strategy | Campaign bidding strategy |
campaign_bidding_strategy_type | Campaign bidding strategy type |
campaign_manual_cpc_enhanced_cpc_enabled | Campaign enhanced CPC enabled |
campaign_percent_cpc_enhanced_cpc_enabled | Campaign percent CPC enhanced enabled |
Metric Tables​
All metric tables include configured conversion columns based on your conversion_action_names configuration.
gads_campaign_metrics (table)​
Campaign-level performance data
Grain: segments_date, campaign_id, customer_id, segments_slot, segments_ad_network_type
Metrics:
impressions,clicks,interactions,costconversions_{action_name},conversions_value_{action_name}(for each configured conversion)
Dimensions: Join to dim_gads_campaigns and dim_gads_accounts
gads_ad_group_metrics (table)​
Ad group-level performance data
Grain: segments_date, campaign_id, ad_group_id, customer_id, segments_device, segments_slot, segments_ad_network_type
Metrics:
impressions,clicks,interactions,costconversions_{action_name},conversions_value_{action_name}(for each configured conversion)
Dimensions: Join to dim_gads_ad_groups, dim_gads_campaigns, and dim_gads_accounts
gads_ad_metrics (table)​
Ad-level performance data
Grain: segments_date, campaign_id, ad_group_id, ad_group_ad_ad_id, customer_id, segments_device, segments_slot, segments_ad_network_type
Metrics:
impressions,clicks,interactions,cost,view_through_conversionsconversions_{action_name},conversions_value_{action_name}(for each configured conversion)
Dimensions: Join to dim_gads_ads, dim_gads_ad_groups, dim_gads_campaigns, and dim_gads_accounts
gads_keyword_metrics (table)​
Keyword-level performance data
Grain: segments_date, campaign_id, ad_group_id, ad_group_criterion_criterion_id, customer_id, segments_device, segments_slot, segments_ad_network_type
Metrics:
impressions,clicks,interactions,cost,view_through_conversionsconversions_{action_name},conversions_value_{action_name}(for each configured conversion)
Dimensions: Join to dim_gads_keywords, dim_gads_ad_groups, dim_gads_campaigns, and dim_gads_accounts
gads_paid_organic_search_term_metrics (table)​
Combined paid and organic search performance
Grain: segments_date, campaign_id, ad_group_id, customer_id, paid_organic_search_term_view_search_term, segments_search_engine_results_page_type
Metrics:
clicks,impressionscombined_clicks,combined_queriesorganic_clicks,organic_queries,organic_impressionsaverage_cpc,ctrcombined_clicks_per_query,organic_clicks_per_query,organic_impressions_per_query
Dimensions: Join to dim_gads_ad_groups, dim_gads_campaigns, and dim_gads_accounts
GCLID Table​
gads_gclid (incremental)​
Granularity: One row per GCLID (Google Click ID)
Output table containing Google Click IDs (GCLIDs) and their associated metadata. GCLIDs are unique identifiers assigned to each ad click, enabling cross-platform tracking between Google Ads and other analytics platforms like GA4.
| Column | Description |
|---|---|
gclid_last_updated | Date when this GCLID metadata was last updated |
click_view_gclid | Google Click ID - unique identifier for the ad click |
campaign_id | Campaign ID associated with this click |
ad_group_id | Ad group ID associated with this click |
ad_group_ad_ad_id | Ad ID associated with this click |
customer_id | Google Ads customer ID |
click_view_ad_group_ad | Ad group ad resource name |
click_view_area_of_interest_city | City of interest for the user |
click_view_area_of_interest_country | Country of interest for the user |
click_view_area_of_interest_metro | Metro area of interest for the user |
click_view_area_of_interest_most_specific | Most specific area of interest |
click_view_area_of_interest_region | Region of interest for the user |
click_view_campaign_location_target | Campaign location target |
click_view_keyword | Keyword associated with the click |
click_view_keyword_info_match_type | Keyword match type (EXACT, PHRASE, BROAD) |
click_view_keyword_info_text | Keyword text |
click_view_location_of_presence_city | City where user was present |
click_view_location_of_presence_country | Country where user was present |
click_view_location_of_presence_metro | Metro area where user was present |
click_view_location_of_presence_most_specific | Most specific location of presence |
click_view_location_of_presence_region | Region where user was present |
click_view_page_number | Page number where ad appeared |
click_view_user_list | User list associated with this click |
segments_ad_network_type | Network type (SEARCH, DISPLAY, etc.) |
segments_click_type | Type of click (HEADLINE, SITELINK, etc.) |
segments_date | Date of the click (YYYY-MM-DD format) |
segments_device | Device type (MOBILE, DESKTOP, TABLET) |
segments_slot | Ad slot position |
Dimensions: Join to dim_gads_ad_groups, dim_gads_campaigns, and dim_gads_accounts
Common Use Cases​
- Campaign Performance Dashboards: Track key metrics across all campaigns
- Keyword Optimization: Identify high-performing keywords and negative keyword opportunities
- Search Query Mining: Discover new keyword opportunities from actual searches
- Multi-Account Reporting: Consolidated reporting across multiple Google Ads accounts
- Budget Pacing: Monitor spend vs. budget allocation
- Paid vs. Organic: Compare paid and organic search performance
Looker Studio Template​
We do not (yet) have a Looker Studio template for this module.