필수 확장 소재와 예산이 있으면 이제 캠페인을 만들 수 있습니다.
실적 최대화 캠페인의 AdvertisingChannelType은 PERFORMANCE_MAX입니다. AdvertisingChannelSubType을 설정하면 안 됩니다.
지원되는 유일한 입찰 전략은 다음과 같습니다.
- 가치를 추적하지 않고 모든 전환을 동등하게 중요시하는 경우
MaximizeConversions입찰 전략을 사용하세요. 선택사항인 타겟 CPA (액션당비용)를 설정할 수 있습니다. 자세히 알아보기 - 전환 가치를 추적하는 경우
MaximizeConversionValue입찰 전략을 설정하세요. 선택사항인 타겟 ROAS(광고 투자수익)를 설정할 수 있습니다. 자세히 알아보기
BiddingStrategyService을 사용하여 생성된 포트폴리오 입찰 전략은 실적 최대화 캠페인에서 지원되지 않습니다. 포트폴리오 입찰 전략에서 여러 캠페인을 만드는 대신 캠페인 수를 줄이고 애셋 그룹을 더 많이 사용하세요.
자바
/** Creates a MutateOperation that creates a new Performance Max campaign. */ private MutateOperation createPerformanceMaxCampaignOperation( long customerId, boolean brandGuidelinesEnabled) { Campaign performanceMaxCampaign = Campaign.newBuilder() .setName("Performance Max campaign #" + getPrintableDateTime()) // Sets the campaign status as PAUSED. The campaign is the only entity in // the mutate request that should have its status set. .setStatus(CampaignStatus.PAUSED) // All Performance Max campaigns have an advertising_channel_type of // PERFORMANCE_MAX. The advertising_channel_sub_type should not be set. .setAdvertisingChannelType(AdvertisingChannelType.PERFORMANCE_MAX) // Bidding strategy must be set directly on the campaign. // Setting a portfolio bidding strategy by resource name is not supported. // Max Conversion and Maximize Conversion Value are the only strategies // supported for Performance Max campaigns. // An optional ROAS (Return on Advertising Spend) can be set for // maximize_conversion_value. The ROAS value must be specified as a ratio in // the API. It is calculated by dividing "total value" by "total spend". // For more information on Maximize Conversion Value, see the support // article: http://support.google.com/google-ads/answer/7684216. // A targetRoas of 3.5 corresponds to a 350% return on ad spend. .setMaximizeConversionValue( MaximizeConversionValue.newBuilder().setTargetRoas(3.5).build()) // Sets if the campaign is enabled for brand guidelines. For more information on brand // guidelines, see https://support.google.com/google-ads/answer/14934472. .setBrandGuidelinesEnabled(brandGuidelinesEnabled) // Assigns the resource name with a temporary ID. .setResourceName( ResourceNames.campaign(customerId, PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID)) // Sets the budget using the given budget resource name. .setCampaignBudget(ResourceNames.campaignBudget(customerId, BUDGET_TEMPORARY_ID)) // Declares whether this campaign serves political ads targeting the EU. .setContainsEuPoliticalAdvertising(DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING) // Optional fields. .setStartDate(new DateTime().plusDays(1).toString("yyyyMMdd")) .setEndDate(new DateTime().plusDays(365).toString("yyyyMMdd")) // Configures the optional opt-in/out status for asset automation settings. .addAllAssetAutomationSettings(ImmutableList.of( AssetAutomationSetting.newBuilder() .setAssetAutomationType(AssetAutomationType.GENERATE_IMAGE_EXTRACTION) .setAssetAutomationStatus(AssetAutomationStatus.OPTED_IN).build(), AssetAutomationSetting.newBuilder() .setAssetAutomationType( AssetAutomationType.FINAL_URL_EXPANSION_TEXT_ASSET_AUTOMATION) .setAssetAutomationStatus(AssetAutomationStatus.OPTED_IN).build(), AssetAutomationSetting.newBuilder() .setAssetAutomationType(AssetAutomationType.TEXT_ASSET_AUTOMATION) .setAssetAutomationStatus(AssetAutomationStatus.OPTED_IN).build(), AssetAutomationSetting.newBuilder() .setAssetAutomationType(AssetAutomationType.GENERATE_ENHANCED_YOUTUBE_VIDEOS) .setAssetAutomationStatus(AssetAutomationStatus.OPTED_IN).build(), AssetAutomationSetting.newBuilder() .setAssetAutomationType(AssetAutomationType.GENERATE_IMAGE_ENHANCEMENT) .setAssetAutomationStatus(AssetAutomationStatus.OPTED_IN).build())) .build(); return MutateOperation.newBuilder() .setCampaignOperation( CampaignOperation.newBuilder().setCreate(performanceMaxCampaign).build()) .build(); }
C#
/// Creates a MutateOperation that creates a new Performance Max campaign. /// <param name="campaignResourceName">The campaign resource name.</param> /// <param name="campaignBudgetResourceName">The campaign budget resource name.</param> /// <param name="brandGuidelinesEnabled">Whether or not to enable brand guidelines.</param> /// <returns>A MutateOperations that will create this new campaign.</returns> private MutateOperation CreatePerformanceMaxCampaignOperation( string campaignResourceName, string campaignBudgetResourceName, bool brandGuidelinesEnabled) { Campaign campaign = new Campaign() { Name = "Performance Max campaign #" + ExampleUtilities.GetRandomString(), // Set the campaign status as PAUSED. The campaign is the only entity in // the mutate request that should have its status set. Status = CampaignStatus.Paused, // All Performance Max campaigns have an AdvertisingChannelType of // PerformanceMax. The AdvertisingChannelSubType should not be set. AdvertisingChannelType = AdvertisingChannelType.PerformanceMax, // Bidding strategy must be set directly on the campaign. Setting a // portfolio bidding strategy by resource name is not supported. Max // Conversion and Maximize Conversion Value are the only strategies // supported for Performance Max campaigns. BiddingStrategyType is // read-only and cannot be set by the API. An optional ROAS (Return on // Advertising Spend) can be set to enable the MaximizeConversionValue // bidding strategy. The ROAS value must be specified as a ratio in the API. // It is calculated by dividing "total value" by "total spend". // // For more information on Maximize Conversion Value, see the support // article: // http://support.google.com/google-ads/answer/7684216. // // A target_roas of 3.5 corresponds to a 350% return on ad spend. MaximizeConversionValue = new MaximizeConversionValue() { TargetRoas = 3.5 }, // Use the temporary resource name created earlier ResourceName = campaignResourceName, // Set the budget using the given budget resource name. CampaignBudget = campaignBudgetResourceName, // Set if the campaign is enabled for brand guidelines. For more information // on brand guidelines, see https://support.google.com/google-ads/answer/14934472. BrandGuidelinesEnabled = brandGuidelinesEnabled, // Declare whether or not this campaign contains political ads targeting the EU. ContainsEuPoliticalAdvertising = EuPoliticalAdvertisingStatus.DoesNotContainEuPoliticalAdvertising, // Optional fields StartDate = DateTime.Now.AddDays(1).ToString("yyyyMMdd"), EndDate = DateTime.Now.AddDays(365).ToString("yyyyMMdd") }; campaign.AssetAutomationSettings.AddRange(new[]{ new Campaign.Types.AssetAutomationSetting { AssetAutomationType = AssetAutomationType.GenerateImageExtraction, AssetAutomationStatus = AssetAutomationStatus.OptedIn }, new Campaign.Types.AssetAutomationSetting { AssetAutomationType = AssetAutomationType.FinalUrlExpansionTextAssetAutomation, AssetAutomationStatus = AssetAutomationStatus.OptedIn }, new Campaign.Types.AssetAutomationSetting { AssetAutomationType = AssetAutomationType.TextAssetAutomation, AssetAutomationStatus = AssetAutomationStatus.OptedIn }, new Campaign.Types.AssetAutomationSetting { AssetAutomationType = AssetAutomationType.GenerateEnhancedYoutubeVideos, AssetAutomationStatus = AssetAutomationStatus.OptedIn }, new Campaign.Types.AssetAutomationSetting { AssetAutomationType = AssetAutomationType.GenerateImageEnhancement, AssetAutomationStatus = AssetAutomationStatus.OptedIn }, }); MutateOperation operation = new MutateOperation() { CampaignOperation = new CampaignOperation() { Create = campaign } }; return operation; }
PHP
private static function createPerformanceMaxCampaignOperation( int $customerId, bool $brandGuidelinesEnabled ): MutateOperation { // Creates a mutate operation that creates a campaign operation. return new MutateOperation([ 'campaign_operation' => new CampaignOperation([ 'create' => new Campaign([ 'name' => 'Performance Max campaign #' . Helper::getPrintableDatetime(), // Assigns the resource name with a temporary ID. 'resource_name' => ResourceNames::forCampaign( $customerId, self::PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID ), // Sets the budget using the given budget resource name. 'campaign_budget' => ResourceNames::forCampaignBudget( $customerId, self::BUDGET_TEMPORARY_ID ), // The campaign is the only entity in the mutate request that should have its // status set. // Recommendation: Set the campaign to PAUSED when creating it to prevent // the ads from immediately serving. 'status' => CampaignStatus::PAUSED, // All Performance Max campaigns have an advertising_channel_type of // PERFORMANCE_MAX. The advertising_channel_sub_type should not be set. 'advertising_channel_type' => AdvertisingChannelType::PERFORMANCE_MAX, // Bidding strategy must be set directly on the campaign. // Setting a portfolio bidding strategy by resource name is not supported. // Max Conversion and Maximize Conversion Value are the only strategies // supported for Performance Max campaigns. // An optional ROAS (Return on Advertising Spend) can be set for // maximize_conversion_value. The ROAS value must be specified as a ratio in // the API. It is calculated by dividing "total value" by "total spend". // For more information on Maximize Conversion Value, see the support // article: http://support.google.com/google-ads/answer/7684216. // A target_roas of 3.5 corresponds to a 350% return on ad spend. 'maximize_conversion_value' => new MaximizeConversionValue([ 'target_roas' => 3.5 ]), 'asset_automation_settings' => [ new AssetAutomationSetting([ 'asset_automation_type' => AssetAutomationType::TEXT_ASSET_AUTOMATION, 'asset_automation_status' => AssetAutomationStatus::OPTED_IN ]), new AssetAutomationSetting([ 'asset_automation_type' => AssetAutomationType::URL_EXPANSION, 'asset_automation_status' => AssetAutomationStatus::OPTED_IN ]) ], // Sets if the campaign is enabled for brand guidelines. For more information // on brand guidelines, see // https://support.google.com/google-ads/answer/14934472. 'brand_guidelines_enabled' => $brandGuidelinesEnabled, // Declare whether or not this campaign serves political ads targeting the EU. 'contains_eu_political_advertising' => EuPoliticalAdvertisingStatus::DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING, // Optional fields. 'start_date' => date('Ymd', strtotime('+1 day')), 'end_date' => date('Ymd', strtotime('+365 days')) ]) ]) ]); }
Python
def create_performance_max_campaign_operation( client: GoogleAdsClient, customer_id: str, brand_guidelines_enabled: bool, ) -> MutateOperation: """Creates a MutateOperation that creates a new Performance Max campaign. A temporary ID will be assigned to this campaign so that it can be referenced by other objects being created in the same Mutate request. Args: client: an initialized GoogleAdsClient instance. customer_id: a client customer ID. brand_guidelines_enabled: a boolean value indicating if the campaign is enabled for brand guidelines. Returns: a MutateOperation that creates a campaign. """ mutate_operation: MutateOperation = client.get_type("MutateOperation") campaign: Campaign = mutate_operation.campaign_operation.create campaign.name = f"Performance Max campaign #{uuid4()}" # Set the campaign status as PAUSED. The campaign is the only entity in # the mutate request that should have its status set. campaign.status = client.enums.CampaignStatusEnum.PAUSED # All Performance Max campaigns have an advertising_channel_type of # PERFORMANCE_MAX. The advertising_channel_sub_type should not be set. campaign.advertising_channel_type = ( client.enums.AdvertisingChannelTypeEnum.PERFORMANCE_MAX ) # Bidding strategy must be set directly on the campaign. # Setting a portfolio bidding strategy by resource name is not supported. # Max Conversion and Maximize Conversion Value are the only strategies # supported for Performance Max campaigns. # An optional ROAS (Return on Advertising Spend) can be set for # maximize_conversion_value. The ROAS value must be specified as a ratio in # the API. It is calculated by dividing "total value" by "total spend". # For more information on Maximize Conversion Value, see the support # article: http://support.google.com/google-ads/answer/7684216. # A target_roas of 3.5 corresponds to a 350% return on ad spend. campaign.bidding_strategy_type = ( client.enums.BiddingStrategyTypeEnum.MAXIMIZE_CONVERSION_VALUE ) campaign.maximize_conversion_value.target_roas = 3.5 # Set if the campaign is enabled for brand guidelines. For more information # on brand guidelines, see https://support.google.com/google-ads/answer/14934472. campaign.brand_guidelines_enabled = brand_guidelines_enabled # Assign the resource name with a temporary ID. campaign_service: CampaignServiceClient = client.get_service( "CampaignService" ) campaign.resource_name = campaign_service.campaign_path( customer_id, _PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID ) # Set the budget using the given budget resource name. campaign.campaign_budget = campaign_service.campaign_budget_path( customer_id, _BUDGET_TEMPORARY_ID ) # Declare whether or not this campaign serves political ads targeting the # EU. Valid values are: # CONTAINS_EU_POLITICAL_ADVERTISING # DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING campaign.contains_eu_political_advertising = ( client.enums.EuPoliticalAdvertisingStatusEnum.DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING ) # Optional fields campaign.start_date = (datetime.now() + timedelta(1)).strftime("%Y%m%d") campaign.end_date = (datetime.now() + timedelta(365)).strftime("%Y%m%d") # Configures the optional opt-in/out status for asset automation settings. for asset_automation_type_enum in [ client.enums.AssetAutomationTypeEnum.GENERATE_IMAGE_EXTRACTION, client.enums.AssetAutomationTypeEnum.FINAL_URL_EXPANSION_TEXT_ASSET_AUTOMATION, client.enums.AssetAutomationTypeEnum.TEXT_ASSET_AUTOMATION, client.enums.AssetAutomationTypeEnum.GENERATE_ENHANCED_YOUTUBE_VIDEOS, client.enums.AssetAutomationTypeEnum.GENERATE_IMAGE_ENHANCEMENT ]: asset_automattion_setting: Campaign.AssetAutomationSetting = client.get_type("Campaign").AssetAutomationSetting() asset_automattion_setting.asset_automation_type = asset_automation_type_enum asset_automattion_setting.asset_automation_status = client.enums.AssetAutomationStatusEnum.OPTED_IN campaign.asset_automation_settings.append(asset_automattion_setting) return mutate_operation
Ruby
# Creates a MutateOperation that creates a new Performance Max campaign. # # A temporary ID will be assigned to this campaign so that it can # be referenced by other objects being created in the same Mutate request. def create_performance_max_campaign_operation( client, customer_id, brand_guidelines_enabled) client.operation.mutate do |m| m.campaign_operation = client.operation.create_resource.campaign do |c| c.name = "Performance Max campaign #{SecureRandom.uuid}" # Set the campaign status as PAUSED. The campaign is the only entity in # the mutate request that should have its status set. c.status = :PAUSED # All Performance Max campaigns have an advertising_channel_type of # PERFORMANCE_MAX. The advertising_channel_sub_type should not be set. c.advertising_channel_type = :PERFORMANCE_MAX # Bidding strategy must be set directly on the campaign. # Setting a portfolio bidding strategy by resource name is not supported. # Max Conversion and Maximize Conversion Value are the only strategies # supported for Performance Max campaigns. # An optional ROAS (Return on Advertising Spend) can be set for # maximize_conversion_value. The ROAS value must be specified as a ratio in # the API. It is calculated by dividing "total value" by "total spend". # For more information on Maximize Conversion Value, see the support # article: http://support.google.com/google-ads/answer/7684216. # A target_roas of 3.5 corresponds to a 350% return on ad spend. c.bidding_strategy_type = :MAXIMIZE_CONVERSION_VALUE c.maximize_conversion_value = client.resource.maximize_conversion_value do |mcv| mcv.target_roas = 3.5 end # Configures the optional opt-in/out status for asset automation settings. c.asset_automation_settings << client.resource.asset_automation_setting do |aas| aas.asset_automation_type = :GENERATE_IMAGE_EXTRACTION aas.asset_automation_status = :OPTED_IN end c.asset_automation_settings << client.resource.asset_automation_setting do |aas| aas.asset_automation_type = :FINAL_URL_EXPANSION_TEXT_ASSET_AUTOMATION aas.asset_automation_status = :OPTED_IN end c.asset_automation_settings << client.resource.asset_automation_setting do |aas| aas.asset_automation_type = :TEXT_ASSET_AUTOMATION aas.asset_automation_status = :OPTED_IN end c.asset_automation_settings << client.resource.asset_automation_setting do |aas| aas.asset_automation_type = :GENERATE_ENHANCED_YOUTUBE_VIDEOS aas.asset_automation_status = :OPTED_IN end c.asset_automation_settings << client.resource.asset_automation_setting do |aas| aas.asset_automation_type = :GENERATE_IMAGE_ENHANCEMENT aas.asset_automation_status = :OPTED_IN end # Set if the campaign is enabled for brand guidelines. For more # information on brand guidelines, see # https://support.google.com/google-ads/answer/14934472. c.brand_guidelines_enabled = brand_guidelines_enabled # Assign the resource name with a temporary ID. c.resource_name = client.path.campaign(customer_id, PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID) # Set the budget using the given budget resource name. c.campaign_budget = client.path.campaign_budget(customer_id, BUDGET_TEMPORARY_ID) # Declare whether or not this campaign serves political ads targeting the EU. # Valid values are CONTAINS_EU_POLITICAL_ADVERTISING and # DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING. c.contains_eu_political_advertising = :DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING # Optional fields c.start_date = DateTime.parse((Date.today + 1).to_s).strftime('%Y%m%d') c.end_date = DateTime.parse(Date.today.next_year.to_s).strftime('%Y%m%d') end end end
Perl
sub create_performance_max_campaign_operation { my ($customer_id, $brand_guidelines_enabled) = @_; # Configures the optional opt-in/out status for asset automation settings. # When we create the campaign object, we set campaign->{assetAutomationSettings} # equal to $asset_automation_settings. my $asset_automation_settings = []; my $asset_automation_types = [ GENERATE_IMAGE_EXTRACTION, FINAL_URL_EXPANSION_TEXT_ASSET_AUTOMATION, TEXT_ASSET_AUTOMATION, GENERATE_ENHANCED_YOUTUBE_VIDEOS, GENERATE_IMAGE_ENHANCEMENT ]; foreach my $asset_automation_type (@$asset_automation_types) { push @$asset_automation_settings, Google::Ads::GoogleAds::V22::Resources::AssetAutomationSetting->new({ assetAutomationStatus => OPTED_IN, assetAutomationType => $asset_automation_type }); } # Create a mutate operation that creates a campaign operation. return Google::Ads::GoogleAds::V22::Services::GoogleAdsService::MutateOperation-> new({ campaignOperation => Google::Ads::GoogleAds::V22::Services::CampaignService::CampaignOperation ->new({ create => Google::Ads::GoogleAds::V22::Resources::Campaign->new({ # Assign the resource name with a temporary ID. resourceName => Google::Ads::GoogleAds::V22::Utils::ResourceNames::campaign( $customer_id, PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID ), name => "Performance Max campaign #" . uniqid(), # Set the budget using the given budget resource name. campaignBudget => Google::Ads::GoogleAds::V22::Utils::ResourceNames::campaign_budget( $customer_id, BUDGET_TEMPORARY_ID ), # Set the campaign status as PAUSED. The campaign is the only entity in # the mutate request that should have its status set. status => Google::Ads::GoogleAds::V22::Enums::CampaignStatusEnum::PAUSED, # All Performance Max campaigns have an advertisingChannelType of # PERFORMANCE_MAX. The advertisingChannelSubType should not be set. advertisingChannelType => PERFORMANCE_MAX, # Bidding strategy must be set directly on the campaign. # Setting a portfolio bidding strategy by resource name is not supported. # Max Conversion and Maximize Conversion Value are the only strategies # supported for Performance Max campaigns. # An optional ROAS (Return on Advertising Spend) can be set for # maximizeConversionValue. The ROAS value must be specified as a ratio in # the API. It is calculated by dividing "total value" by "total spend". # For more information on Maximize Conversion Value, see the support # article: http://support.google.com/google-ads/answer/7684216. # A targetRoas of 3.5 corresponds to a 350% return on ad spend. maximizeConversionValue => Google::Ads::GoogleAds::V22::Common::MaximizeConversionValue-> new({ targetRoas => 3.5 } ), # Set if the campaign is enabled for brand guidelines. For more information # on brand guidelines, see https://support.google.com/google-ads/answer/14934472. brandGuidelinesEnabled => $brand_guidelines_enabled, # Configures the optional opt-in/out status for asset automation settings. assetAutomationSettings => $asset_automation_settings, # Optional fields. startDate => strftime("%Y%m%d", localtime(time + 60 * 60 * 24)), endDate => strftime("%Y%m%d", localtime(time + 60 * 60 * 24 * 365)), # Declare whether or not this campaign serves political ads targeting the EU. # Valid values are CONTAINS_EU_POLITICAL_ADVERTISING and # DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING. containsEuPoliticalAdvertising => DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING })})}); }
입찰 추천
Google Ads API는 실적 최대화 캠페인 입찰을 최적화하는 데 도움이 되는 두 가지 추천 유형을 제공합니다.
MAXIMIZE_CONVERSION_VALUE_OPT_IN캠페인에 전환 가치 극대화 입찰 전략을 사용하는 것이 좋습니다.MAXIMIZE_CONVERSIONS_OPT_IN에서는 캠페인에 전환수 최대화 입찰 전략을 사용할 것을 권장하고 예산 금액을 제안합니다.
추천 사용에 대한 자세한 내용은 최적화 점수 및 추천 가이드를 참고하세요.
브랜드 가이드라인
브랜드 가이드라인은 실적 최대화 캠페인의 자동 확장 소재 또는 형식에 브랜드가 표시되는 방식을 관리합니다. Google Ads API v21부터 실적 최대화 캠페인에서는 모든 신규 온라인 판매 또는 리드 생성을 위한 실적 최대화 캠페인(표준) 및 제품 피드가 있는 온라인 판매를 위한 실적 최대화 캠페인 (소매)에서 브랜드 가이드라인이 자동으로 사용 설정됩니다. 새 캠페인에서 브랜드 가이드라인을 사용 설정하지 않으려면 새 실적 최대화 캠페인을 만들 때 Campaign.brand_guidelines_enabled을 false로 설정하세요.
브랜드 가이드라인이 사용 설정된 실적 최대화 캠페인은 브랜드 애셋 필드 유형(BUSINESS_NAME, LOGO, LANDSCAPE_LOGO)에 캠페인 수준 애셋을 사용합니다. CampaignAsset을 사용하여 브랜드 애셋을 캠페인에 연결해야 하며 캠페인에 다음이 있어야 합니다.
BUSINESS_NAME애셋이 정확히 하나LOGO확장 소재 1개 이상 및LOGO또는LANDSCAPE_LOGO유형의 추가 로고 확장 소재 최대 4개(선택사항)
캠페인의 선택적 색상 및 글꼴 가이드라인은 Campaign.brand_guidelines 필드를 사용하여 설정할 수 있습니다.
main_color은 기본 색상을 설정합니다. 색상은 16진수 코드 문자열로 제공되어야 합니다(예: #00ff00)을 사용합니다.accent_color는 2차 색상을 설정합니다. 색상은 16진수 코드 문자열로 제공되어야 합니다(예: #00ff00)을 사용합니다.predefined_font_family을 사용하여 글꼴을 설정합니다. 값은 다음 Google 글꼴 중 하나여야 합니다 (대소문자 구분). Open Sans, Roboto, Montserrat, Poppins, Lato, Oswald, Playfair Display, Roboto Slab
다음 예에서는 브랜드 가이드라인이 사용 설정된 경우 BUSINESS_NAME 및 LOGO 애셋을 만들고 캠페인에 연결하는 방법을 보여주고, 브랜드 가이드라인이 사용 중지된 경우 AssetGroup에 연결하는 방법을 보여줍니다. 애셋 그룹에 대한 자세한 내용은 애셋 그룹 설정 가이드를 참고하세요.
자바
/** Creates a list of MutateOperations that create linked brand assets. */ List<MutateOperation> createAndLinkBrandAssets( long customerId, boolean brandGuidelinesEnabled, String businessName, String logoUrl, String logoName) throws IOException { List<MutateOperation> mutateOperations = new ArrayList<>(); // Creates the brand name text asset. String businessNameAssetResourceName = ResourceNames.asset(customerId, getNextTemporaryId()); Asset businessNameAsset = Asset.newBuilder() .setResourceName(businessNameAssetResourceName) .setTextAsset(TextAsset.newBuilder().setText(businessName).build()) .build(); AssetOperation businessNameAssetOperation = AssetOperation.newBuilder().setCreate(businessNameAsset).build(); mutateOperations.add( MutateOperation.newBuilder().setAssetOperation(businessNameAssetOperation).build()); // Creates the logo image asset. String logoAssetResourceName = ResourceNames.asset(customerId, getNextTemporaryId()); // Creates a media file. byte[] logoBytes = ByteStreams.toByteArray(new URL(logoUrl).openStream()); Asset logoAsset = Asset.newBuilder() .setResourceName(logoAssetResourceName) .setImageAsset(ImageAsset.newBuilder().setData(ByteString.copyFrom(logoBytes)).build()) // Provides a unique friendly name to identify your asset. When there is an existing // image asset with the same content but a different name, the new name will be dropped // silently. .setName(logoName) .build(); AssetOperation logoImageAssetOperation = AssetOperation.newBuilder().setCreate(logoAsset).build(); mutateOperations.add( MutateOperation.newBuilder().setAssetOperation(logoImageAssetOperation).build()); if (brandGuidelinesEnabled) { // Creates CampaignAsset resources to link the Asset resources to the Campaign. mutateOperations.add( createCampaignAssetMutateOperation( customerId, AssetFieldType.BUSINESS_NAME, businessNameAssetResourceName)); mutateOperations.add( createCampaignAssetMutateOperation( customerId, AssetFieldType.LOGO, logoAssetResourceName)); } else { // Creates an AssetGroupAsset to link the Asset to the AssetGroup. mutateOperations.add( createAssetGroupAssetMutateOperation( AssetFieldType.BUSINESS_NAME, businessNameAssetResourceName, ResourceNames.assetGroup(customerId, ASSET_GROUP_TEMPORARY_ID))); mutateOperations.add( createAssetGroupAssetMutateOperation( AssetFieldType.LOGO, logoAssetResourceName, ResourceNames.assetGroup(customerId, ASSET_GROUP_TEMPORARY_ID))); } return mutateOperations; } /** Creates a MutateOperation to add an AssetGroupAsset. */ MutateOperation createAssetGroupAssetMutateOperation( AssetFieldType fieldType, String assetResourceName, String assetGroupResourceName) { AssetGroupAsset assetGroupAsset = AssetGroupAsset.newBuilder() .setFieldType(fieldType) .setAssetGroup(assetGroupResourceName) .setAsset(assetResourceName) .build(); AssetGroupAssetOperation assetGroupAssetOperation = AssetGroupAssetOperation.newBuilder().setCreate(assetGroupAsset).build(); return MutateOperation.newBuilder() .setAssetGroupAssetOperation(assetGroupAssetOperation) .build(); } /** Creates a MutateOperation to add a CampaignAsset. */ MutateOperation createCampaignAssetMutateOperation( long customerId, AssetFieldType fieldType, String assetResourceName) { CampaignAsset campaignAsset = CampaignAsset.newBuilder() .setFieldType(fieldType) .setCampaign(ResourceNames.campaign(customerId, PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID)) .setAsset(assetResourceName) .build(); CampaignAssetOperation campaignAssetOperation = CampaignAssetOperation.newBuilder().setCreate(campaignAsset).build(); return MutateOperation.newBuilder().setCampaignAssetOperation(campaignAssetOperation).build(); }
C#
private List<MutateOperation> CreateAndLinkBrandAssets( string assetGroupResourceName, string campaignResourceName, AssetTemporaryResourceNameGenerator assetResourceNameGenerator, string businessName, string logoUrl, string logoName, GoogleAdsConfig config, bool brandGuidelinesEnabled) { List<MutateOperation> operations = new List<MutateOperation>(); string logoAssetResourceName = assetResourceNameGenerator.Next(); string businessNameAssetResourceName = assetResourceNameGenerator.Next(); // Create the Image Asset. operations.Add( new MutateOperation() { AssetOperation = new AssetOperation() { Create = new Asset() { ResourceName = logoAssetResourceName, ImageAsset = new ImageAsset() { Data = ByteString.CopyFrom( MediaUtilities.GetAssetDataFromUrl(logoUrl, config) ) }, // Provide a unique friendly name to identify your asset. // When there is an existing image asset with the same content but a // different name, the new name will be dropped silently. Name = logoName } } } ); // Create the business name asset. operations.Add( new MutateOperation() { AssetOperation = new AssetOperation() { Create = new Asset() { ResourceName = businessNameAssetResourceName, TextAsset = new TextAsset() { Text = businessName, } } } } ); if (brandGuidelinesEnabled) { // Create CampaignAssets to link the Assets to the Campaign. operations.Add( new MutateOperation() { CampaignAssetOperation = new CampaignAssetOperation() { Create = new CampaignAsset() { FieldType = AssetFieldType.Logo, Campaign = campaignResourceName, Asset = logoAssetResourceName } } } ); operations.Add( new MutateOperation() { CampaignAssetOperation = new CampaignAssetOperation() { Create = new CampaignAsset() { FieldType = AssetFieldType.BusinessName, Campaign = campaignResourceName, Asset = businessNameAssetResourceName } } } ); } else { // Create AssetGroupAssets to link the Assets to the AssetGroup. operations.Add( new MutateOperation() { AssetGroupAssetOperation = new AssetGroupAssetOperation() { Create = new AssetGroupAsset() { FieldType = AssetFieldType.Logo, AssetGroup = assetGroupResourceName, Asset = logoAssetResourceName } } } ); operations.Add( new MutateOperation() { AssetGroupAssetOperation = new AssetGroupAssetOperation() { Create = new AssetGroupAsset() { FieldType = AssetFieldType.BusinessName, AssetGroup = assetGroupResourceName, Asset = businessNameAssetResourceName } } } ); } return operations; }
PHP
This example is not yet available in PHP; you can take a look at the other languages.
Python
def create_and_link_brand_assets( client: GoogleAdsClient, customer_id: str, brand_guidelines_enabled: bool, business_name: str, logo_url: str, logo_name: str, ) -> List[MutateOperation]: """Creates a list of MutateOperations that create linked brand assets. Args: client: an initialized GoogleAdsClient instance. customer_id: a client customer ID. brand_guidelines_enabled: a boolean value indicating if the campaign is enabled for brand guidelines. business_name: the business name text to be put into an asset. logo_url: the url of the logo to be retrieved and put into an asset. logo_name: the asset name of the logo. Returns: MutateOperations that create linked brand assets. """ global next_temp_id operations: List[MutateOperation] = [] asset_service: AssetServiceClient = client.get_service("AssetService") # Create the Text Asset. text_asset_temp_id = next_temp_id next_temp_id -= 1 text_mutate_operation = client.get_type("MutateOperation") text_asset: Asset = text_mutate_operation.asset_operation.create text_asset.resource_name = asset_service.asset_path( customer_id, text_asset_temp_id ) text_asset.text_asset.text = business_name operations.append(text_mutate_operation) # Create the Image Asset. image_asset_temp_id = next_temp_id next_temp_id -= 1 image_mutate_operation = client.get_type("MutateOperation") image_asset: Asset = image_mutate_operation.asset_operation.create image_asset.resource_name = asset_service.asset_path( customer_id, image_asset_temp_id ) # Provide a unique friendly name to identify your asset. # When there is an existing image asset with the same content but a different # name, the new name will be dropped silently. image_asset.name = logo_name image_asset.type_ = client.enums.AssetTypeEnum.IMAGE image_asset.image_asset.data = get_image_bytes_from_url(logo_url) operations.append(image_mutate_operation) if brand_guidelines_enabled: # Create CampaignAsset resources to link the Asset resources to the Campaign. campaign_service: CampaignServiceClient = client.get_service( "CampaignService" ) business_name_mutate_operation: MutateOperation = client.get_type( "MutateOperation" ) business_name_campaign_asset: CampaignAsset = ( business_name_mutate_operation.campaign_asset_operation.create ) business_name_campaign_asset.field_type = ( client.enums.AssetFieldTypeEnum.BUSINESS_NAME ) business_name_campaign_asset.campaign = campaign_service.campaign_path( customer_id, _PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID ) business_name_campaign_asset.asset = asset_service.asset_path( customer_id, text_asset_temp_id ) operations.append(business_name_mutate_operation) logo_mutate_operation: MutateOperation = client.get_type( "MutateOperation" ) logo_campaign_asset: CampaignAsset = ( logo_mutate_operation.campaign_asset_operation.create ) logo_campaign_asset.field_type = client.enums.AssetFieldTypeEnum.LOGO logo_campaign_asset.campaign = campaign_service.campaign_path( customer_id, _PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID ) logo_campaign_asset.asset = asset_service.asset_path( customer_id, image_asset_temp_id ) operations.append(logo_mutate_operation) else: # Create AssetGroupAsset resources to link the Asset resources to the AssetGroup. asset_group_service: AssetGroupServiceClient = client.get_service( "AssetGroupService" ) business_name_mutate_operation: MutateOperation = client.get_type( "MutateOperation" ) business_name_asset_group_asset: AssetGroupAsset = ( business_name_mutate_operation.asset_group_asset_operation.create ) business_name_asset_group_asset.field_type = ( client.enums.AssetFieldTypeEnum.BUSINESS_NAME ) business_name_asset_group_asset.asset_group = ( asset_group_service.asset_group_path( customer_id, _ASSET_GROUP_TEMPORARY_ID, ) ) business_name_asset_group_asset.asset = asset_service.asset_path( customer_id, text_asset_temp_id ) operations.append(business_name_mutate_operation) logo_mutate_operation: MutateOperation = client.get_type( "MutateOperation" ) logo_asset_group_asset: AssetGroupAsset = ( logo_mutate_operation.asset_group_asset_operation.create ) logo_asset_group_asset.field_type = client.enums.AssetFieldTypeEnum.LOGO logo_asset_group_asset.asset_group = ( asset_group_service.asset_group_path( customer_id, _ASSET_GROUP_TEMPORARY_ID, ) ) logo_asset_group_asset.asset = asset_service.asset_path( customer_id, image_asset_temp_id ) operations.append(logo_mutate_operation) return operations
Ruby
# Creates a list of MutateOperations that create linked brand assets. def create_and_link_brand_assets( client, customer_id, brand_guidelines_enabled, business_name, logo_url, logo_name) operations = [] # Create the Text Asset. text_asset_temp_id = next_temp_id operations << client.operation.mutate do |m| m.asset_operation = client.operation.create_resource.asset do |a| a.resource_name = client.path.asset(customer_id, text_asset_temp_id) a.text_asset = client.resource.text_asset do |text_asset| text_asset.text = business_name end end end # Create the Image Asset. image_asset_temp_id = next_temp_id operations << client.operation.mutate do |m| m.asset_operation = client.operation.create_resource.asset do |a| a.resource_name = client.path.asset(customer_id, image_asset_temp_id) # Provide a unique friendly name to identify your asset. # When there is an existing image asset with the same content but a different # name, the new name will be dropped silently. a.name = logo_name a.type = :IMAGE a.image_asset = client.resource.image_asset do |image_asset| image_asset.data = get_image_bytes(logo_url) end end end if brand_guidelines_enabled # Create CampaignAsset resources to link the Asset resources to the Campaign. operations << client.operation.mutate do |m| m.campaign_asset_operation = client.operation.create_resource. campaign_asset do |ca| ca.field_type = :BUSINESS_NAME ca.campaign = client.path.campaign( customer_id, PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID, ) ca.asset = client.path.asset(customer_id, text_asset_temp_id) end end operations << client.operation.mutate do |m| m.campaign_asset_operation = client.operation.create_resource. campaign_asset do |ca| ca.field_type = :LOGO ca.campaign = client.path.campaign( customer_id, PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID, ) ca.asset = client.path.asset(customer_id, image_asset_temp_id) end end else # Create AssetGroupAsset resources to link the Asset resources to the AssetGroup. operations << client.operation.mutate do |m| m.asset_group_asset_operation = client.operation.create_resource. asset_group_asset do |aga| aga.field_type = :BUSINESS_NAME aga.asset_group = client.path.asset_group( customer_id, ASSET_GROUP_TEMPORARY_ID, ) aga.asset = client.path.asset(customer_id, text_asset_temp_id) end end operations << client.operation.mutate do |m| m.asset_group_asset_operation = client.operation.create_resource. asset_group_asset do |aga| aga.field_type = :LOGO aga.asset_group = client.path.asset_group( customer_id, ASSET_GROUP_TEMPORARY_ID, ) aga.asset = client.path.asset(customer_id, image_asset_temp_id) end end end operations end
Perl
# Creates a list of MutateOperations that create linked brand assets. sub create_and_link_brand_assets { my ($customer_id, $brand_guidelines_enabled, $business_name, $logo_url, $logo_name) = @_; my $operations = []; # Create the text asset. my $text_asset_temp_id = $next_temp_id--; push @$operations, Google::Ads::GoogleAds::V22::Services::GoogleAdsService::MutateOperation-> new({ assetOperation => Google::Ads::GoogleAds::V22::Services::AssetService::AssetOperation-> new({ create => Google::Ads::GoogleAds::V22::Resources::Asset->new({ resourceName => Google::Ads::GoogleAds::V22::Utils::ResourceNames::asset( $customer_id, $text_asset_temp_id ), textAsset => Google::Ads::GoogleAds::V22::Common::TextAsset->new({ text => $business_name })})})}); # Create the image asset. my $image_asset_temp_id = $next_temp_id--; push @$operations, Google::Ads::GoogleAds::V22::Services::GoogleAdsService::MutateOperation-> new({ assetOperation => Google::Ads::GoogleAds::V22::Services::AssetService::AssetOperation-> new({ create => Google::Ads::GoogleAds::V22::Resources::Asset->new({ resourceName => Google::Ads::GoogleAds::V22::Utils::ResourceNames::asset( $customer_id, $image_asset_temp_id ), # Provide a unique friendly name to identify your asset. # When there is an existing image asset with the same content but a different # name, the new name will be dropped silently. name => $logo_name, imageAsset => Google::Ads::GoogleAds::V22::Common::ImageAsset->new({ data => get_base64_data_from_url($logo_url)})})})}); if ($brand_guidelines_enabled) { # Create CampaignAsset resources to link the Asset resources to the Campaign. push @$operations, Google::Ads::GoogleAds::V22::Services::GoogleAdsService::MutateOperation ->new({ campaignAssetOperation => Google::Ads::GoogleAds::V22::Services::CampaignAssetService::CampaignAssetOperation ->new({ create => Google::Ads::GoogleAds::V22::Resources::CampaignAsset->new({ fieldType => BUSINESS_NAME, campaign => Google::Ads::GoogleAds::V22::Utils::ResourceNames::campaign( $customer_id, PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID ), asset => Google::Ads::GoogleAds::V22::Utils::ResourceNames::asset( $customer_id, $text_asset_temp_id )})})}); push @$operations, Google::Ads::GoogleAds::V22::Services::GoogleAdsService::MutateOperation ->new({ campaignAssetOperation => Google::Ads::GoogleAds::V22::Services::CampaignAssetService::CampaignAssetOperation ->new({ create => Google::Ads::GoogleAds::V22::Resources::CampaignAsset->new({ fieldType => LOGO, campaign => Google::Ads::GoogleAds::V22::Utils::ResourceNames::campaign( $customer_id, PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID ), asset => Google::Ads::GoogleAds::V22::Utils::ResourceNames::asset( $customer_id, $image_asset_temp_id )})})}); } else { # Create AssetGroupAsset resources to link the Asset resources to the AssetGroup. push @$operations, Google::Ads::GoogleAds::V22::Services::GoogleAdsService::MutateOperation ->new({ assetGroupAssetOperation => Google::Ads::GoogleAds::V22::Services::AssetGroupAssetService::AssetGroupAssetOperation ->new({ create => Google::Ads::GoogleAds::V22::Resources::AssetGroupAsset->new({ asset => Google::Ads::GoogleAds::V22::Utils::ResourceNames::asset( $customer_id, $text_asset_temp_id ), assetGroup => Google::Ads::GoogleAds::V22::Utils::ResourceNames::asset_group( $customer_id, ASSET_GROUP_TEMPORARY_ID ), fieldType => BUSINESS_NAME })})}); push @$operations, Google::Ads::GoogleAds::V22::Services::GoogleAdsService::MutateOperation ->new({ assetGroupAssetOperation => Google::Ads::GoogleAds::V22::Services::AssetGroupAssetService::AssetGroupAssetOperation ->new({ create => Google::Ads::GoogleAds::V22::Resources::AssetGroupAsset->new({ asset => Google::Ads::GoogleAds::V22::Utils::ResourceNames::asset( $customer_id, $image_asset_temp_id ), assetGroup => Google::Ads::GoogleAds::V22::Utils::ResourceNames::asset_group( $customer_id, ASSET_GROUP_TEMPORARY_ID ), fieldType => LOGO })})}); } return $operations; }
자동 이전
2025년 6월 1일부터 모든 애셋 그룹에서 동일한 브랜드 애셋 (BUSINESS_NAME, LOGO, LANDSCAPE_LOGO)을 사용하는 실적 최대화 캠페인에 대해 브랜드 가이드라인이 자동으로 사용 설정됩니다. 자동으로 이전할 수 있는 모든 캠페인은 2025년 10월 30일까지 이전됩니다.
- 자동 이전은 모든 애셋 그룹에서 일관된 비즈니스 이름과 로고를 사용하는 캠페인에만 적용됩니다. 캠페인에 이러한 확장 소재의 변형이 있는 경우 자동으로 이전되지 않습니다.
- 고객 ID에 속한 요건을 충족하는 모든 실적 최대화 캠페인이 동시에 이전됩니다.
- 이전 후 각 이전된 캠페인에는
CampaignAsset를 사용하여 캠페인 수준에 저장된 자체 브랜드 애셋 세트가 있습니다.
Campaign.brand_guidelines_enabled 필드를 확인하여 캠페인이 이전되었는지 알 수 있습니다.
수동 이전
자동 이전할 수 없는 캠페인에서 브랜드 가이드라인을 사용하려면 수동으로 이전해야 합니다.
Campaign.brand_guidelines_enabled는 기존 캠페인에 브랜드 가이드라인이 사용 설정되어 있는지 나타냅니다. 기존 캠페인에 브랜드 가이드라인을 수동으로 사용 설정하려면 필드가 변경 불가능하므로 brand_guidelines_enabled 필드를 직접 업데이트하는 대신 CampaignService.EnablePMaxBrandGuidelines를 사용하세요. auto_populate_brand_assets을 true로 설정하여 실적이 우수한 브랜드 애셋으로 캠페인을 자동으로 채웁니다. 그렇지 않으면 brand_assets를 사용하여 작업에서 애셋을 수동으로 제공해야 합니다. 캠페인의 브랜드 가이드라인을 사용 중지하는 것은 지원되지 않습니다.