Tốc độ phân phối và lên lịch

Xác định cách chi tiêu ngân sách quảng cáo của bạn theo thời gian. Tùy chọn này đem đến khả năng cạnh tranh đồng nhất trong hoạt động đấu giá quảng cáo trên Facebook giữa tất cả các nhà quảng cáo mỗi ngày và tự động phân bổ ngân sách cho các quảng cáo khác nhau. Tùy chọn tốc độ phân phối hoạt động như nhau đối với những quảng cáo được tạo bằng API này và các công cụ trên Facebook. Hãy xem bài viết Trung tâm trợ giúp quảng cáo, Phân phối và tốc độ phân phối.

Bạn có thể đặt 3 tùy chọn tốc độ phân phối trong pacing_type khi tạo hoặc cập nhật một nhóm quảng cáo. Với tốc độ phân phối tiêu chuẩn, chúng tôi sẽ nhập quảng cáo của bạn vào mọi phiên đấu giá phù hợp, đồng thời điều chỉnh giá thầu trong cả ngày để phân phối một cách tối ưu và thuận lợi tương ứng với mục tiêu và ngân sách của bạn. Đây là tốc độ phân phối mặc định.

Cách đặt lại về tùy chọn tốc độ phân phối mặc định:

use FacebookAds\Object\AdSet;
use FacebookAds\Object\Fields\AdSetFields;

$adset = new AdSet(<AD_SET_ID>);
$adset->{AdSetFields::PACING_TYPE} = array('standard');
$adset->update();
from facebookads.adobjects.adset import AdSet

adset = AdSet(fbid=<AD_SET_ID>, parent_id='act_<AD_ACCOUNT_ID>')
adset.update({
    AdSet.Field.pacing_type: ['standard'],
})
adset.remote_update()
new AdSet(<AD_SET_ID>, context).update()
  .setPacingType("[\"standard\"]")
  .execute();
curl \
  -F 'pacing_type=["standard"]' \
  -F 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v2.11/<AD_SET_ID>

Phương thức phân phối tăng tốc sẽ gỡ tất cả các điều chỉnh về tốc độ phân phối khỏi giá thầu của bạn. Chúng tôi sẽ nhập quảng cáo của bạn vào mọi phiên đấu giá đủ điều kiện với mức giá thầu tối đa. Bạn có thể đạt được mức phân phối tối đa với chi phí và ngân sách đã chỉ định. Điều này dẫn đến hoạt động phân phối diễn ra không suôn sẻ trong cả ngày; ngân sách của nhóm quảng cáo có thể bị cạn kiệt trước cuối ngày. Cách tạo một nhóm quảng cáo có tùy chọn phân phối tăng tốc:

use FacebookAds\Object\AdSet;
use FacebookAds\Object\Fields\AdSetFields;
use FacebookAds\Object\Fields\TargetingFields;
use FacebookAds\Object\Values\AdSetBillingEventValues;
use FacebookAds\Object\Targeting;
use FacebookAds\Object\Values\AdSetOptimizationGoalValues;

$adset = new AdSet(null, 'act_<AD_ACCOUNT_ID>');
$adset->setData(array(
  AdSetFields::NAME => 'Ad Set without pacing',
  AdSetFields::OPTIMIZATION_GOAL => AdSetOptimizationGoalValues::REACH,
  AdSetFields::BILLING_EVENT => AdSetBillingEventValues::IMPRESSIONS,
  AdSetFields::PACING_TYPE => array('no_pacing'),
  AdSetFields::BID_AMOUNT => 2,
  AdSetFields::DAILY_BUDGET => 1000,
  AdSetFields::CAMPAIGN_ID => <CAMPAIGN_ID>,
  AdSetFields::TARGETING => (new Targeting())->setData(array(
    TargetingFields::GEO_LOCATIONS => array(
      'countries' => array('US'),
    ),
  )),
));
$adset->create();
from facebookads.adobjects.adset import AdSet
from facebookads.adobjects.targeting import Targeting

adset = AdSet(parent_id='act_<AD_ACCOUNT_ID>')
adset.update({
    AdSet.Field.name: 'Ad Set without pacing',
    AdSet.Field.optimization_goal: AdSet.OptimizationGoal.reach,
    AdSet.Field.billing_event: AdSet.BillingEvent.impressions,
    AdSet.Field.pacing_type: ['no_pacing'],
    AdSet.Field.bid_amount: 2,
    AdSet.Field.daily_budget: 1000,
    AdSet.Field.campaign_id: <CAMPAIGN_ID>,
    AdSet.Field.targeting: {
        Targeting.Field.geo_locations: {
            'countries': ['US'],
        },
    },
})

adset.remote_create()
AdSet adSet = new AdAccount(act_<AD_ACCOUNT_ID>, context).createAdSet()
  .setName("Ad Set without pacing")
  .setOptimizationGoal(AdSet.EnumOptimizationGoal.VALUE_REACH)
  .setBillingEvent(AdSet.EnumBillingEvent.VALUE_IMPRESSIONS)
  .setPacingType("[\"no_pacing\"]")
  .setBidAmount(2L)
  .setDailyBudget(1000L)
  .setCampaignId(<CAMPAIGN_ID>)
  .setTargeting(
    new Targeting()
      .setFieldGeoLocations(
        new TargetingGeoLocation()
          .setFieldCountries(Arrays.asList("US"))
      )
  )
  .execute();
String ad_set_id = adSet.getId();
curl \
  -F 'name=Ad Set without pacing' \
  -F 'optimization_goal=REACH' \
  -F 'billing_event=IMPRESSIONS' \
  -F 'pacing_type=["no_pacing"]' \
  -F 'bid_amount=2' \
  -F 'daily_budget=1000' \
  -F 'campaign_id=<CAMPAIGN_ID>' \
  -F 'targeting={"geo_locations":{"countries":["US"]}}' \
  -F 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v2.11/act_<AD_ACCOUNT_ID>/adsets

Bạn có thể tắt tùy chọn tốc độ phân phối trong những trường hợp sau:

  • Quảng cáo chương trình giảm giá chớp nhoáng hoặc khuyến mại trong thời gian giới hạn
  • Phân phối quảng cáo với sự kiện trực tiếp như sự kiện thể thao, tranh luận bầu cử.
  • Tối đa hóa phân phối trong các thời điểm chính của năm như ngày lễ hoặc mùa tựu trường.

Bạn không nên sử dụng tùy chọn này khi:

  • Chúng tôi phân phối dưới mức quảng cáo vì giá thầu của bạn quá thấp hoặc tùy chọn nhắm mục tiêu quá hẹp. Trong các trường hợp này, chúng tôi đã gỡ tùy chọn tốc độ phân phối ngân sách một cách hiệu quả để phương thức phân phối tăng tốc không còn hoạt động nữa.

Hãy xem phần Nhóm quảng cáo, Tùy chọn tốc độ phân phối, Tài liệu tham khảo

Bạn cũng có thể đặt pacing_type là day_parting để kiểm soát hoạt động lên lịch quảng cáo tốt hơn. (Hãy xem "Ad Scheduling")

Lên lịch quảng cáo

Chỉ định số ngày trong một tuần và số giờ trong một ngày mà nhóm quảng cáo của bạn sẽ chạy trong adset_schedule. Lịch chạy của bạn sẽ áp dụng cho tất cả các tập hợp quảng cáo trong nhóm quảng cáo đó. Xem phần Lên lịch quảng cáo, Blog. adset_schedule là một mảng đối tượng JSON. Mỗi đối tượng biểu thị một lịch chạy cho từng ngày. Ví dụ:

use FacebookAds\Object\AdSet;
use FacebookAds\Object\Fields\AdSetFields;
use FacebookAds\Object\Fields\TargetingFields;
use FacebookAds\Object\Values\AdSetBillingEventValues;
use FacebookAds\Object\Targeting;
use FacebookAds\Object\Values\AdSetOptimizationGoalValues;

$adset = new AdSet(null, 'act_<AD_ACCOUNT_ID>');
$adset->setData(array(
  AdSetFields::NAME => 'Ad Set with scheduling',
  AdSetFields::OPTIMIZATION_GOAL => AdSetOptimizationGoalValues::REACH,
  AdSetFields::BILLING_EVENT => AdSetBillingEventValues::IMPRESSIONS,
  AdSetFields::PACING_TYPE => array('day_parting'),
  AdSetFields::LIFETIME_BUDGET => 100000,
  AdSetFields::END_TIME
    => (new \DateTime("+1 week"))->format(\DateTime::ISO8601),
  AdSetFields::ADSET_SCHEDULE => array(
    array(
      'start_minute' => 540,
      'end_minute' => 720,
      'days' => array(1, 2, 3, 4, 5),
    ),
  ),
  AdSetFields::BID_AMOUNT => 2,
  AdSetFields::CAMPAIGN_ID => <CAMPAIGN_ID>,
  AdSetFields::TARGETING => (new Targeting())->setData(array(
    TargetingFields::GEO_LOCATIONS => array(
      'countries' => array('US'),
    ),
  )),
));
$adset->create();
import time
from facebookads.adobjects.adset import AdSet
from facebookads.adobjects.targeting import Targeting

adset = AdSet(parent_id='act_<AD_ACCOUNT_ID>')
adset.update({
    AdSet.Field.name: 'Ad Set without pacing',
    AdSet.Field.optimization_goal: AdSet.OptimizationGoal.reach,
    AdSet.Field.billing_event: AdSet.BillingEvent.impressions,
    AdSet.Field.pacing_type: ['day_parting'],
    AdSet.Field.lifetime_budget: 100000,
    AdSet.Field.end_time: int(time.time() + 7 * 24 * 3600),
    AdSet.Field.adset_schedule: [
        {
            'start_minute': 540,
            'end_minute': 720,
            'days': [1, 2, 3, 4, 5],
        },
    ],
    AdSet.Field.bid_amount: 2,
    AdSet.Field.campaign_id: <CAMPAIGN_ID>,
    AdSet.Field.targeting: {
        Targeting.Field.geo_locations: {
            'countries': ['US'],
        },
    },
})

adset.remote_create()
AdSet adSet = new AdAccount(act_<AD_ACCOUNT_ID>, context).createAdSet()
  .setName("Ad Set with scheduling")
  .setOptimizationGoal(AdSet.EnumOptimizationGoal.VALUE_REACH)
  .setBillingEvent(AdSet.EnumBillingEvent.VALUE_IMPRESSIONS)
  .setPacingType("[\"day_parting\"]")
  .setLifetimeBudget(100000L)
  .setEndTime(end_time)
  .setAdsetSchedule("[{\"start_minute\":\"540\",\"end_minute\":\"720\",\"days\":[\"1\",\"2\",\"3\",\"4\",\"5\"]}]")
  .setBidAmount(2L)
  .setCampaignId(<CAMPAIGN_ID>)
  .setTargeting(
    new Targeting()
      .setFieldGeoLocations(
        new TargetingGeoLocation()
          .setFieldCountries(Arrays.asList("US"))
      )
  )
  .execute();
String ad_set_id = adSet.getId();
curl \
  -F 'name=Ad Set with scheduling' \
  -F 'optimization_goal=REACH' \
  -F 'billing_event=IMPRESSIONS' \
  -F 'pacing_type=["day_parting"]' \
  -F 'lifetime_budget=100000' \
  -F 'end_time=2018-02-06T04:45:17+0000' \
  -F 'adset_schedule=[ 
    { 
      "start_minute": 540, 
      "end_minute": 720, 
      "days": [ 
        1, 
        2, 
        3, 
        4, 
        5 
      ] 
    } 
  ]' \
  -F 'bid_amount=2' \
  -F 'campaign_id=<CAMPAIGN_ID>' \
  -F 'targeting={"geo_locations":{"countries":["US"]}}' \
  -F 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v2.11/act_<AD_ACCOUNT_ID>/adsets

Cách cập nhật tùy chọn lên lịch quảng cáo:

use FacebookAds\Object\AdSet;
use FacebookAds\Object\Fields\AdSetFields;

$adset = new AdSet(<AD_SET_ID>);

$adset->setData(array(
  AdSetFields::DAILY_BUDGET => null,
  AdSetFields::LIFETIME_BUDGET => 100000,
  AdSetFields::END_TIME
    => (new \DateTime("+1 week"))->format(\DateTime::ISO8601),
  AdSetFields::PACING_TYPE => array('day_parting'),
  AdSetFields::ADSET_SCHEDULE => array(
    array(
      'start_minute' => 720,
      'end_minute' => 840,
      'days' => array(1, 2, 3, 4, 5),
    ),
  ),
));
$adset->update();
import time
from facebookads.adobjects.adset import AdSet

adset = AdSet(fbid=<AD_SET_ID>, parent_id='act_<AD_ACCOUNT_ID>')
adset.update({
    AdSet.Field.daily_budget: None,
    AdSet.Field.lifetime_budget: 100000,
    AdSet.Field.end_time: int(time.time() + 7 * 24 * 3600),
    AdSet.Field.pacing_type: ['day_parting'],
    AdSet.Field.adset_schedule: [
        {
            'start_minute': 540,
            'end_minute': 720,
            'days': [1, 2, 3, 4, 5],
        },
    ],
})
adset.remote_update()
curl \
  -F 'lifetime_budget=100000' \
  -F 'end_time=2016-07-21T20:42:08+0000' \
  -F 'pacing_type=["day_parting"]' \
  -F 'adset_schedule=[ 
    { 
      "start_minute": 720, 
      "end_minute": 840, 
      "days": [ 
        1, 
        2, 
        3, 
        4, 
        5 
      ] 
    } 
  ]' \
  -F 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v2.7/<AD_SET_ID>

Cách tắt tùy chọn lên lịch quảng cáo:

use FacebookAds\Object\AdSet;
use FacebookAds\Object\Fields\AdSetFields;

$adset = new AdSet(<AD_SET_ID>);

$adset->setData(array(
  AdSetFields::PACING_TYPE => array('standard'),
  AdSetFields::ADSET_SCHEDULE => array(),
));
$adset->update();
from facebookads.adobjects.adset import AdSet

adset = AdSet(fbid=<AD_SET_ID>, parent_id='act_<AD_ACCOUNT_ID>')
adset.update({
    AdSet.Field.pacing_type: ['standard'],
    AdSet.Field.adset_schedule: [],
})
adset.remote_update()
new AdSet(<AD_SET_ID>, context).update()
  .setPacingType("[\"standard\"]")
  .setAdsetSchedule("[]")
  .execute();
curl \
  -F 'pacing_type=["standard"]' \
  -F 'adset_schedule=[]' \
  -F 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v2.11/<AD_SET_ID>

Cách nhận thông tin về tùy chọn lên lịch quảng cáo:

curl -X GET \ -d 'fields="adset_schedule"' \ -d 'access_token=<ACCESS_TOKEN>' \ https://graph.facebook.com/v19.0/<AD_SET_ID>/
'use strict'; const bizSdk = require('facebook-nodejs-business-sdk'); const AdSet = bizSdk.AdSet; const access_token = '<ACCESS_TOKEN>'; const app_secret = '<APP_SECRET>'; const app_id = '<APP_ID>'; const id = '<AD_SET_ID>'; const api = bizSdk.FacebookAdsApi.init(access_token); const showDebugingInfo = true; // Setting this to true shows more debugging info. if (showDebugingInfo) { api.setDebug(true); } const logApiCallResult = (apiCallName, data) => { console.log(apiCallName); if (showDebugingInfo) { console.log('Data:' + JSON.stringify(data)); } }; let fields, params; fields = [ 'adset_schedule', ]; params = { }; const sample_code = (new AdSet(id)).get( fields, params ); logApiCallResult('sample_code api call complete.', sample_code);
require __DIR__ . '/vendor/autoload.php'; use FacebookAds\Object\AdSet; use FacebookAds\Api; use FacebookAds\Logger\CurlLogger; $access_token = '<ACCESS_TOKEN>'; $app_secret = '<APP_SECRET>'; $app_id = '<APP_ID>'; $id = '<AD_SET_ID>'; $api = Api::init($app_id, $app_secret, $access_token); $api->setLogger(new CurlLogger()); $fields = array( 'adset_schedule', ); $params = array( ); echo json_encode((new AdSet($id))->getSelf( $fields, $params )->exportAllData(), JSON_PRETTY_PRINT);
from facebook_business.adobjects.adset import AdSet from facebook_business.api import FacebookAdsApi access_token = '<ACCESS_TOKEN>' app_secret = '<APP_SECRET>' app_id = '<APP_ID>' id = '<AD_SET_ID>' FacebookAdsApi.init(access_token=access_token) fields = [ 'adset_schedule', ] params = { } print AdSet(id).get( fields=fields, params=params, )
import com.facebook.ads.sdk.*; import java.io.File; import java.util.Arrays; public class SAMPLE_CODE_EXAMPLE { public static void main (String args[]) throws APIException { String access_token = \"<ACCESS_TOKEN>\"; String app_secret = \"<APP_SECRET>\"; String app_id = \"<APP_ID>\"; String id = \"<AD_SET_ID>\"; APIContext context = new APIContext(access_token).enableDebug(true); new AdSet(id, context).get() .requestAdsetScheduleField() .execute(); } }
require 'facebook_ads' access_token = '<ACCESS_TOKEN>' app_secret = '<APP_SECRET>' app_id = '<APP_ID>' id = '<AD_SET_ID>' FacebookAds.configure do |config| config.access_token = access_token config.app_secret = app_secret end ad_set = FacebookAds::AdSet.get(id ,'adset_schedule')

Mỗi mảng đều phải có:

Tên trường Mô tả

start_minute

loại: số nguyên

Phút trong ngày bắt đầu từ 0. Khi lịch chạy bắt đầu

end_minute

loại: số nguyên

Phút trong ngày bắt đầu từ 0. Khi lịch chạy kết thúc

days

loại: Mảng số nguyên

Các ngày có lịch chạy hoạt động. Giá trị hợp lệ: 0-6, trong đó 0 là Chủ nhật, 1 là thứ Hai và 6 là thứ Bảy.

timezone_type

Không bắt buộc

Nếu giá trị là "user" (người dùng), trường này sẽ là múi giờ của người xem. Nếu giá trị là "advertizer" (nhà quảng cáo), trường này sẽ là múi giờ của tài khoản.

start_minuteend_minute phải theo giờ và cách nhau tối thiểu 1 giờ. Đối với loại quảng cáo Tiếp cận và tần suất, các phần trong ngày tối thiểu phải là 4 giờ. Ví dụ:

[{'start_minute':540,'end_minute':720,'days':[1,2,3,4,5]},{'start_minute':180, 'end_minute':360,'days':[0,6]}]

Các giới hạn sau đây được áp dụng:

  • Chỉ sử dụng tính năng lên lịch quảng cáo với ngân sách trọn đời.
  • Tùy chọn lên lịch quảng cáo áp dụng cho múi giờ của đối tượng mục tiêu đối với các quảng cáo trong một nhóm, không áp dụng cho múi giờ của tài khoản quảng cáo. Nếu múi giờ trong tài khoản quảng cáo của bạn là ET nhưng quảng cáo lại nhắm mục tiêu những người ở California theo giờ PST thì khi bạn lên lịch quảng cáo từ 18:00 đến 21:00, chúng tôi sẽ phân phối quảng cáo cho những người ở California trong khoảng thời gian từ 18:00 đến 21:00 theo giờ PST chứ không phải 18:00 đến 21:00 theo giờ ET.

Câu hỏi thường gặp

For under-delivery, your bid price might be too low or your audience too narrow. Your bid should be in the suggested bid range so your ads win auctions and get placement. With competitive target audiences, you may need to bid above the suggested bid range. Or your targeting is too narrow.

If we over-deliver your ad, you might have a very large audience that quickly exhausts budget. If you believe that is not the case, contact us at Facebook Advertising Help.

If you're using campaign budget optimization, budget pacing is at the campaign level. Otherwise, budget pacing is done at the ad set level.

When you change budget, our systems have to learn the new optimal bid which takes time. During this time, your bids are not optimal and we can't maximize ROI. Therefore you should not change bid and budget frequently.

If you have to change these parameters, limit yourself to 2-3 times a day and only the early part of the day. This impacts pacing less than changing it often or later in a day.

Facebook optimizes pacing within a day, so this is not a problem.

Pacing may change. Since you switch from view-based billing to click-based billing, we re-adjust pacing.

Max bid is bid_amount of an ad set you specify regardless of its optimization goal.

With ad scheduling, you schedule hours in a day and days in a week when your ads display to a target audience. You can have your ads display when they are most relevant to an audience. Pacing takes this schedule into account to calculate your effective, optimal bid. See ad scheduling.

From April 9th, 2014, we change the way budgets are spent on partial days at the beginning and end of ad set schedules. For ad sets with daily budgets, we adjust the first and last day spend based on the number of hours we have to deliver ads on those days. For example, if your ad set starts at 6PM, we try to deliver only 25% of daily budget between 6 PM and midnight.