Create a Discovery Campaign

Check that minimum requirements are met, such as enabling sitewide tagging and conversion tracking.

These are the steps in creating a Discovery campaign:

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

Create budget

Create a budget. Note that a Discovery campaign can't use a shared budget. We recommend that you have a sufficient daily budget to account for at least 10 times your 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.

Discovery campaigns have an AdvertisingChannelType of DISCOVERY. No AdvertisingChannelSubType should be set.

Set up conversion goals for your campaign.

Supported bidding strategies are 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 Discovery campaigns:

First, create assets for these ad types. Check out the Create Discovery campaigns guide for the list of assets that are available for each Discovery ad type. The guide has guidance on what assets are required and how many assets are recommended.

DiscoveryCarouselAdInfo has an additional specialized asset called AdDiscoveryCarouselCardAsset.

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