Create a Demand Gen Campaign

Check that minimum requirements are met: Demand Gen campaign assets must meet very high standards of quality, as they will be served on very visual, entertainment-focused surfaces such as Discover and YouTube.

These are the steps in creating a Demand Gen campaign:

  1. Create a budget.
  2. Create a Demand Gen campaign with appropriate bidding strategies.
  3. Create an ad group without a type.
  4. Create audiences.
  5. Create assets and Demand Gen ads.

Create budget

Create a budget. Note that a Demand Gen campaign can't use a shared budget. We recommend that you have a sufficient daily budget to account for at least 15 times your expected target CPA bid. Learn more.


private static String addCampaignBudget(GoogleAdsClient googleAdsClient, long customerId) {
  CampaignBudget budget =
          .setName("Interplanetary Cruise Budget #" + getPrintableDateTime())

  CampaignBudgetOperation op = CampaignBudgetOperation.newBuilder().setCreate(budget).build();

  try (CampaignBudgetServiceClient campaignBudgetServiceClient =
      googleAdsClient.getLatestVersion().createCampaignBudgetServiceClient()) {
    MutateCampaignBudgetsResponse response =
            Long.toString(customerId), ImmutableList.of(op));
    String budgetResourceName = response.getResults(0).getResourceName();
    System.out.printf("Added budget: %s%n", budgetResourceName);
    return budgetResourceName;


private static string CreateBudget(GoogleAdsClient client, long customerId)
    // Get the BudgetService.
    CampaignBudgetServiceClient budgetService = client.GetService(

    // Create the campaign budget.
    CampaignBudget budget = new CampaignBudget()
        Name = "Interplanetary Cruise Budget #" + ExampleUtilities.GetRandomString(),
        DeliveryMethod = BudgetDeliveryMethod.Standard,
        AmountMicros = 500000

    // Create the operation.
    CampaignBudgetOperation budgetOperation = new CampaignBudgetOperation()
        Create = budget

    // Create the campaign budget.
    MutateCampaignBudgetsResponse response = budgetService.MutateCampaignBudgets(
        customerId.ToString(), new CampaignBudgetOperation[] { budgetOperation });
    return response.Results[0].ResourceName;


private static function addCampaignBudget(GoogleAdsClient $googleAdsClient, int $customerId)
    // Creates a campaign budget.
    $budget = new CampaignBudget([
        'name' => 'Interplanetary Cruise Budget #' . Helper::getPrintableDatetime(),
        'delivery_method' => BudgetDeliveryMethod::STANDARD,
        'amount_micros' => 500000

    // Creates a campaign budget operation.
    $campaignBudgetOperation = new CampaignBudgetOperation();

    // Issues a mutate request.
    $campaignBudgetServiceClient = $googleAdsClient->getCampaignBudgetServiceClient();
    $response = $campaignBudgetServiceClient->mutateCampaignBudgets(
        MutateCampaignBudgetsRequest::build($customerId, [$campaignBudgetOperation])

    /** @var CampaignBudget $addedBudget */
    $addedBudget = $response->getResults()[0];
    printf("Added budget named '%s'%s", $addedBudget->getResourceName(), PHP_EOL);

    return $addedBudget->getResourceName();


# Create a budget, which can be shared by multiple campaigns.
campaign_budget_operation = client.get_type("CampaignBudgetOperation")
campaign_budget = campaign_budget_operation.create = f"Interplanetary Budget {uuid.uuid4()}"
campaign_budget.delivery_method = (
campaign_budget.amount_micros = 500000

# Add budget.
    campaign_budget_response = (
            customer_id=customer_id, operations=[campaign_budget_operation]
except GoogleAdsException as ex:


# Create a budget, which can be shared by multiple campaigns.
campaign_budget = client.resource.campaign_budget do |cb| = "Interplanetary Budget #{( * 1000).to_i}"
  cb.delivery_method = :STANDARD
  cb.amount_micros = 500000

operation = client.operation.create_resource.campaign_budget(campaign_budget)

# Add budget.
return_budget = client.service.campaign_budget.mutate_campaign_budgets(
  customer_id: customer_id,
  operations: [operation],


# Create a campaign budget, which can be shared by multiple campaigns.
my $campaign_budget =
    name           => "Interplanetary budget #" . uniqid(),
    deliveryMethod => STANDARD,
    amountMicros   => 500000

# Create a campaign budget operation.
my $campaign_budget_operation =
  ->new({create => $campaign_budget});

# Add the campaign budget.
my $campaign_budgets_response = $api_client->CampaignBudgetService()->mutate({
    customerId => $customer_id,
    operations => [$campaign_budget_operation]});

Create campaign and bidding strategy

After the budget is created, you can proceed to create a campaign.

Starting with v17 of the Google Ads API, Demand Gen campaigns have an AdvertisingChannelType of DEMAND_GEN. No AdvertisingChannelSubType should be set.

Set up conversion goals for your campaign.

Supported bidding strategies are maximize clicks, target CPA, maximize conversions, and target ROAS.

Create ad group

Create an ad group without a type and attach it to the Discovery campaign.

Create audiences

Create and attach audiences using AdGroupCriterion.

Create assets and ads

There are three types of ads available for Demand Gen campaigns:

First, create assets for these ad types. Check out the Demand Gen campaign asset specs and best practices guide for the list of assets that are available for each Demand Gen ad type. The guide has guidance on what assets are required and how many assets are recommended. We also recommend evaluating asset performances to fine-tune creatives: the reporting section covers how to retrieve performance metrics for Demand Gen campaigns.

DemandGenCarouselAdInfo has an additional specialized asset called AdDemandGenCarouselCardAsset.

After the assets and ads have been created, add the ads to the ad group.