Send a mutate request

Now that we've seen how to create mutate operations for the individual entities required to create a new Smart campaign, we can combine them into a single request that creates them all at once.

The benefits of using a single mutate request are:

  • Reducing complexity since these entities are not shared and highly dependent on each other.
  • Prevents orphaned entities from existing if one of the operations fails for any reason.

Note that when using temporary resource names to create entities in a single request like this, it's important to order the operations such that entities with dependencies are created first.

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 Smart campaign
# are closely tied to one-another it's considered a best practice to
# create them in a single Mutate request so they all complete successfully
# or fail entirely, leaving no orphaned entities. See:
# https://developers.google.com/google-ads/api/docs/mutating/overview
campaign_budget_operation = _create_campaign_budget_operation(
    client, customer_id, suggested_budget_amount
)
smart_campaign_operation = _create_smart_campaign_operation(
    client, customer_id
)
smart_campaign_setting_operation = _create_smart_campaign_setting_operation(
    client, customer_id, business_location_id, business_name
)
campaign_criterion_operations = _create_campaign_criterion_operations(
    client, customer_id, keyword_theme_infos
)
ad_group_operation = _create_ad_group_operation(client, customer_id)
ad_group_ad_operation = _create_ad_group_ad_operation(client, customer_id)

googleads_service = client.get_service("GoogleAdsService")

# Send the operations into a single Mutate request.
response = googleads_service.mutate(
    customer_id=customer_id,
    mutate_operations=[
        # It's important to create these entities in this order because
        # they depend on each other, for example the SmartCampaignSetting
        # and ad group depend on the campaign, and the ad group ad depends
        # on the ad group.
        campaign_budget_operation,
        smart_campaign_operation,
        smart_campaign_setting_operation,
        # Expand the list of campaign criterion operations into the list of
        # other mutate operations
        *campaign_criterion_operations,
        ad_group_operation,
        ad_group_ad_operation,
    ],
)

_print_response_details(response)

Ruby

# 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 Smart campaign
# are closely tied to one-another it's considered a best practice to
# create them in a single Mutate request so they all complete successfully
# or fail entirely, leaving no orphaned entities. See:
# https://developers.google.com/google-ads/api/docs/mutating/overview
mutate_operations = []

# It's important to create these operations in this order because
# they depend on each other, for example the SmartCampaignSetting
# and ad group depend on the campaign, and the ad group ad depends
# on the ad group.
mutate_operations << create_campaign_budget_operation(
  client,
  customer_id,
  suggested_budget_amount,
)

mutate_operations << create_smart_campaign_operation(
  client,
  customer_id,
)

mutate_operations << create_smart_campaign_setting_operation(
  client,
  customer_id,
  business_location_id,
  business_name,
)

mutate_operations += create_campaign_criterion_operations(
  client,
  customer_id,
  keyword_theme_infos,
)

mutate_operations << create_ad_group_operation(client, customer_id)

mutate_operations << create_ad_group_ad_operation(client, customer_id)

# Sends the operations into a single Mutate request.
response = client.service.google_ads.mutate(
  customer_id: customer_id,
  mutate_operations: mutate_operations,
)

print_response_details(response)