Ads News
Brand Awareness Objective and Optimization

Recently, we introduced a new Brand Awareness ad objective that you can use in your Facebook and Instagram ads.

Brand Awareness uses a combination of real-time proxy metrics, including both the reach and relative attention the users give to the campaign, to maximize ad recall lift. We introduced a new BRAND_AWARENESS objective and a new BRAND_AWARENESS optimization_goal, provided more control with REACH optimization_goal, and added a new reporting metric.

How estimated lift for people recalling an ad is calculated

Facebook Marketing APIs and interfaces fully support Brand Awareness objective and optimization. There is no app level restriction. However, not all ad accounts can use this feature yet. It is currently open to all managed ad accounts of Facebook and will be open to all in early 2016. You can find out whether your ad account can run Brand Awareness campaign with the API as described below. As this feature is still in Beta phase, breaking changes on API may happen before the final public release to all ad accounts.

To create a Brand Awareness campaign, follow these steps:

Step 0: Check whether your ad account can run Brand Awareness campaign

Update July 2016: This step is not needed any more as this feature is open to all ad accounts now.

Send a GET HTTP request to the following endpoint:

/act_<AD_ACCOUNT_ID>?fields=capabilities&access_token=<ACCESS_TOKEN>

{
  "capabilities": [
    ...
    "CAN_CREATE_BRAND_AWARENESS_OBJECTIVE_ADS"
    ...
  ],
  "id": "act_<AD_ACCOUNT_ID>"
}

Check whether CAN_CREATE_BRAND_AWARENESS_OBJECTIVE_ADS capability is included.

Step 1: Create an ad campaign with BRAND_AWARENESS as the objective.

use FacebookAds\Object\Campaign;
use FacebookAds\Object\Fields\CampaignFields;

$campaign = new Campaign(null, $account_id);
$campaign->setData(array(
    CampaignFields::NAME => 'my brand awareness campaign',
    CampaignFields::STATUS => Campaign::STATUS_PAUSED,
    CampaignFields::OBJECTIVE => 'BRAND_AWARENESS',
  ));

$campaign->create();
from facebookads.objects import Campaign

campaign = Campaign(parent_id='act_<AD_ACCOUNT_ID>')

campaign[Campaign.Field.name] = 'my brand awareness campaign'
campaign[Campaign.Field.status] = Campaign.Status.paused
campaign[Campaign.Field.objective] = 'BRAND_AWARENESS'

campaign.remote_create()
curl \
-F 'name=my brand awareness campaign' \
-F 'status=PAUSED' \
-F 'objective=BRAND_AWARENESS' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/<API_VERSION>/act_<AD_ACCOUNT_ID>/campaigns

Step 2: Select an Optimization

Do you want to have the most users who are more likely to pay attention to your ads, or do you want to reach as many unique users as possible?

Step 2A: Optimize for Brand Awareness

Create an ad set with BRAND_AWARENESS as the optimization_goal.

All ad creatives used in this ad set should use either image or video but you cannot have both in the same ad set. If all ad creatives are images, we optimize the ad delivery for attention (represented by dwell time) on the ad relative to the average attention each user spent on all the other posts on Facebook or Instagram.

We only support auto bid for this optimization.

use FacebookAds\Object\AdSet;
use FacebookAds\Object\Fields\AdSetFields;
use FacebookAds\Object\Values\BillingEvents;
use FacebookAds\Object\Values\OptimizationGoals;
use FacebookAds\Object\Fields\TargetingSpecsFields;
use FacebookAds\Object\TargetingSpecs;

$adset = new AdSet(null, 'act_<AD_ACCOUNT_ID>');
$adset->setData(array(
  AdSetFields::NAME => 'My Ad Set Optimized for Attention',
  AdSetFields::OPTIMIZATION_GOAL => 'BRAND_AWARENESS',
  AdSetFields::BILLING_EVENT => BillingEvents::IMPRESSIONS,
  AdSetFields::IS_AUTOBID => true,
  AdSetFields::DAILY_BUDGET => 20000,
  AdSetFields::CAMPAIGN_ID => <CAMPAIGN_ID>,
    AdSetFields::TARGETING => (new TargetingSpecs())->setData(array(
    TargetingSpecsFields::GEO_LOCATIONS => array(
      'countries' => array('US'),
    ),
  )),
));

$adset->create(array(
  AdSet::STATUS_PARAM_NAME => AdSet::STATUS_ACTIVE,
));
from facebookads.objects import AdSet

adset = AdSet(parent_id='act_<AD_ACCOUNT_ID>')
targeting_spec = {
    TargetingSpecsField.geo_locations: {
        'countries': ['US'],
    },
}

adset[AdSet.Field.name] = 'My Ad Set Optimized for Attention'
adset[AdSet.Field.optimization_goal] = 'BRAND_AWARENESS'
adset[AdSet.Field.billing_event] = AdSet.BillingEvent.impressions
adset[AdSet.Field.is_autobid] = true
adset[AdSet.Field.daily_budget] = 20000
adset[AdSet.Field.campaign_id] = <CAMPAIGN_ID>
adset[Adset.Field.targeting] = targeting_spec,

params = {'status': AdSet.Status.paused}
adset.remote_create(params=params)
curl \
  -F 'name=My Ad Set Optimized for Attention' \
  -F 'optimization_goal=BRAND_AWARENESS' \
  -F 'billing_event=IMPRESSIONS' \
  -F 'is_autobid=true' \
  -F 'daily_budget=20000' \
  -F 'campaign_id=<CAMPAIGN_ID>' \
  -F 'targeting={ 
    "geo_locations": {"countries":["US"]}, 
  }' \
  -F 'status=ACTIVE' \
  -F 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v2.5/act_<AD_ACCOUNT_ID>/adsets

Step 2B: Optimize for Reach

Create an ad set with REACH as the optimization_goal.

To better optimze for REACH, we have introduced a new feature, "frequency_control_specs" exclusively for the BRAND_AWARENESS objective.

In an ad set, you can specify frequency_control_specs, which allows you to control duration and frequency of an event. For example, the following spec means that every 3 days, Facebook or Instagram will serve no more than 1 impression per user.

{"event": "IMPRESSIONS", "interval_days":3, "max_frequency":1}

When optimizing towards REACH, if frequency_control_specs is not specified, the default is

{"event": "IMPRESSIONS", "interval_days":1, "max_frequency":1}

We only support manual bid (with bid_amount specified) for this optimization.

use FacebookAds\Object\AdSet;
use FacebookAds\Object\Fields\AdSetFields;
use FacebookAds\Object\Values\BillingEvents;
use FacebookAds\Object\Values\OptimizationGoals;
use FacebookAds\Object\Fields\TargetingSpecsFields;
use FacebookAds\Object\TargetingSpecs;

$adset = new AdSet(null, 'act_<AD_ACCOUNT_ID>');
$adset->setData(array(
  AdSetFields::NAME => 'My Ad Set Optimized for Reach Unique Users per Week',
  AdSetFields::OPTIMIZATION_GOAL => OptimizationGoals::REACH,
  AdSetFields::BILLING_EVENT => BillingEvents::IMPRESSIONS,
  AdSetFields::BID_AMOUNT => 1000,
  AdSetFields::DAILY_BUDGET => 20000,
  'frequency_control_specs' => array (
    'event' => 'IMPRESSIONS',
    'interval_days' => 7,
    'max_frequency' => 1,
  ),
  AdSetFields::CAMPAIGN_ID => <CAMPAIGN_ID>,
    AdSetFields::TARGETING => (new TargetingSpecs())->setData(array(
    TargetingSpecsFields::GEO_LOCATIONS => array(
      'countries' => array('US'),
    ),
  )),
));

$adset->create(array(
  AdSet::STATUS_PARAM_NAME => AdSet::STATUS_ACTIVE,
));
from facebookads.objects import AdSet

adset = AdSet(parent_id='act_<AD_ACCOUNT_ID>')
targeting_spec = {
    TargetingSpecsField.geo_locations: {
        'countries': ['US'],
    },
}
frequency_control = {
    'event': 'IMPRESSIONS',
    'interval_days': 7,
    'max_frequency': 1,
},

adset[AdSet.Field.name] = 'My Ad Set Optimized for Reach Unique Users per Week'
adset[AdSet.Field.optimization_goal] = AdSet.OptimizationGoal.reach
adset[AdSet.Field.billing_event] = AdSet.BillingEvent.impressions
adset[AdSet.Field.bid_amount] = 1000
adset[AdSet.Field.daily_budget] = 20000
adset[AdSet.Field.campaign_id] = <CAMPAIGN_ID>
adset[Adset.Field.targeting] = targeting_spec,
adset['frequency_control_specs'] = frequency_control,

params = {'status': AdSet.Status.paused}
adset.remote_create(params=params)
curl \
  -F 'name=My Ad Set Optimized for Reach Unique Users per Week' \
  -F 'optimization_goal=REACH' \
  -F 'billing_event=IMPRESSIONS' \
  -F 'bid_amount=1000' \
  -F 'daily_budget=20000' \
  -F 'campaign_id=<CAMPAIGN_ID>' \
  -F 'frequency_control_specs={
     "event": "IMPRESSIONS", "interval_days":7, "max_frequency":1
  }' \
  -F 'targeting={ 
    "geo_locations": {"countries":["US"]}, 
  }' \
  -F 'status=ACTIVE' \
  -F 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v2.5/act_<AD_ACCOUNT_ID>/adsets

Step 3: Create ad creatives, ads and so on

Step 4: Check Results

After the campaign starts, you can call the ad insights API to get a few new metrics related to the people who Facebook estimates will recall seeing this ad within two days. Below we have requested the number of estimated recallers, as well as the ratio of recallers over all reached users.

/<AD_ID>/insights

{
  "data": [
    {
      ...
      "estimated_ad_recallers": 235100,
      "estimated_ad_recall_rate": 7.7476436584828,
      ...
      "objective": "BRAND_AWARENESS",
      "optimization_goal": "BRAND_AWARENESS",
      "performance_indicator": "estimated_ad_recallers",
      ...
    }
  ]
}

In addition, you can use BRAND_AWARENESS or REACH as the optimization_goal when you create a Reach and Frequency ad campaign with Brand Awareness objective.