An [`AssetGroupSignal`](https://developers.google.com/google-ads/api/reference/rpc/v26/AssetGroupSignal.md.txt) is a signal that you can
provide to Google to optimize ad serving at the asset group level. Performance
Max uses these signals to look for new impressions with similar or stronger
intent to find conversions across Search, Display, Video, and more. Using your
asset group signals combined with Google's real-time understanding of consumer
intents and preferences, Performance Max can find new customer segments that you
might not have expected.

While standard Performance Max campaigns can operate without asset group
signals, Local Services Performance Max campaigns require at least one asset
group signal per asset group. Attempting to remove the last remaining signal
will trigger an
[`AssetGroupSignalError.CANNOT_REMOVE_ALL_SIGNALS`](https://developers.google.com/google-ads/api/reference/rpc/v26/AssetGroupSignalErrorEnum.AssetGroupSignalError.md.txt#CANNOT_REMOVE_ALL_SIGNALS)
error.

There are three types of hints that you can provide to Google:
[`audience`](https://developers.google.com/google-ads/api/reference/rpc/v26/AssetGroupSignal.md.txt#audience),
[`search_theme`](https://developers.google.com/google-ads/api/reference/rpc/v26/AssetGroupSignal.md.txt#search_theme), and
[`local_services_id`](https://developers.google.com/google-ads/api/reference/rpc/v26/AssetGroupSignal.md.txt#local_services_id).
An `AssetGroup` can have multiple asset group signals, but each signal must
be added individually by creating an `AssetGroupSignal` and populating the
`oneof` [`AssetGroupSignal.signal`](https://developers.google.com/google-ads/api/reference/rpc/v26/AssetGroupSignal.md.txt#signal)
field.

## Audiences

An [`Audience`](https://developers.google.com/google-ads/api/docs/remarketing/audiences.md.txt) is a reusable collection of
focused segments, demographic targeting, and exclusions. An
[`AssetGroupSignal`](https://developers.google.com/google-ads/api/reference/rpc/v26/AssetGroupSignal.md.txt) lets you specify which
`Audience` is most likely to convert for your `AssetGroup`.
[Learn more](https://support.google.com/google-ads/answer/14753570) about audience
signals.

An `AssetGroupSignal` can only be added to or removed from an `AssetGroup`. Any
modifications of the related `Audience` should be performed using the
[`AudienceService`](https://developers.google.com/google-ads/api/reference/rpc/v26/AudienceService.md.txt).


### Java

```java
AssetGroupSignal audienceSignal =
    AssetGroupSignal.newBuilder()
        .setAssetGroup(assetGroupResourceName)
        .setAudience(
            AudienceInfo.newBuilder()
                .setAudience(ResourceNames.audience(customerId, audienceId)))
        .build();

mutateOperations.add(
    MutateOperation.newBuilder()
        .setAssetGroupSignalOperation(
            AssetGroupSignalOperation.newBuilder().setCreate(audienceSignal))
        .build());
      
```

### C#

```c#
operations.Add(
    new MutateOperation()
    {
        AssetGroupSignalOperation = new AssetGroupSignalOperation()
        {
            Create = new AssetGroupSignal()
            {
                AssetGroup = assetGroupResourceName,
                Audience = new AudienceInfo()
                {
                    Audience = ResourceNames.Audience(customerId, audienceId.Value)
                }
            }
        }
    }
);
      
```

### PHP

```php
private static function createAssetGroupSignalOperations(
    int $customerId,
    string $assetGroupResourceName,
    ?int $audienceId
): array {
    $operations = [];
    if (is_null($audienceId)) {
        return $operations;
    }

    $operations[] = new MutateOperation(
        [
        'asset_group_signal_operation' => new AssetGroupSignalOperation(
            [
            // To learn more about Audience Signals, see
            // https://developers.google.com/google-ads/api/docs/performance-max/asset-groups#audience_signals.
            'create' => new AssetGroupSignal(
                [
                'asset_group' => $assetGroupResourceName,
                'audience' => new AudienceInfo(
                    [
                    'audience' => ResourceNames::forAudience($customerId, $audienceId)
                    ]
                )
                ]
            )
            ]
        )
        ]
    );

    return $operations;
}
      
```

### Python

```python
mutate_operation: MutateOperation = client.get_type("MutateOperation")
operation: AssetGroupSignal = (
    mutate_operation.asset_group_signal_operation.create
)
operation.asset_group = asset_group_resource_name
operation.audience.audience = googleads_service.audience_path(
    customer_id, audience_id
)
operations.append(mutate_operation)
      
```

### Ruby

```ruby
# Create a list of MutateOperations that create AssetGroupSignals.
def create_asset_group_signal_operations(client, customer_id, audience_id)
  operations = []
  return operations if audience_id.nil?

  operations << client.operation.mutate do |m|
    m.asset_group_signal_operation = client.operation.create_resource.
        asset_group_signal do |ags|
      ags.asset_group = client.path.asset_group(
        customer_id,
        ASSET_GROUP_TEMPORARY_ID,
      )
      ags.audience = client.resource.audience_info do |ai|
        ai.audience = client.path.audience(customer_id, audience_id)
      end
    end
  end

  operations
end
      
```

### Perl

```perl
sub create_asset_group_signal_operations {
  my ($customer_id, $audience_id) = @_;

  my $operations = [];
  return $operations if not defined $audience_id;

  push @$operations,
    Google::Ads::GoogleAds::V26::Services::GoogleAdsService::MutateOperation->
    new({
      assetGroupSignalOperation =>
        Google::Ads::GoogleAds::V26::Services::AssetGroupSignalService::AssetGroupSignalOperation
        ->new({
          # To learn more about Audience Signals, see:
          # https://developers.google.com/google-ads/api/docs/performance-max/asset-groups#audience_signals
          create =>
            Google::Ads::GoogleAds::V26::Resources::AssetGroupSignal->new({
              assetGroup =>
                Google::Ads::GoogleAds::V26::Utils::ResourceNames::asset_group(
                $customer_id, ASSET_GROUP_TEMPORARY_ID
                ),
              audience =>
                Google::Ads::GoogleAds::V26::Common::AudienceInfo->new({
                  audience =>
                    Google::Ads::GoogleAds::V26::Utils::ResourceNames::audience(
                    $customer_id, $audience_id
                    )})})})});
  return $operations;
}
      
```

### curl

> [!NOTE]
> **Note:** While a direct REST code sample for this step isn't provided here, you can achieve this using a manual REST request.   
>
> Refer to the Google Ads API REST interface documentation and the method-specific reference pages. You will need to construct the JSON payload based on the proto definitions.   
>
> Key Resources:
>
> - [Using REST](https://developers.google.com/google-ads/api/rest/overview.md.txt)
> - [REST Interface Structure](https://developers.google.com/google-ads/api/rest/design/overview.md.txt)
> - [JSON Field Mappings](https://developers.google.com/google-ads/api/rest/design/json-mappings.md.txt)
> - Consult the [REST API Reference](https://developers.google.com/google-ads/api/reference/rpc/latest/overview) for the specific service and method.

<br />

Audiences can be created with a [`scope`](https://developers.google.com/google-ads/api/reference/rpc/v26/Audience.md.txt#scope) of
`ASSET_GROUP` to specify that the audience be used in a single
asset group. The [`Audience.asset_group`](https://developers.google.com/google-ads/api/reference/rpc/v26/Audience.md.txt#asset_group)
field must be populated with the resource name of an asset group if and only if
`Audience.scope` is set to `ASSET_GROUP`. If an audience with `ASSET_GROUP`
scope is upgraded to `CUSTOMER` scope, `Audience.asset_group` is automatically
cleared.

> [!TIP]
> **Tip:** If you are upgrading to Performance Max campaigns from other campaign types, you can reuse the existing [`AudienceSegment`](https://developers.google.com/google-ads/api/reference/rpc/v26/AudienceSegment.md.txt) from your other campaigns to build an Audience for Performance Max campaigns. [Learn more](https://developers.google.com/google-ads/api/docs/remarketing/audiences.md.txt#create-audiences) about creating Audiences.

### Recommendations for audience signal optimization

The Google Ads API provides two
[recommendation](https://support.google.com/google-ads/answer/3448398) types to
help you optimize your audience signals:

1. [`REFRESH_CUSTOMER_MATCH_LIST`](https://developers.google.com/google-ads/api/reference/rpc/v26/Recommendation.md.txt#refresh_customer_match_list_recommendation)
   recommends updating a customer list which hasn't been refreshed in some time.
   This is useful if the audiences you're using as asset group signals contain
   customer lists.

2. [`IMPROVE_GOOGLE_TAG_COVERAGE`](https://developers.google.com/google-ads/api/reference/rpc/v26/Recommendation.md.txt#improve_google_tag_coverage_recommendation)
   recommends deploying the [Google tag](https://support.google.com/google-ads/answer/7548399) across more of your website
   to improve conversion tracking. This can lead to improved accuracy of your
   conversion reporting, which can in turn lead to more accurate audience
   signals for your asset groups.

For more information, visit the
[Optimization score and recommendations](https://developers.google.com/google-ads/api/docs/recommendations.md.txt) guide.

## Search themes

A [`search_theme`](https://developers.google.com/google-ads/api/reference/rpc/v26/AssetGroupSignal.md.txt#search_theme) in Performance
Max lets you [provide Google AI with valuable
information](https://support.google.com/google-ads/answer/13351809) about what your
customers are searching for and which topics lead to conversions for your
business. This new criterion type can be used exclusively in Performance Max
campaigns to create an `AssetGroupSignal` by populating the
`AssetGroupSignal.search_theme` field with a
[`SearchThemeInfo`](https://developers.google.com/google-ads/api/reference/rpc/v26/SearchThemeInfo.md.txt) criterion.


### Java

```java
AssetGroupSignal searchThemeSignal =
    AssetGroupSignal.newBuilder()
        .setAssetGroup(assetGroupResourceName)
        .setSearchTheme(SearchThemeInfo.newBuilder().setText("travel").build())
        .build();

mutateOperations.add(
    MutateOperation.newBuilder()
        .setAssetGroupSignalOperation(
            AssetGroupSignalOperation.newBuilder().setCreate(searchThemeSignal))
        .build());
      
```

### C#

```
This example is not yet available in C#; you can take a look at the other languages.
    
```

### PHP

```
This example is not yet available in PHP; you can take a look at the other languages.
    
```

### Python

```python
mutate_operation: MutateOperation = client.get_type("MutateOperation")
operation: AssetGroupSignal = (
    mutate_operation.asset_group_signal_operation.create
)
operation.asset_group = asset_group_resource_name
operation.search_theme.text = "travel"
operations.append(mutate_operation)
      
```

### Ruby

```
This example is not yet available in Ruby; you can take a look at the other languages.
    
```

### Perl

```
This example is not yet available in Perl; you can take a look at the other languages.
    
```

### curl

> [!NOTE]
> **Note:** While a direct REST code sample for this step isn't provided here, you can achieve this using a manual REST request.   
>
> Refer to the Google Ads API REST interface documentation and the method-specific reference pages. You will need to construct the JSON payload based on the proto definitions.   
>
> Key Resources:
>
> - [Using REST](https://developers.google.com/google-ads/api/rest/overview.md.txt)
> - [REST Interface Structure](https://developers.google.com/google-ads/api/rest/design/overview.md.txt)
> - [JSON Field Mappings](https://developers.google.com/google-ads/api/rest/design/json-mappings.md.txt)
> - Consult the [REST API Reference](https://developers.google.com/google-ads/api/reference/rpc/latest/overview) for the specific service and method.

<br />

## Local Services

A [`local_services_id`](https://developers.google.com/google-ads/api/reference/rpc/v26/AssetGroupSignal.md.txt#local_services_id) in
Performance Max lets you optimize ad serving using Local Services Ads service
ID signals. You can use this criterion type in Performance Max campaigns to
create an `AssetGroupSignal` by populating the
`AssetGroupSignal.local_services_id` field with a
[`LocalServiceIdInfo`](https://developers.google.com/google-ads/api/reference/rpc/v26/LocalServiceIdInfo.md.txt) message.

> [!NOTE]
> **Note:** This signal type is an allowlist-only feature specifically for Local Services Performance Max (GLS PMax) campaigns and cannot be used with other Performance Max campaign types.

Populating this field specifies a Local Services category and locale (such as
`install_faucet` or plumbing categories) to guide campaign optimization.
This signal helps find potential customers with strong intent for those
specific service types.