Page Summary
-
Demand Gen campaigns allow brands to share their story across YouTube, Discover, and Gmail.
-
These campaigns use Google AI to serve the best creatives to relevant potential customers and optimize bidding across the funnel.
-
Advertisers using Demand Gen campaigns maintain control over which assets are added to their campaigns.
Demand Gen campaigns let you share your brand's story with people across Google's visual surfaces: YouTube (including Shorts), Discover, Gmail, Google Maps, and the Google Display Network. Demand Gen reaches customers across multiple touchpoints and uses Google AI to serve creatives to relevant audiences and optimize bidding across the funnel, while giving you full control over your campaign assets and placements.
Key API resources
When managing Demand Gen campaigns in the Google Ads API, you work with the following resources and settings:
| Primary resource | Key Demand Gen fields and settings |
|---|---|
CampaignBudget
|
explicitly_shared = false; supports daily
(amount_micros) or custom total budgets
(total_amount_micros with
period = CUSTOM_PERIOD).
|
Campaign |
advertising_channel_type = DEMAND_GEN; bidding strategy
(maximize_conversions,
maximize_conversion_value, target_cpa,
target_roas, target_spend, or
target_cpc); optional shopping_setting for
product feeds.
|
AdGroup |
audience_setting.use_audience_grouped;
demand_gen_ad_group_settings.channel_controls (YouTube,
Discover, Gmail, Maps, Display).
|
AdGroupCriterion
|
audience
(AudienceInfo),
location, language, and
listing_group
(
ListingGroupInfo).
|
AdGroupAd &
Asset
|
ad.demand_gen_multi_asset_ad,
ad.demand_gen_carousel_ad,
ad.demand_gen_video_responsive_ad, or
ad.demand_gen_product_ad.
|
Create a Demand Gen campaign
We recommend creating the budget, campaign, ad group, assets, and Demand Gen ad
atomically in a single GoogleAdsService.Mutate request
using negative temporary resource IDs so dependent resources can reference each
other:
Java
// The below methods create and return MutateOperations that we later provide to // the GoogleAdsService.Mutate method in order to create the entities in a single // request. Since the entities for a Demand Gen campaign are closely tied to one-another // it's considered a best practice to create them in a single Mutate request; the // entities will either all complete successfully or fail entirely, leaving no // orphaned entities. See: // https://developers.google.com/google-ads/api/docs/mutating/overview List<MutateOperation> operations = new ArrayList<>(); // A utility to create temporary IDs for the resources. AtomicLong tempId = new AtomicLong(-1); // Creates a new campaign budget operation and adds it to the list of operations. String budgetResourceName = ResourceNames.campaignBudget(customerId, tempId.getAndDecrement()); operations.add( MutateOperation.newBuilder() .setCampaignBudgetOperation(createCampaignBudgetOperation(budgetResourceName)) .build()); // Creates a new campaign operation and adds it to the list of operations. String campaignResourceName = ResourceNames.campaign(customerId, tempId.getAndDecrement()); operations.add( MutateOperation.newBuilder() .setCampaignOperation( createDemandGenCampaignOperation(campaignResourceName, budgetResourceName)) .build()); // Creates a new ad group operation and adds it to the list of operations. String adGroupResourceName = ResourceNames.adGroup(customerId, tempId.getAndDecrement()); operations.add( MutateOperation.newBuilder() .setAdGroupOperation( createDemandGenAdGroupOperation(adGroupResourceName, campaignResourceName)) .build()); // Creates the asset operations for the ad. Map<String, String> assetResourceNames = new HashMap<>(); operations.addAll( createAssetOperations(customerId, youTubeVideoId, tempId, assetResourceNames)); // Creates a new ad group ad operation and adds it to the list of operations. operations.add( MutateOperation.newBuilder() .setAdGroupAdOperation( createDemandGenAdGroupAdOperation(adGroupResourceName, assetResourceNames)) .build()); // Creates the service client. try (GoogleAdsServiceClient googleAdsServiceClient = googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) { // Sends the mutate request. MutateGoogleAdsResponse response = googleAdsServiceClient.mutate(String.valueOf(customerId), operations); // Prints the results. System.out.printf( "Created campaign with resource name: %s%n", response .getMutateOperationResponses(1) .getCampaignResult() .getResourceName()); System.out.printf( "Created ad group with resource name: %s%n", response .getMutateOperationResponses(2) .getAdGroupResult() .getResourceName()); for (Map.Entry<String, String> entry : assetResourceNames.entrySet()) { System.out.printf( "Created asset with temporary resource name '%s' and final resource name '%s'.%n", entry.getValue(), response .getMutateOperationResponses( operations.indexOf(getOperationForAsset(operations, entry.getValue()))) .getAssetResult() .getResourceName()); } System.out.printf( "Created ad group ad with resource name: %s%n", response .getMutateOperationResponses(operations.size() - 1) .getAdGroupAdResult() .getResourceName()); }
C#
// The below methods create and return MutateOperations that we later provide to // the GoogleAdsService.Mutate method in order to create the entities in a single // request. Since the entities for a Demand Gen campaign are closely tied to one-another // it's considered a best practice to create them in a single Mutate request; the // entities will either all complete successfully or fail entirely, leaving no // orphaned entities. See: // https://developers.google.com/google-ads/api/docs/mutating/overview MutateOperation campaignBudgetOperation = CreateCampaignBudgetOperation(budgetResourceName); MutateOperation campaignOperation = CreateDemandGenCampaignOperation(campaignResourceName, budgetResourceName); MutateOperation adGroupOperation = CreateAdGroupOperation(adGroupResourceName, campaignResourceName); // Send the operations in a single mutate request. MutateGoogleAdsRequest mutateGoogleAdsRequest = new MutateGoogleAdsRequest { CustomerId = customerId.ToString() }; // It's important to create these entities in this order because they depend on // each other, for example the ad group depends on the // campaign, and the ad group ad depends on the ad group. mutateGoogleAdsRequest.MutateOperations.Add(campaignBudgetOperation); mutateGoogleAdsRequest.MutateOperations.Add(campaignOperation); mutateGoogleAdsRequest.MutateOperations.Add(adGroupOperation); mutateGoogleAdsRequest.MutateOperations.AddRange( CreateAssetOperations( videoAssetResourceName, videoId, logoResourceName, client.Config ) ); mutateGoogleAdsRequest.MutateOperations.Add( CreateDemandGenAdOperation( adGroupResourceName, videoAssetResourceName, logoResourceName ) ); MutateGoogleAdsResponse response = googleAdsServiceClient.Mutate(mutateGoogleAdsRequest);
PHP
This example is not yet available in PHP; you can take a look at the other languages.
Python
# The below methods create and return MutateOperations that we later provide # to the GoogleAdsService.Mutate method in order to create the entities in a # single request. Since the entities for a Demand Gen campaign are closely # tied to one-another it's considered a best practice to create them in a # single Mutate request; the entities will either all complete successfully # or fail entirely, leaving no orphaned entities. See: # https://developers.google.com/google-ads/api/docs/mutating/overview mutate_operations: List[MutateOperation] = [ # It's important to create these entities in this order because they # depend on each other, for example the ad group depends on the # campaign, and the ad group ad depends on the ad group. create_campaign_budget_operation(client, budget_resource_name), create_demand_gen_campaign_operation( client, campaign_resource_name, budget_resource_name ), create_ad_group_operation( client, ad_group_resource_name, campaign_resource_name ), *create_asset_operations( # Use iterable unpacking client, video_asset_resource_name, video_id, logo_asset_resource_name, ), create_demand_gen_ad_operation( client, ad_group_resource_name, video_asset_resource_name, logo_asset_resource_name, ), ] # Send the operations in a single mutate request. googleads_service.mutate( customer_id=customer_id, mutate_operations=mutate_operations )
Ruby
operations = [] operations << client.operation.mutate do |m| m.campaign_budget_operation = create_campaign_budget_operation(client, budget_resource_name) end operations << client.operation.mutate do |m| m.campaign_operation = create_demand_gen_campaign_operation(client, campaign_resource_name, budget_resource_name) end operations << client.operation.mutate do |m| m.ad_group_operation = create_ad_group_operation(client, ad_group_resource_name, campaign_resource_name) end operations += create_asset_operations(client, video_asset_resource_name, video_id, logo_asset_resource_name).map do |asset_op| client.operation.mutate do |m| m.asset_operation = asset_op end end operations << client.operation.mutate do |m| m.ad_group_ad_operation = create_demand_gen_ad_operation(client, ad_group_resource_name, video_asset_resource_name, logo_asset_resource_name) end response = client.service.google_ads.mutate( customer_id: customer_id, mutate_operations: operations, )
Perl
This example is not yet available in Perl; you can take a look at the other languages.
curl
For step-by-step instructions on budgets, bidding strategies, and ad formats, see Create a Demand Gen campaign.
Query Demand Gen campaigns
Use GoogleAdsService.SearchStream to retrieve
Demand Gen campaign attributes and performance metrics segmented by network and
YouTube surface (segments.ad_network_type and segments.ad_sub_network_type
must be selected together):
SELECT
campaign.id,
campaign.name,
campaign.status,
campaign.bidding_strategy_type,
segments.ad_network_type,
segments.ad_sub_network_type,
metrics.impressions,
metrics.clicks,
metrics.conversions,
metrics.cost_micros
FROM campaign
WHERE campaign.advertising_channel_type = DEMAND_GEN
AND segments.date DURING LAST_30_DAYS
For ad-level, asset-level, and conversion breakdown queries, see Demand Gen reporting.
Next steps
- Create a Demand Gen campaign
- Set up audience targeting
- Use product feeds with Demand Gen
- Configure channel controls
- Retrieve Demand Gen reports