Create Dynamic Search Ads

  • Setting up Dynamic Search Ads (DSAs) with the Google Ads API involves creating a campaign with a specified domain, creating an ad group for DSA features, creating the DSAs themselves, and defining criteria for when the DSAs should appear.

  • A DSA campaign requires setting the advertising_channel_type to SEARCH and providing domain information using dynamic_search_ads_setting.

  • An ad group for DSAs must have its type set to SEARCH_DYNAMIC_ADS and is subject to restrictions like only being usable in search campaigns with a valid DynamicSearchAdsSetting and not allowing positive keywords.

  • DSAs are created using an ExpandedDynamicSearchAdInfo object which only requires a description, as the headline, display URL, and final URL are automatically generated based on campaign-level domain settings.

  • Criteria for triggering DSAs are specified using the webpage field of AdGroupCriterion, which allows filtering based on URL, category, page title, page content, or custom label using WebpageConditionInfo conditions.

To set up Dynamic Search Ads (DSAs) with the Google Ads API, follow these steps:

  1. Create a campaign and specify its domain.
  2. Create an ad group for features related to DSAs.
  3. Create one or more DSAs.
  4. Specify one or more criteria for showing the DSAs in the campaign.

Create the campaign

To tell Google Ads that you're going to be using DSAs with your campaign, you first need to create a Campaign with the field advertising_channel_type set to AdvertisingChannelType.SEARCH. Also, specify a domain on which the DSAs will operate. This is done by setting the field dynamic_search_ads_setting of the Campaign using a DynamicSearchAdsSetting.

The following example creates a DSA campaign.

Java

private static String addCampaign(
    GoogleAdsClient googleAdsClient, long customerId, String budgetResourceName) {
  // Creates the campaign.
  Campaign campaign =
      Campaign.newBuilder()
          .setName("Interplanetary Cruise #" + getPrintableDateTime())
          .setAdvertisingChannelType(AdvertisingChannelType.SEARCH)
          .setStatus(CampaignStatus.PAUSED)
          .setManualCpc(ManualCpc.newBuilder().build())
          .setCampaignBudget(budgetResourceName)
          // Enables the campaign for DSAs.
          .setDynamicSearchAdsSetting(
              DynamicSearchAdsSetting.newBuilder()
                  .setDomainName("example.com")
                  .setLanguageCode("en")
                  .build())
          // Declares whether this campaign serves political ads targeting the EU.
          .setContainsEuPoliticalAdvertising(DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING)
          .setStartDate(new DateTime().plusDays(1).toString("yyyyMMdd"))
          .setEndDate(new DateTime().plusDays(30).toString("yyyyMMdd"))
          .build();

  // Creates the operation.
  CampaignOperation operation = CampaignOperation.newBuilder().setCreate(campaign).build();

  // Creates the campaign service client.
  try (CampaignServiceClient campaignServiceClient =
      googleAdsClient.getLatestVersion().createCampaignServiceClient()) {
    // Adds the campaign.
    MutateCampaignsResponse response =
        campaignServiceClient.mutateCampaigns(
            Long.toString(customerId), ImmutableList.of(operation));

    String campaignResourceName = response.getResults(0).getResourceName();
    // Displays the results.
    System.out.printf("Added campaign with resource name '%s'.%n", campaignResourceName);
    return campaignResourceName;
  }
}
      

C#

private static string AddCampaign(GoogleAdsClient client, long customerId,
    string budgetResourceName)
{
    // Get the CampaignService.
    CampaignServiceClient campaignService = client.GetService(Services.V22.CampaignService);

    // Create the campaign.
    Campaign campaign = new Campaign()
    {
        Name = "Interplanetary Cruise #" + ExampleUtilities.GetRandomString(),
        AdvertisingChannelType = AdvertisingChannelType.Search,
        Status = CampaignStatus.Paused,
        ManualCpc = new ManualCpc(),
        CampaignBudget = budgetResourceName,

        // Enable the campaign for DSAs.
        DynamicSearchAdsSetting = new DynamicSearchAdsSetting()
        {
            DomainName = "example.com",
            LanguageCode = "en"
        },

        // Declare whether or not this campaign contains political ads targeting the EU.
        ContainsEuPoliticalAdvertising = EuPoliticalAdvertisingStatus.DoesNotContainEuPoliticalAdvertising,

        StartDate = DateTime.Now.AddDays(1).ToString("yyyyMMdd"),
        EndDate = DateTime.Now.AddDays(30).ToString("yyyyMMdd")
    };

    // Create the operation.
    CampaignOperation operation = new CampaignOperation()
    {
        Create = campaign
    };

    // Add the campaign.
    MutateCampaignsResponse response =
        campaignService.MutateCampaigns(customerId.ToString(),
            new CampaignOperation[] { operation });

    // Displays the result.
    string campaignResourceName = response.Results[0].ResourceName;
    Console.WriteLine($"Added campaign with resource name '{campaignResourceName}'.");
    return campaignResourceName;
}
      

PHP

private static function createCampaign(
    GoogleAdsClient $googleAdsClient,
    int $customerId,
    string $campaignBudgetResourceName
) {
    $campaign = new Campaign([
        'name' => 'Interplanetary Cruise #' . Helper::getPrintableDatetime(),
        'advertising_channel_type' => AdvertisingChannelType::SEARCH,
        'status' => CampaignStatus::PAUSED,
        'manual_cpc' => new ManualCpc(),
        'campaign_budget' => $campaignBudgetResourceName,
        // Enables the campaign for DSAs.
        'dynamic_search_ads_setting' => new DynamicSearchAdsSetting([
            'domain_name' => 'example.com',
            'language_code' => 'en'
        ]),
        // Declare whether or not this campaign serves political ads targeting the EU.
        'contains_eu_political_advertising' =>
            EuPoliticalAdvertisingStatus::DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING,
        // Optional: Sets the start and end dates for the campaign, beginning one day from
        // now and ending a month from now.
        'start_date' => date('Ymd', strtotime('+1 day')),
        'end_date' => date('Ymd', strtotime('+1 month'))
    ]);

    // Creates a campaign operation.
    $campaignOperation = new CampaignOperation();
    $campaignOperation->setCreate($campaign);

    // Issues a mutate request to add campaigns.
    $campaignServiceClient = $googleAdsClient->getCampaignServiceClient();
    /** @var MutateCampaignsResponse $campaignResponse */
    $campaignResponse = $campaignServiceClient->mutateCampaigns(
        MutateCampaignsRequest::build($customerId, [$campaignOperation])
    );

    $campaignResourceName = $campaignResponse->getResults()[0]->getResourceName();
    printf("Added campaign named '%s'.%s", $campaignResourceName, PHP_EOL);

    return $campaignResourceName;
}