Google محصولات و مخاطبان مختلفی را ارائه میدهد که میتوانید از آنها برای ساختن
پویشها استفاده کنید، هرچند ممکن است ندانید چگونه طرحی را تدوین کنید. برای کمک به این کار،
ReachPlanService روشهای کشفی را ارائه میدهد که میتوانید از آنها
برای تولید منحنی استفاده کنید.
هدفیابی مخاطب
اولین مؤلفه طرح رسانه، هدفیابی مخاطب است که میتواند شامل معیارهای هدف زیر باشد:
- مخاطبان: مخاطبان وابسته، جویای خرید، و فهرست کاربر را بااستفاده از
targeting.audience_targeting(AudienceTargeting) هدف قرار دهید. معیارهای پشتیبانیشده را بااستفاده ازReachPlanService.ListPlannableUserInterestsوReachPlanService.ListPlannableUserListsپُرسمان کنید. - محدودههای سنی: گروههای سنی هدف را بااستفاده از
ReachPlanAgeRangeenum مشخص کنید. - جنسیتها: جنسیتهای خاصی را بااستفاده از معیار
GenderInfoهدف قرار دهید. - دستگاهها: دستگاههای خاصی را بااستفاده از معیار
DeviceInfoهدفیابی کنید. - مکانها: شناسههای مکان پشتیبانیشده را بااستفاده از
ListPlannableLocationsپیدا کنید. - شبکهها: شبکههای پشتیبانیشده برای مکان و محصول را که ممکن است براساس محصول و منطقه متفاوت باشد بااستفاده از
ListPlannableProductsمشاهده کنید. - وضعیت والدینی: وضعیتهای والدینی خاص را بااستفاده از معیار
ParentalStatusInfoهدفیابی کنید (درv25و نسخههای جدیدتر دردسترس است). - مجموعههای YouTube Select: مجموعههای خاصی را بااستفاده از
YouTubeSelectSettingsدر طرحهای دسترسی خود هدف قرار دهید تا به مخاطبان درگیر در محتوای گلچینشده در سراسر YouTube دسترسی پیدا کنید.
ترکیب محصول
علاوهبر اطلاعات هدفیابی، باید ترکیب محصول را هم مشخص کنید تا منحنی تولید شود.
روش ListPlannableProducts در
ReachPlanService جدیدترین قالبهای دردسترس را برای
شناسه مکان دادهشده نشان میدهد. این موارد با فیلدهای زیر در
ProductMetadata نشان داده میشوند:
plannable_product_codeplannable_product_nameplannable_product_description(دردسترس درv24و نسخههای جدیدتر)plannable_product_core_attributes(درv24و نسخههای جدیدتر دردسترس است): مجموعهای از مشخصهها (ProductCoreAttributes) که برای توصیف قابلیتهای محصول استفاده میشود، ازجمله:plannable_targeting: تنظیمات هدفیابی مجاز برای محصول، مثل محدوده سنی، جنسیت، دستگاه، شبکه، و (درv25و نسخههای جدیدتر) وضعیت والدینی.
بهخاطر داشته باشید که این مقادیر بهطور دورهای تغییر میکنند، بنابراین بهتر است بهجای حفظ پاسخها بهصورت آفلاین، نتایج زنده را به کاربران خود ارائه دهید.
در اینجا نمونه کدی برای نحوه دریافت ترکیب محصول برای برخی معیارهای هدف ارائه شده است:
جاوا
private void showPlannableProducts( ReachPlanServiceClient reachPlanServiceClient, String locationId) { ListPlannableProductsRequest request = ListPlannableProductsRequest.newBuilder().setPlannableLocationId(locationId).build(); ListPlannableProductsResponse response = reachPlanServiceClient.listPlannableProducts(request); System.out.printf("Plannable Products for location %s:%n", locationId); for (ProductMetadata product : response.getProductMetadataList()) { System.out.printf("%s:%n", product.getPlannableProductCode()); System.out.println("Age Ranges:"); for (ReachPlanAgeRange ageRange : product.getPlannableTargeting().getAgeRangesList()) { System.out.printf("\t- %s%n", ageRange); } System.out.println("Genders:"); for (GenderInfo gender : product.getPlannableTargeting().getGendersList()) { System.out.printf("\t- %s%n", gender.getType()); } System.out.println("Devices:"); for (DeviceInfo device : product.getPlannableTargeting().getDevicesList()) { System.out.printf("\t- %s%n", device.getType()); } } }
C#
public void ShowPlannableProducts( ReachPlanServiceClient reachPlanService, string locationId) { ListPlannableProductsRequest request = new ListPlannableProductsRequest { PlannableLocationId = locationId }; ListPlannableProductsResponse response = reachPlanService.ListPlannableProducts( request); Console.WriteLine($"Plannable Products for location {locationId}:"); foreach (ProductMetadata product in response.ProductMetadata) { Console.WriteLine($"{product.PlannableProductCode}:"); Console.WriteLine("Age Ranges:"); foreach (ReachPlanAgeRange ageRange in product.PlannableTargeting.AgeRanges) { Console.WriteLine($"\t- {ageRange}"); } Console.WriteLine("Genders:"); foreach (GenderInfo gender in product.PlannableTargeting.Genders) { Console.WriteLine($"\t- {gender.Type}"); } Console.WriteLine("Devices:"); foreach (DeviceInfo device in product.PlannableTargeting.Devices) { Console.WriteLine($"\t- {device.Type}"); } } }
PHP
private static function showPlannableProducts(GoogleAdsClient $googleAdsClient) { $response = $googleAdsClient->getReachPlanServiceClient()->listPlannableProducts( ListPlannableProductsRequest::build(self::LOCATION_ID) ); print 'Plannable Products for Location ID ' . self::LOCATION_ID . ':' . PHP_EOL; foreach ($response->getProductMetadata() as $product) { /** @var ProductMetadata $product */ print $product->getPlannableProductCode() . ':' . PHP_EOL; print 'Age Ranges:' . PHP_EOL; foreach ($product->getPlannableTargeting()->getAgeRanges() as $ageRange) { /** @var ReachPlanAgeRange $ageRange */ printf("\t- %s%s", ReachPlanAgeRange::name($ageRange), PHP_EOL); } print 'Genders:' . PHP_EOL; foreach ($product->getPlannableTargeting()->getGenders() as $gender) { /** @var GenderInfo $gender */ printf("\t- %s%s", GenderType::name($gender->getType()), PHP_EOL); } print 'Devices:' . PHP_EOL; foreach ($product->getPlannableTargeting()->getDevices() as $device) { /** @var DeviceInfo $device */ printf("\t- %s%s", Device::name($device->getType()), PHP_EOL); } } }
Python
def show_plannable_products(client: GoogleAdsClient, location_id: str): """Lists plannable products for a given location. Args: client: an initialized GoogleAdsClient instance. location_id: The location ID to plan for. """ reach_plan_service: ReachPlanServiceClient = client.get_service( "ReachPlanService" ) response: ListPlannableProductsResponse = ( reach_plan_service.list_plannable_products( plannable_location_id=location_id ) ) print(f"Plannable Products for Location ID {location_id}") product_metadata: ProductMetadata for product_metadata in response.product_metadata: print( f"{product_metadata.plannable_product_code} : " f"{product_metadata.plannable_product_name}" ) print("Age Ranges:") age_range: ReachPlanAgeRangeEnum for age_range in product_metadata.plannable_targeting.age_ranges: print(f"\t- {age_range.name}") print("Genders:") gender: GenderInfo for gender in product_metadata.plannable_targeting.genders: print(f"\t- {gender.type_.name}") print("Devices:") device: DeviceInfo for device in product_metadata.plannable_targeting.devices: print(f"\t- {device.type_.name}")
Ruby
def show_plannable_products(reach_plan_service) response = reach_plan_service.list_plannable_products( plannable_location_id: LOCATION_ID, ) puts "Plannable Products for Location ID #{LOCATION_ID}:" response.product_metadata.each do |product| puts "#{product.plannable_product_code}:" puts "Age Ranges:" product.plannable_targeting.age_ranges.each do |age_range| puts "\t- #{age_range}" end puts "Genders:" product.plannable_targeting.genders.each do |gender| puts "\t- #{gender.type}" end puts "Devices:" product.plannable_targeting.devices.each do |device| puts "\t- #{device.type}" end end end
پرل
sub show_plannable_products { my ($reach_plan_service, $location_id) = @_; my $response = $reach_plan_service->list_plannable_products({ plannableLocationId => $location_id }); printf "Plannable Products for location %d:\n", $location_id; foreach my $product (@{$response->{productMetadata}}) { printf "%s : '%s'\n", $product->{plannableProductCode}, $product->{plannableProductName}; print "Age Ranges:\n"; foreach my $age_range (@{$product->{plannableTargeting}{ageRanges}}) { printf "\t- %s\n", $age_range; } print "Genders:\n"; foreach my $gender (@{$product->{plannableTargeting}{genders}}) { printf "\t- %s\n", $gender->{type}; } print "Devices:\n"; foreach my $device (@{$product->{plannableTargeting}{devices}}) { printf "\t- %s\n", $device->{type}; } } }
curl
برای تولید منحنی، باید بودجهای را به هر محصول اختصاص دهید:
جاوا
private void forecastManualMix( ReachPlanServiceClient reachPlanServiceClient, long customerId, String locationId, String currencyCode, long budgetMicros) { List<PlannedProduct> productMix = new ArrayList<>(); // Set up a ratio to split the budget between two products. double trueviewAllocation = 0.15; double bumperAllocation = 1 - trueviewAllocation; // See listPlannableProducts on ReachPlanService to retrieve a list // of valid PlannableProductCode's for a given location: // https://developers.google.com/google-ads/api/reference/rpc/latest/ReachPlanService productMix.add( PlannedProduct.newBuilder() .setPlannableProductCode("TRUEVIEW_IN_STREAM") .setBudgetMicros((long) (budgetMicros * bumperAllocation)) .build()); productMix.add( PlannedProduct.newBuilder() .setPlannableProductCode("BUMPER") .setBudgetMicros((long) (budgetMicros * bumperAllocation)) .build()); GenerateReachForecastRequest request = buildReachRequest(customerId, productMix, locationId, currencyCode); getReachCurve(reachPlanServiceClient, request); }
C#
public void ForecastMix(ReachPlanServiceClient reachPlanService, string customerId, string locationId, string currencyCode, long budgetMicros) { List<PlannedProduct> productMix = new List<PlannedProduct>(); // Set up a ratio to split the budget between two products. double trueviewAllocation = 0.15; double bumperAllocation = 1 - trueviewAllocation; // See listPlannableProducts on ReachPlanService to retrieve a list // of valid PlannableProductCode's for a given location: // https://developers.google.com/google-ads/api/reference/rpc/latest/ReachPlanService productMix.Add(new PlannedProduct { PlannableProductCode = "TRUEVIEW_IN_STREAM", BudgetMicros = Convert.ToInt64(budgetMicros * trueviewAllocation) }); productMix.Add(new PlannedProduct { PlannableProductCode = "BUMPER", BudgetMicros = Convert.ToInt64(budgetMicros * bumperAllocation) }); GenerateReachForecastRequest request = BuildReachRequest(customerId, productMix, locationId, currencyCode); GetReachCurve(reachPlanService, request); }
PHP
private static function forecastManualMix(GoogleAdsClient $googleAdsClient, int $customerId) { // Set up a ratio to split the budget between two products. $trueviewAllocation = floatval(0.15); $bumperAllocation = floatval(1 - $trueviewAllocation); // See listPlannableProducts on ReachPlanService to retrieve a list // of valid PlannableProductCode's for a given location: // https://developers.google.com/google-ads/api/reference/rpc/latest/ReachPlanService $productMix = [ new PlannedProduct([ 'plannable_product_code' => 'TRUEVIEW_IN_STREAM', 'budget_micros' => self::BUDGET_MICROS * $trueviewAllocation ]), new PlannedProduct([ 'plannable_product_code' => 'BUMPER', 'budget_micros' => self::BUDGET_MICROS * $bumperAllocation ]) ]; self::getReachCurve( $googleAdsClient, $customerId, $productMix, self::LOCATION_ID, self::CURRENCY_CODE ); }
Python
def forecast_manual_mix( client: GoogleAdsClient, customer_id: str, location_id: str, currency_code: str, budget: int, ): """Pulls a forecast for product mix created manually. Args: client: an initialized GoogleAdsClient instance. customer_id: The customer ID for the reach forecast. location_id: The location ID to plan for. currency_code: Three-character ISO 4217 currency code. budget: Budget to allocate to the plan. """ product_mix: list[PlannedProduct] = [] trueview_allocation = 0.15 bumper_allocation = 1 - trueview_allocation product_splits = [ ("TRUEVIEW_IN_STREAM", trueview_allocation), ("BUMPER", bumper_allocation), ] product: str split: float for product, split in product_splits: planned_product: PlannedProduct = client.get_type("PlannedProduct") planned_product.plannable_product_code = product planned_product.budget_micros = math.trunc(budget * ONE_MILLION * split) product_mix.append(planned_product) request_reach_curve( client, customer_id, product_mix, location_id, currency_code )
Ruby
def forecast_manual_mix(client, reach_plan_service, customer_id) # Set up a ratio to split the budget between two products. trueview_allocation = 0.15 bumper_allocation = 1 - trueview_allocation # See listPlannableProducts on ReachPlanService to retrieve a list # of valid PlannableProductCode's for a given location: # https://developers.google.com/google-ads/api/reference/rpc/latest/ReachPlanService product_mix = [] product_mix << client.resource.planned_product do |p| p.plannable_product_code = 'TRUEVIEW_IN_STREAM' p.budget_micros = BUDGET_MICROS * trueview_allocation end product_mix << client.resource.planned_product do |p| p.plannable_product_code = 'BUMPER' p.budget_micros = BUDGET_MICROS * bumper_allocation end get_reach_curve( client, reach_plan_service, customer_id, product_mix, LOCATION_ID, CURRENCY_CODE, ) end
پرل
sub forecast_mix { my ( $reach_plan_service, $customer_id, $location_id, $currency_code, $budget_micros ) = @_; my $product_mix = []; # Set up a ratio to split the budget between two products. my $trueview_allocation = 0.15; my $bumper_allocation = 1 - $trueview_allocation; # See list_plannable_products on ReachPlanService to retrieve a list of valid # plannable product codes for a given location: # https://developers.google.com/google-ads/api/reference/rpc/latest/ReachPlanService push @$product_mix, Google::Ads::GoogleAds::V26::Services::ReachPlanService::PlannedProduct-> new({ plannableProductCode => "TRUEVIEW_IN_STREAM", budgetMicros => int($budget_micros * $trueview_allocation)}); push @$product_mix, Google::Ads::GoogleAds::V26::Services::ReachPlanService::PlannedProduct-> new({ plannableProductCode => "BUMPER", budgetMicros => int($budget_micros * $bumper_allocation)}); my $reach_request = build_reach_request($customer_id, $product_mix, $location_id, $currency_code); pull_reach_curve($reach_plan_service, $reach_request); }
curl
در این زمان همچنین میتوانید
advanced_product_targeting را برای مجموعههای YouTube Select
تنظیم کنید.
فیلدهای درخواست پیشبینی دسترسی
باید فیلدهای customer_id، campaign_duration، و planned_products را برای هر GenerateReachForecastRequest تنظیم کنید.
همچنین میتوانید فیلدهای شرطی یا اختیاری زیر را تنظیم کنید:
| فیلد | الزام | شرح |
|---|---|---|
cookie_frequency_cap_setting |
اختیاری | حداکثر تعداد دفعاتی که یک آگهی میتواند درطول یک بازه زمانی مشخص به یک کاربر نشان داده شود. این سقف را میتوان بهعنوان محدودیت برای یک روز، یک هفته، یا یک ماه تعریف کرد. جایگزین cookie_frequency_cap میشود که در v24 منسوخ شد و در v25 برداشته شد. |
currency_code |
اختیاری | کد ارز سهنویسهای ISO 4217. |
customer_reach_group |
الزامی مشروط | نام مشتریای که برای او برنامهریزی میشود. این مقدار را کاربر تعریف کرده است. اگر targeting.audience_targeting تنظیم شده باشد، الزامی است. |
effective_frequency_limit |
اختیاری | بالاترین بسامد مؤثر حداقل (1–10) را برای Forecast.effective_frequency_breakdowns مشخص میکند، که با min_effective_frequency ناسازگار است. |
forecast_metric_options |
اختیاری | گزینههای سنجه اضافی (ForecastMetricOptions) مانند include_coview. |
min_effective_frequency |
اختیاری | حداقل تعداد دفعاتی که فردی درمعرض آگهی قرار گرفته است تا سنجههای دسترسی گزارش شود. |
targeting |
اختیاری | هدفیابیای که باید برای همه محصولات انتخابشده در ترکیب محصول اعمال شود، ازجمله مکان (plannable_location_ids، که جایگزین plannable_location_id در v25 شده است)، محدوده سنی، جنسیت، دستگاهها، شبکه، و (در v25 و نسخههای جدیدتر) وضعیتهای والدینی. |
قدم بعدی چیست
با نحوه تولید منحنی دسترسی آشنا شوید.