게재 빈도 및 일정

장기간 광고 예산이 지출되는 방식을 결정합니다. 게재 빈도는 Facebook의 광고 경매에서 매일 모든 광고주에게 고른 경쟁 기회를 제공하며 여러 광고에 자동으로 예산을 할당합니다. 게재 빈도는 API를 사용하여 만든 광고에 대해 Facebook 도구와 같은 방식으로 작동합니다. 광고주 지원 센터, 게재 및 게재 빈도를 참조하세요.

게재 빈도는 같은 타겟 대상에 대해 경쟁하는 다른 광고로부터 정보를 얻어 최적의 입찰가를 제공하려고 시도합니다. 이 공식은 다음 사항을 설명합니다.

Final bid (per impression) = optimal bid (per impression) * CTR
where optimal bid <= max_bid

CTR은 클릭률이지만 이 공식은 노출의 경우 조회율(VTR), 전환의 경우 전환율(CVR)에 적용됩니다. Facebook은 이 공식의 정확도를 지속적으로 개선하고 있으며 최종 입찰가는 광고 유형, 타겟 대상, 시간, 표시 컨텍스트와 같은 요인의 영향을 받습니다. 최적 입찰가를 결정하는 것이 게재 빈도 알고리즘의 핵심 부분입니다.

광고 세트를 만들거나 업데이트할 때 pacing_type에서 세 가지 게재 빈도 옵션을 설정할 수 있습니다. 일반 게재 빈도를 사용하는 경우 Facebook은 광고를 모든 관련 경매에 제출하고 하루 동안 목표와 예산에 적합한 최적의 게재를 위해 입찰가를 조정합니다. 이 값이 기본 게재 빈도입니다. 기본 게재 빈도를 비활성화하려면:

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

$adset = new AdSet(<AD_SET_ID>);
$adset->{AdSetFields::PACING_TYPE} = array('no_pacing');
$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: ['no_pacing'],
})
adset.remote_update()
new AdSet(<AD_SET_ID>, context).update()
  .setPacingType("[\"no_pacing\"]")
  .execute();
curl \
  -F 'pacing_type=["no_pacing"]' \
  -F 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v2.11/<AD_SET_ID>
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>

빠른 게재라고 하며 입찰가에서 모든 게재 빈도 조정값을 삭제합니다. Facebook은 광고를 해당하는 모든 경매에 최대 입찰가로 제출합니다. 지정된 비용 및 예산으로 최대 게재를 달성할 수 있습니다. 그 결과 하루 내내 광고가 유연하지 않게 게재되고 하루가 지나기 전에 광고 세트의 예산이 모두 소진될 수도 있습니다. 빠른 게재를 사용하여 광고 세트를 만들려면:

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

다음 시나리오의 경우 게재 빈도를 비활성화할 수 있습니다.

  • 반짝 세일 또는 한시적 프로모션 광고
  • 스포츠 이벤트, 선거 토론 등 라이브 이벤트에 광고 게재
  • 연말연시나 개학 시즌 등 연중 주요 기간에 게재 극대화

다음의 경우 이 옵션을 사용해서는 안 됩니다.

  • 입찰가가 너무 낮거나 타게팅 범위가 너무 좁아 광고 게재가 예상보다 저조한 경우. 이 경우 이미 예산 게재 빈도를 효과적으로 삭제했으므로 빠른 게재가 도움이 되지 않습니다.
  • 자동 입찰을 사용하며 is_autobidtrue인 경우.

광고 세트 게재 빈도 옵션, 참조를 확인하세요.

광고 예약

adset_schedule에 광고 세트가 게재되는 요일과 시간을 지정하세요. 일정은 광고 세트 아래 모든 광고 그룹에 적용됩니다. 광고 예약, 블로그를 참조하세요. adset_schedule은 JSON 개체의 배열입니다. 각 개체는 하루 일정을 나타냅니다. 예시:

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

광고 예약을 업데이트하려면:

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>

광고 예약 해제하려면:

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>

광고 예약 정보를 가져오려면:

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

$adset = new AdSet(<AD_SET_ID>);
$adset->read(array(
  AdSetFields::ADSET_SCHEDULE,
));
from facebookads.adobjects.adset import AdSet

adset = AdSet(fbid=<AD_SET_ID>)
adset.remote_read(fields=[AdSet.Field.adset_schedule])
AdSet adSet2 = new AdSet(<AD_SET_ID>, context).get()
  .requestAdsetScheduleField()
  .execute();
curl -G \
  -d 'fields=adset_schedule' \
  -d 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v2.11/<AD_SET_ID>

각 배열에는 다음 필드가 있어야 합니다.

필드 이름 설명 유형

start_minute

시간(분, 0부터 시작). 일정이 시작하는 시간

int

end_minute

시간(분, 0부터 시작). 일정이 끝나는 시간

int

days

활성으로 예약된 요일. 유효한 값: 0~6. 0은 일요일, 1은 월요일, 6은 토요일입니다.

int 배열

start_minuteend_minute는 정시여야 하며 한 시간 이상 서로 떨어져야 합니다. 도달 및 빈도의 경우 일간 시간 할당은 4시간 이상이어야 합니다. 예시:

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

다음과 같은 제한이 따릅니다.

  • 광고 예약은 총 예산과만 사용합니다.
  • 광고 예약은 광고 계정의 시간대가 아니라 세트 내 광고의 타겟 대상의 시간대에 적용됩니다. 광고 계정의 시간대가 동부 시간이지만 광고가 캘리포니아주(태평양 표준시 사용)의 사람들을 타게팅하는 경우 오후 6시~오후 9시로 광고를 예약하면 동부 시간이 아니라 태평양 표준시로 오후 6시~오후 9시에 캘리포니아주 사람들에게 광고가 게재됩니다.

FAQ

Q: 광고가 올바른 빈도로 게재되지 않습니다. 어떻게 해야 하나요?

A: 광고 게재가 예상보다 저조하다면 입찰가가 너무 낮거나 타겟 범위가 너무 좁은 것일 수 있습니다. 입찰가가 추천 입찰가 범위에 있어야 광고가 경매에 낙찰되고 노출 위치를 확보할 수 있습니다. 경쟁이 심한 타겟 대상의 경우 추천 입찰가 범위 이상으로 입찰해야 할 수도 있습니다. 또는 타게팅 범위가 너무 좁습니다.

광고 게재가 예상보다 많으면 타겟 규모가 너무 커서 예산이 빠르게 소모될 수 있습니다. 그런 경우가 아니라고 생각되면 Facebook 광고주 지원 센터에 문의하세요.

Q: 게재 빈도는 광고 세트 수준에서 설정되나요, 아니면 광고 캠페인 수준에서 설정되나요?

A: 개별 광고 세트마다 예산과 일정이 있으므로 게재 빈도는 광고 캠페인이 아니라 광고 세트 준에서 설정됩니다.

Q: 예산을 변경하면 게재 빈도에 영향을 미치나요?

A: 예산을 변경하면 Facebook 시스템에서 새 최적 입찰가를 알아야 하며 이 과정에 시간이 걸립니다. 그동안은 입찰가가 최적 입찰가가 아니며 ROI를 극대화할 수 없습니다. 그러므로 입찰가와 예산을 자주 변경하면 안 됩니다.

Q: 언제 입찰가 또는 예산을 변경해야 하나요?

A: 이들 매개변수를 변경해야 하는 경우에는 하루 중 이른 시간에 2~3번만 변경하세요. 이렇게 하면 하루 중 자주 또는 늦은 시간에 변경하는 것보다 게재 빈도에 적게 영향을 미칩니다.

Q: 하루 이하의 시간만 진행되는 캠페인의 경우에는 어떤가요?

A: Facebook은 하루 이내에 게재 빈도를 최적화하므로 문제가 되지 않습니다.

Q: billing_eventIMPRESSIONS인 광고가 있는데 billing_eventLINK_CLICKS로 전환했습니다. 게재 빈도에 영향이 있나요?

A: 게재 빈도가 달라질 수 있습니다. 조회 기반 청구에서 클릭 기반 청구로 전환하기 때문에 게재 빈도가 다시 조정됩니다.

Q: 여러 입찰 유형의 max_bid가 보이지 않습니다. 어디에 있나요?

A: 최대 입찰가는 최적화 목표와 관계없이 지정된 광고 세트의 bid_amount입니다.

Q: 일간 시간 할당과 게재 빈도는 어떤 방식으로 함께 사용되나요?

A: 광고 예약을 사용하여 광고가 타겟 대상에게 표시되는 시간과 요일을 예약합니다. 타겟과 가장 관련된 경우 광고를 표시할 수 있습니다. 게재 빈도에서는 이 일정을 고려하여 효과적인 최적의 입찰가를 계산합니다. 광고 예약을 참조하세요.

Q: Facebook은 하루 중 일부 동안만 게재되는 경우 광고 세트 예산을 어떤 방식으로 지출하나요?

A: 2014년 4월 9일부터 Facebook에서 광고 세트 일정의 시작일 및 종료일 시간에 따라 예산이 지출되는 방식이 변경되었습니다. 일일 예산이 설정된 광고 세트의 경우 광고 첫날과 마지막 날 광고가 게재되는 시간에 따라 지출액이 조정됩니다. 예를 들어, 광고 세트가 오후 6시에 시작되면 오후 6시와 자정 사이에 일일 예산의 25%만을 게재하려고 시도합니다.