Required components of Search

To generate a new Search campaign from scratch, you must at the minimum create the following:

The campaign and budget are useful for creating all sorts of campaign types, while some settings within the ad group ads will be specifically useful for creating Search campaigns. Visit the Search assets guide to see how assets can be created using scripts.

Make sure you're familiar with the mutate strategy, as this guide will only provide the JavaScript objects to be used in the mutates.

Budget

The budget must not be shared, and must have a unique name in your account. Use a CampaignBudgetOperation to create your budget.

const budgetOperation = {
  "campaignBudgetOperation": {
    "create": {
      "resourceName": `customers/${customerId}/campaignBudgets/${getNextTempId()}`,
      "name": "Search campaign budget",
      "amountMicros": "10000000",
      "deliveryMethod": "STANDARD",
      "explicitlyShared": false
    }
  }
}
operations.push(budgetOperation);

Campaign

The campaign must reference a budget, so you will need the exact budget resource name you created in the previous step to identify and use that specific budget object. Use a CampaignOperation. In this example we also set the AiMaxSetting to enable AI Max for Search, and the NetworkSettings.

const campaignOperation = {
  "campaignOperation": {
    "create": {
      "resourceName": `customers/${customerId}/campaigns/${getNextTempId()}`,
      "name": "Search campaign",
      "status": "PAUSED",
      "advertisingChannelType": "SEARCH",
      "campaignBudget": budgetOperation.campaignBudgetOperation.create.resourceName,
      "biddingStrategyType": "MANUAL_CPC",
      "startDate": "20240314",
      "endDate": "20250313",
      "manualCpc": {
        "enhancedCpcEnabled": true
      },
      "aiMaxSetting": {
        "enableAiMax": true
      },
      "networkSettings": {
        "targetGoogleSearch": true,
        "targetSearchNetwork": true
      },
      "containsEuPoliticalAdvertising": "DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING"
    }
  }
}
operations.push(campaignOperation);

Ad group

The ad group must reference the previously created campaign, so you will need the exact resource name you set in the previous step to identify the campaign previously created in this request. You will also need a temp ID for the ad group itself, which is best stored as a new variable so it can be used when creating keywords and ad group ads. Use an AdGroupOperation.

const adGroupId = getNextTempId();
const adGroupOperation = {
  "adGroupOperation": {
    "create": {
      "resourceName": `customers/${customerId}/adGroups/${adGroupId}`,
      "name": "Search ad group",
      "status": "PAUSED",
      "campaign": campaignOperation.campaignOperation.create.resourceName,
      "type": "SEARCH_STANDARD"
    }
  }
}
operations.push(adGroupOperation);

Keywords

Keywords are required to trigger your ads on search results. They are added as criteria to an ad group using AdGroupCriterionOperation. You need to reference the ad group created in the previous step.

const keywordOperation = {
  "adGroupCriterionOperation": {
    "create": {
      "adGroup": adGroupOperation.adGroupOperation.create.resourceName,
      "status": "ENABLED",
      "keyword": {
        "text": "flowers",
        "matchType": "BROAD"
      }
    }
  }
}
operations.push(keywordOperation);

Ad group ad with ad

This step creates an ad group ad, which joins an ad group with an ad. The ad group ad must reference the ad group, so you will need the exact resource name you set in the previous step. You can create an ad within the same operation, and use either previously created text assets or create them within the same operation as well. The example shown here creates a Responsive Search Ad using ResponsiveSearchAdInfo. This requires text assets for headlines and descriptions to have been created, as shown in the Assets guide.

To create the ad group ad, use an AdGroupAdOperation.

const adGroupAdOperation = {
  "adGroupAdOperation": {
    "create": {
      "resourceName": `customers/${customerId}/adGroupAds/${adGroupId}~${getNextTempId()}`,
      "adGroup": adGroupOperation.adGroupOperation.create.resourceName,
      "status": "PAUSED",
      "ad": {
        "name": "Search RSA ad",
        "finalUrls": [
          "http://www.example.com"
        ],
        "responsiveSearchAd": {
          "headlines": [
            {
              "text": textAsset.assetOperation.create.resourceName
            },
            {
              "text": "Headline 2"
            },
            {
              "text": "Headline 3"
            }
          ],
          "descriptions": [
            {
              "text": "Description 1"
            },
            {
              "text": "Description 2"
            }
          ]
        }
      }
    }
  }
}
operations.push(adGroupAdOperation);