إنشاء منحنى مدى الوصول

بعد جمع إعدادات الاستهداف وتشكيلة المنتجات لخطتك الإعلامية، يمكنك إنشاء منحنى للميزانيات مقابل مدى الوصول المحتمل باستخدام طريقة GenerateReachForecast في ReachPlanService. يمكنك الاطّلاع على مسرد المصطلحات ودليل الخطة الإعلامية للحصول على تفاصيل عن حقول الطلب.

مقاييس التوقّعات

يتضمّن الردّ من GenerateReachForecast مقاييس مختلفة ضمن رسالة Forecast، ما يوفّر إحصاءات عن الأداء المحتمل لحملتك المخطّط لها. وتشمل هذه المقاييس ما يلي:

  • مدى الوصول (المستهدف والإجمالي، بما في ذلك المشاهدة الجماعية)
  • مرّات الظهور (المستهدَفة والإجمالية، بما في ذلك المشاهدة الجماعية ومرّات الظهور القابلة للعرض)
  • تقسيمات عدد مرات الظهور الفعالة (عدد المستخدمين الفرديين الذين تم الوصول إليهم عدد مرات يبلغ على الأقل رقمًا معينًا، على سبيل المثال، مرة واحدة أو أكثر، أو مرتين أو أكثر، أو 3 مرات أو أكثر)
  • إجراءات المستخدمين (مشاهدات إعلانات TrueView والإحالات الناجحة والنقرات)

توقُّع مدى الوصول إلى الجمهور في "حملات زيادة الطلب"

عند إنشاء منحنيات لمنتجات قابلة للتخطيط عددها DEMAND_GEN، يجب أيضًا تضمين معدّل الإحالات الناجحة المتوقّع لكل منتج.

للحصول على اقتراحات بشأن معدّل الإحالات الناجحة للمنتجات القابلة للتخطيط المتوافقة، استخدِم طريقة GenerateConversionRates. تعرض هذه الطريقة اقتراحات لمعدّل الإحالات الناجحة استنادًا إلى الأداء السابق لحسابك أو المعدّلات المقترَحة استنادًا إلى الأداء لجميع المعلِنين.

بالنسبة إلى منتجات DEMAND_GEN، قد يعرض GenerateConversionRates اقتراحات متعددة للمنتج نفسه. تتضمّن بعض الاقتراحات حقل surface_targeting الذي يشير إلى أنّ الاقتراح ينطبق فقط على هذه المجموعة المحدّدة من مساحات العرض (على سبيل المثال، YouTube Shorts). إذا لم يتم ملء الحقل surface_targeting، يكون الاقتراح هو متوسط "حملة زيادة الطلب" لهذا المنتج. عند إنشاء توقّعات لـ "حملات زيادة الطلب" التي تستخدم ميزة "استهداف مساحات العرض"، استخدِم اقتراح معدّل الإحالات الناجحة الأكثر تحديدًا المتاح.

بالإضافة إلى معدّلات الإحالات الناجحة، يمكن لمستخدمي "حملات زيادة الطلب" استخدام GenerateReachForecast لتوقّع clicks، وهو أمر مهم بشكل خاص للحملات التي يتم تحسينها لزيادة النقرات، مثل "حملات زيادة الطلب" التي تستخدم استراتيجية عروض أسعار "الحصول على الحد الأقصى من النقرات".

توقُّع مدى الوصول إلى الجمهور في YouTube Select

تتيح منصة YouTube Select في ReachPlanService استهداف القوائم لجميع المواقع الجغرافية المؤهلة في YouTube Select وفقًا لأسعار "الحجز الفوري". استخدِم حقل youtube_select_lineup_targeting في ReachPlanService.ListPlannableProducts لتحديد القوائم المتاحة (حلّ حقل youtube_select_lineup_targeting محلّ حقل youtube_select_lineups الذي تم إيقافه نهائيًا في v23 وإزالته في v24).

في ميزة "الحجز الفوري"، يمكن أن تحدث الأخطاء التالية عند طلب توقّعات لـ YTS:

حفظ المنحنيات

يمكنك فقط حفظ المنحنيات الفردية لتوفير الراحة للمستخدمين. يُحظر تمامًا تخزين المنحنيات مؤقتًا بشكل جماعي. إذا كنت بحاجة إلى إنشاء منحنيات بشكل مجمّع، يُرجى التواصل مع ممثل حساب Google أولاً.

معالجة الأخطاء

يجب أن تتبع الطلبات المُرسَلة إلى ReachPlanService بنية واجهة برمجة التطبيقات الأساسية، وقد تعرض أخطاء شائعة في حال تعذّر التحقّق منها.

بالإضافة إلى الأخطاء الشائعة، يمكن أن تعرض ReachPlanService أخطاءً خاصة بأداة تخطيط الوصول مدرَجة في ReachPlanError.

مثال على الرمز

يتضمّن المنحنى مرات الظهور ومدى وصول المستخدمين بأرقام مطلقة، بالإضافة إلى أحجام المجموعات الشاملة التي تتوافق مع الإحصاء السكاني وحجم جمهور YouTube للفئة الديمغرافية والبلد المطلوبَين.

جافا

private void getReachCurve(
    ReachPlanServiceClient reachPlanServiceClient, GenerateReachForecastRequest request) {
  GenerateReachForecastResponse response = reachPlanServiceClient.generateReachForecast(request);
  System.out.println("Reach curve output:");
  System.out.println(
      "Currency, Cost Micros, On-Target Reach, On-Target Imprs, Total Reach, Total Imprs,"
          + " Products");
  for (ReachForecast point : response.getReachCurve().getReachForecastsList()) {
    System.out.printf(
        "%s, \"",
        Joiner.on(", ")
            .join(
                request.getCurrencyCode(),
                String.valueOf(point.getCostMicros()),
                String.valueOf(point.getForecast().getOnTargetReach()),
                String.valueOf(point.getForecast().getOnTargetImpressions()),
                String.valueOf(point.getForecast().getTotalReach()),
                String.valueOf(point.getForecast().getTotalImpressions())));
    for (PlannedProductReachForecast product : point.getPlannedProductReachForecastsList()) {
      System.out.printf("[Product: %s, ", product.getPlannableProductCode());
      System.out.printf("Budget Micros: %s]", product.getCostMicros());
    }
    System.out.printf("\"%n");
  }
}
      

#C

public void GetReachCurve(ReachPlanServiceClient reachPlanService,
    GenerateReachForecastRequest request)
{
    GenerateReachForecastResponse response = reachPlanService.GenerateReachForecast(
        request);
    Console.WriteLine("Reach curve output:");
    Console.WriteLine(
        "Currency, Cost Micros, On-Target Reach, On-Target Impressions, Total Reach," +
        " Total Impressions, Products");
    foreach (ReachForecast point in response.ReachCurve.ReachForecasts)
    {
        Console.Write($"{request.CurrencyCode}, ");
        Console.Write($"{point.CostMicros}, ");
        Console.Write($"{point.Forecast.OnTargetReach}, ");
        Console.Write($"{point.Forecast.OnTargetImpressions}, ");
        Console.Write($"{point.Forecast.TotalReach}, ");
        Console.Write($"{point.Forecast.TotalImpressions}, ");
        Console.Write("\"[");
        foreach (PlannedProductReachForecast productReachForecast in
            point.PlannedProductReachForecasts)
        {
            Console.Write($"(Product: {productReachForecast.PlannableProductCode}, ");
            Console.Write($"Budget Micros: {productReachForecast.CostMicros}), ");
        }

        Console.WriteLine("]\"");
    }
}
      

PHP

private static function getReachCurve(
    GoogleAdsClient $googleAdsClient,
    int $customerId,
    array $productMix,
    string $locationId,
    string $currencyCode
) {
    // Valid durations are between 1 and 90 days.
    $duration = new CampaignDuration(['duration_in_days' => 28]);
    $targeting = new Targeting([
        'plannable_location_id' => $locationId,
        'age_range' => ReachPlanAgeRange::AGE_RANGE_18_65_UP,
        'genders' => [
            new GenderInfo(['type' => GenderType::FEMALE]),
            new GenderInfo(['type' => GenderType::MALE])
        ],
        'devices' => [
            new DeviceInfo(['type' => Device::DESKTOP]),
            new DeviceInfo(['type' => Device::MOBILE]),
            new DeviceInfo(['type' => Device::TABLET])
        ]
    ]);

    // See the docs for defaults and valid ranges:
    // https://developers.google.com/google-ads/api/reference/rpc/latest/GenerateReachForecastRequest
    $response = $googleAdsClient->getReachPlanServiceClient()->generateReachForecast(
        GenerateReachForecastRequest::build($customerId, $duration, $productMix)
            ->setCurrencyCode($currencyCode)
            ->setTargeting($targeting)
    );

    printf(
        "Reach curve output:%sCurrency, Cost Micros, On-Target Reach, On-Target Imprs," .
            " Total Reach, Total Imprs, Products%s",
        PHP_EOL,
        PHP_EOL
    );
    foreach ($response->getReachCurve()->getReachForecasts() as $point) {
        $products = '';
        /** @var ReachForecast $point */
        foreach ($point->getPlannedProductReachForecasts() as $plannedProductReachForecast) {
            /** @var PlannedProductReachForecast $plannedProductReachForecast */
            $products .= sprintf(
                '(Product: %s, Budget Micros: %s)',
                $plannedProductReachForecast->getPlannableProductCode(),
                $plannedProductReachForecast->getCostMicros()
            );
        }
        printf(
            "%s, %d, %d, %d, %d, %d, %s%s",
            $currencyCode,
            $point->getCostMicros(),
            $point->getForecast()->getOnTargetReach(),
            $point->getForecast()->getOnTargetImpressions(),
            $point->getForecast()->getTotalReach(),
            $point->getForecast()->getTotalImpressions(),
            $products,
            PHP_EOL
        );
    }
}
      

Python

def request_reach_curve(
    client: GoogleAdsClient,
    customer_id: str,
    product_mix: list[PlannedProduct],
    location_id: str,
    currency_code: str,
):
    """Creates a sample request for a given product mix.

    Args:
        client: an initialized GoogleAdsClient instance.
        customer_id: The customer ID for the reach forecast.
        product_mix: The product mix for the reach forecast.
        location_id: The location ID to plan for.
        currency_code: Three-character ISO 4217 currency code.
    """
    # See the docs for defaults and valid ranges:
    # https://developers.google.com/google-ads/api/reference/rpc/latest/GenerateReachForecastRequest
    request: GenerateReachForecastRequest = client.get_type(
        "GenerateReachForecastRequest"
    )
    request.customer_id = customer_id
    # Valid durations are between 1 and 90 days.
    request.campaign_duration.duration_in_days = 28
    request.currency_code = currency_code
    request.cookie_frequency_cap = 0
    request.min_effective_frequency = 1
    request.planned_products = product_mix

    request.targeting.plannable_location_id = location_id
    request.targeting.age_range = (
        client.enums.ReachPlanAgeRangeEnum.AGE_RANGE_18_65_UP
    )

    # Add gender targeting to the request.
    gender_type: GenderTypeEnum
    for gender_type in [
        client.enums.GenderTypeEnum.FEMALE,
        client.enums.GenderTypeEnum.MALE,
    ]:
        gender: GenderInfo = client.get_type("GenderInfo")
        gender.type_ = gender_type
        request.targeting.genders.append(gender)

    # Add device targeting to the request.
    device_type: DeviceEnum
    for device_type in [
        client.enums.DeviceEnum.DESKTOP,
        client.enums.DeviceEnum.MOBILE,
        client.enums.DeviceEnum.TABLET,
    ]:
        device: DeviceInfo = client.get_type("DeviceInfo")
        device.type_ = device_type
        request.targeting.devices.append(device)

    reach_plan_service: ReachPlanServiceClient = client.get_service(
        "ReachPlanService"
    )
    response: GenerateReachForecastResponse = (
        reach_plan_service.generate_reach_forecast(request=request)
    )

    print(
        "Currency, Cost, On-Target Reach, On-Target Imprs, Total Reach,"
        " Total Imprs, Products"
    )
    point: ReachForecast
    for point in response.reach_curve.reach_forecasts:
        product_splits = []
        p: PlannedProductReachForecast
        for p in point.planned_product_reach_forecasts:
            product_splits.append(
                {p.plannable_product_code: p.cost_micros / ONE_MILLION}
            )
        print(
            [
                currency_code,
                point.cost_micros / ONE_MILLION,
                point.forecast.on_target_reach,
                point.forecast.on_target_impressions,
                point.forecast.total_reach,
                point.forecast.total_impressions,
                product_splits,
            ]
        )
      

Ruby

def get_reach_curve(
  client,
  reach_plan_service,
  customer_id,
  product_mix,
  location_id,
  currency_code)
  duration = client.resource.campaign_duration do |d|
    # Valid durations are between 1 and 90 days.
    d.duration_in_days = 28
  end

  targeting = client.resource.targeting do |t|
    t.plannable_location_id = location_id
    t.age_range = :AGE_RANGE_18_65_UP
    t.genders << client.resource.gender_info do |gender|
      gender.type = :FEMALE
    end
    t.genders << client.resource.gender_info do |gender|
      gender.type = :MALE
    end
    t.devices << client.resource.device_info do |device|
      device.type = :DESKTOP
    end
    t.devices << client.resource.device_info do |device|
      device.type = :MOBILE
    end
    t.devices << client.resource.device_info do |device|
      device.type = :TABLET
    end
  end

  # See the docs for defaults and valid ranges:
  # https://developers.google.com/google-ads/api/reference/rpc/latest/GenerateReachForecastRequest
  response = reach_plan_service.generate_reach_forecast(
    customer_id: customer_id,
    campaign_duration: duration,
    planned_products: product_mix,
    currency_code: currency_code,
    targeting: targeting,
  )

  puts "Reach curve output:"
  puts "Currency, Cost Micros, On-Target Reach, On-Target Imprs, " \
    "Total Reach, Total Imprs, Products"

  response.reach_curve.reach_forecasts.each do |point|
    products = ""
    point.planned_product_reach_forecasts.each do |product|
      products += "(Product: #{product.plannable_product_code}, "\
        "Cost Micros: #{product.cost_micros})"
    end
    puts "#{currency_code}, #{point.cost_micros}, " \
      "#{point.forecast.on_target_reach}, " \
      "#{point.forecast.on_target_impressions}, " \
      "#{point.forecast.total_reach}, " \
      "#{point.forecast.total_impressions}, " \
      "#{products}"
  end
end
      

Perl

sub pull_reach_curve {
  my ($reach_plan_service, $reach_request) = @_;

  my $response = $reach_plan_service->generate_reach_forecast($reach_request);
  print "Reach curve output:\n";
  print "Currency,\tCost Micros,\tOn-Target Reach,\tOn-Target Imprs,\t" .
    "Total Reach,\tTotal Imprs,\tProducts\n";
  foreach my $point (@{$response->{reachCurve}{reachForecasts}}) {
    printf "%s,\t%d,\t%d,\t%d,\t%d,\t%d,\t'[", $reach_request->{currencyCode},
      $point->{costMicros}, $point->{forecast}{onTargetReach},
      $point->{forecast}{onTargetImpressions}, $point->{forecast}{totalReach},
      $point->{forecast}{totalImpressions};
    foreach my $productReachForecast (@{$point->{plannedProductReachForecasts}})
    {
      printf "(Product: %s, Budget Micros: %d), ",
        $productReachForecast->{plannableProductCode},
        $productReachForecast->{costMicros};
    }
    print "]'\n";
  }
}
      

curl

Google Issue Tracker

يمكنك استخدام Issue Tracker من Google لطرح أسئلة حول الدعم أو الإبلاغ عن الأخطاء أو إرسال طلبات الميزات. تتتبّع Google طلباتك وتحدّد أولوياتها وتنشر آخر المعلومات عنها مباشرةً في Issue Tracker. لمزيد من المعلومات، يُرجى الاطّلاع على إنشاء مشكلة في Google Issue Tracker.

أنشئ مشكلة باستخدام أحد نماذج Issue Tracker التالية:

املأ جميع الحقول في النموذج بمعلومات تفصيلية حتى تتمكّن Google من إعادة إنشاء طلبك وتحديد أولويته. قد تغلق Google البلاغات غير المكتملة وتطلب منك إرسال بلاغ جديد يتضمّن التفاصيل الناقصة.