★ Community Edition ★Price: Free



The Query Cookbook

Demand Gen performance: the GAQL to break open a single-line campaign

A cookbook of Demand Gen GAQL queries that splits spend, conversions, asset ratings and audiences out of the campaign line Google reports as a single figure.

Demand Gen reports in the UI as one campaign, one spend figure, one conversion count. Underneath, the same budget is buying placements across YouTube, Discover, Gmail and the Display network, split across asset groups, audiences and a handful of formats the summary card never separates out. The channel type that replaced Discovery in API v16 still carries all of that detail, it just does not surface it anywhere you can click. These five queries pull it out.

Before you start

  • You need Google Ads API access or a login with permission to use the Query Builder in the Google Ads UI (Tools, then GAQL).
  • Every query filters on campaign.advertising_channel_type = 'DEMAND_GEN', so paste them as they are and swap only the date range.
  • Nothing here writes to the account. Every query is a plain SELECT.

The queries

Campaign-level performance, cost, conversions and value by day.

SQL
-- What it answers: daily cost, conversions and value for every Demand Gen campaign
SELECT
  campaign.id,
  campaign.name,
  segments.date,
  metrics.cost_micros,
  metrics.conversions,
  metrics.conversions_value,
  metrics.average_cpc
FROM campaign
WHERE campaign.advertising_channel_type = 'DEMAND_GEN'
  AND segments.date DURING LAST_30_DAYS
ORDER BY segments.date DESC

Asset-group performance, so you can see which asset group inside the campaign is actually earning the spend.

SQL
-- What it answers: performance by individual asset group inside each Demand Gen campaign
SELECT
  campaign.name,
  asset_group.name,
  asset_group.status,
  segments.date,
  metrics.cost_micros,
  metrics.conversions,
  metrics.conversions_value
FROM asset_group
WHERE campaign.advertising_channel_type = 'DEMAND_GEN'
  AND segments.date DURING LAST_30_DAYS
ORDER BY metrics.cost_micros DESC

Creative asset ratings, the LOW, GOOD or BEST label Google assigns to each headline, description and image.

SQL
-- What it answers: which individual headlines, descriptions and images are rated LOW, GOOD or BEST
SELECT
  campaign.name,
  ad_group.name,
  ad_group_ad_asset_view.field_type,
  ad_group_ad_asset_view.performance_label,
  asset.id,
  segments.date
FROM ad_group_ad_asset_view
WHERE campaign.advertising_channel_type = 'DEMAND_GEN'
  AND segments.date DURING LAST_30_DAYS

Audience performance, so you can see which audience segments a campaign is actually reaching, not just the ones you built it against.

SQL
-- What it answers: performance by the audience segments a Demand Gen campaign is reaching
SELECT
  campaign.name,
  ad_group.name,
  ad_group_audience_view.resource_name,
  segments.date,
  metrics.cost_micros,
  metrics.conversions,
  metrics.conversions_value
FROM ad_group_audience_view
WHERE campaign.advertising_channel_type = 'DEMAND_GEN'
  AND segments.date DURING LAST_30_DAYS

Network and device split, the closest you will get to seeing YouTube, Discover, Gmail and Display broken apart.

SQL
-- What it answers: how spend and conversions split across network and device
SELECT
  campaign.name,
  segments.ad_network_type,
  segments.device,
  segments.date,
  metrics.cost_micros,
  metrics.conversions,
  metrics.conversions_value
FROM campaign
WHERE campaign.advertising_channel_type = 'DEMAND_GEN'
  AND segments.date DURING LAST_30_DAYS

How to run these

Paste any one into the Query Builder (Tools, then Bulk actions, then GAQL) for a quick look, or into the Google Ads API for a scheduled pull. In an Ads Script, wrap the same text in AdsApp.report() and iterate the rows with .rows(). All five run unmodified against a manager account by adding a login customer ID header; nothing in the query itself changes.

Reading the output

Start with the campaign-level query to confirm total spend and conversions reconcile with what the UI shows, then use asset-group performance to find where inside the campaign that spend actually landed. If one asset group is carrying most of the cost with a fraction of the conversions, check its asset ratings before touching the audience or network queries, a LOW-rated image or headline is often the simplest fix available.

One honest limitation: ad_group_ad_asset_view and ad_group_audience_view only report a narrower metric set than the campaign resource, impressions, clicks and conversions, not the full metrics list, and Google backfills asset ratings with a delay after a change. Treat the asset and audience queries as directional, and the campaign-level query as the number you reconcile everything else against.

  • Demand Gen
  • GAQL
  • Reporting