The Google Ads API provides multiple ways to mutate resources depending on your use
case:

- **[Resource service mutates](https://developers.google.com/google-ads/api/docs/mutating/service-mutates):** Each mutable resource has a dedicated service that executes operations for that specific resource type. For example, the `Campaign` resource uses the [`CampaignService.MutateCampaigns`](https://developers.google.com/google-ads/api/reference/rpc/v26/CampaignService/MutateCampaigns) endpoint for creating, updating, or removing campaigns.
- **[Bulk mutates](https://developers.google.com/google-ads/api/docs/mutating/bulk-mutate):** The [`GoogleAdsService.Mutate`](https://developers.google.com/google-ads/api/reference/rpc/v26/GoogleAdsService/Mutate) endpoint wraps a sequence of mutate operations across multiple resource types (and supported action operations such as booking or quoting campaigns) in a single synchronous request.
- **[Asynchronous batch jobs](https://developers.google.com/google-ads/api/docs/batch-processing/overview):** For large-scale mutations or long-running workloads, [`BatchJobService`](https://developers.google.com/google-ads/api/reference/rpc/v26/BatchJobService) executes operations asynchronously without risking synchronous request timeouts. Unlike [`GoogleAdsService.Mutate`](https://developers.google.com/google-ads/api/reference/rpc/v26/GoogleAdsService/Mutate), `BatchJobService` always executes under partial-failure semantics and does not support `validate_only` mode or action operations (`book_campaigns_operation`, `quote_campaigns_operation`). Because partial failure is always active, `BatchJobService` rejects resource operations whose underlying services don't support partial failure (such as `CustomerOperation`, `CampaignConversionGoalOperation`, `ConversionGoalCampaignConfigOperation`, `CustomConversionGoalOperation`, and `CustomerConversionGoalOperation`) with `MutateError.OPERATION_DOES_NOT_SUPPORT_PARTIAL_FAILURE`.

## Benefits of bulk mutates

Using [`GoogleAdsService.Mutate`](https://developers.google.com/google-ads/api/reference/rpc/v26/GoogleAdsService/Mutate) provides the following benefits
(see [Mutate best practices](https://developers.google.com/google-ads/api/docs/mutating/best-practices) for implementation
guidance):

- **Grouped actions across different resource services:** Whereas individual resource service calls only accept operations for a single resource type, `GoogleAdsService.Mutate` lets you mutate multiple resource types in one call.
- **Temporary resource names:** You can assign negative integer IDs (such as `customers/CUSTOMER_ID/campaigns/-1`) to newly created parent entities and reference those temporary IDs in child operations within the same request.

With these capabilities, you can use [`GoogleAdsService.Mutate`](https://developers.google.com/google-ads/api/reference/rpc/v26/GoogleAdsService/Mutate) to
create an entire campaign hierarchy atomically so that all operations succeed or
fail together, or set `partial_failure` to `true` to commit valid operations
independently.

> [!IMPORTANT]
> **Key Point:** Every mutate request targets a single `customer_id`, so a single call cannot mutate resources across multiple client accounts simultaneously. In addition, an account cannot mutate objects created by another account unless it authenticates as an authorized manager account with the `login-customer-id` header configured.