Bidding Overview

A bid expresses how much you value your ad reaching a target audience and delivering results on your optimization_goal. bid_amount is the amount you want to spend to reach a given optimization_goal.

At Facebook's ad auction, Facebook evaluates your bid_amount and the probability of reaching your optimization_goal. We apply an effective bid so you only win auctions and have your ads delivered when you are likely to reach your optimization_goal.

Bidding and Optimization core concepts include:

iOS 14.5 Updates

In response to Apple’s new policy, we are announcing breaking changes that will affect SDKAdNetwork, Marketing API and Ads Insights API endpoints.

Optimization goals that will be impacted by the new attribution fields are as follows:

  • Campaign objectives that are either WEBSITE_CONVERSIONS or PRODUCT_CATALOG_SALES must have the following optimization goal:

    • offsite conversion
    • return on ad spend
    • incremental offsite conversions
  • For apps, only the APP_INSTALLS objective can have is_skadnetwork_attribution set to true.

    • Exception: Mobile App Install CPA Billing will no longer be supported; billing_event cannot be APP_INSTALLS if optimization_goal is APP_INSTALLS.
  • The API call would fail if conversion_domain doesn't match the domains mapped to the pixel+event or custom conversion selected on the ad set level.

Enforcement will only occur after Apple requires their AppTrackingTransparency prompt.

To learn more about how Apple’s iOS 14.5 requirements will impact Facebook advertising, visit our Business Help Center aricles and our changelog:

Bid Setup

When you choose your bid:

  • Bid your true value: Think about your advertising objective and bid the maximum amount you're willing to pay for that objective.
  • Decide whether you want to maximize for profit or for growth

You can also set objective and billing_event but neither directly impact bid_amount or your effective bid. Your actual cost is usually equal or less than bid_amount; occasionally it may be a little higher, see Billing Event.

For example, use these settings to spend about $10.00 for 1,000 daily unique views:

  • Campaign objective: APP_INSTALLS
  • Ad set optimization_goal: REACH
  • Ad set billing_event: IMPRESSIONS

However, to spend $10.00 for each app install, use these settings:

  • Campaign objective: APP_INSTALLS
  • Ad set optimization_goal: APP_INSTALLS
  • Ad set billing_event: any valid option

billing_event does not affect auction prices directly. It indirectly affects your actual spending due to Ads Delivery Pacing.

Optimization Goals

Define advertising goals you want to achieve when Facebook delivers your ads. We use your ad set's optimization_goal to decide which people get your ad. For example with APP_INSTALLS, Facebook delivers your ad to people who are more likely to install your app.

optimization_goal defaults to a goal associated with your objective. For example, if objective is APP_INSTALLS, optimization_goal defaults to APP_INSTALLS.

If you specify another optimization_goal, Facebook delivers your ad to as many daily unique Accounts Center accounts as possible, regardlesss of the probability anyone takes action towards your objective. See Campaign, Objective, Optimization Goal and attribution_spec.

In Marketing API v2.4, we replaced forms of bidding such as bid_type, bid_info, and conversion_specs, with new fields: optimization_goal, bid_amount, and billing_event. This decoupled campaign optimization such APP_INSTALLS or LINK_CLICKS from billing, such as charges per IMPRESSIONS, APP_INSTALLS, or LINK_CLICKS.

Validation

These older objectives are deprecated with the release of Marketing API v17.0. Please refer to the Outcome-Driven Ads Experiences mapping table to find the new objectives and their corresponding destination types, optimization goals and promoted objects.

Certain campaign objectives support only certain ad set optimization_goals:

Campaign Objective Default optimization_goal Other valid optimization_goal

APP_INSTALLS, promoting an Instant Experiences app

APP_INSTALLS

IMPRESSIONS, POST_ENGAGEMENT

APP_INSTALLS, promoting a mobile app

APP_INSTALLS

OFFSITE_CONVERSIONS, LINK_CLICKS, REACH and VALUE

BRAND_AWARENESS

AD_RECALL_LIFT

REACH

CONVERSIONS

OFFSITE_CONVERSIONS

IMPRESSIONS, LINK_CLICKS, POST_ENGAGEMENT, REACH, VALUE, LANDING_PAGE_VIEWS, and CONVERSATIONS

EVENT_RESPONSES, promoting an event

EVENT_RESPONSES

IMPRESSIONS, REACH

EVENT_RESPONSES, promoting a Page post

EVENT_RESPONSES

IMPRESSIONS, POST_ENGAGEMENT, REACH

LEAD_GENERATION

LEAD_GENERATION

QUALITY_LEAD, LINK_CLICKS, and QUALITY_CALL

LINK_CLICKS

LINK_CLICKS

IMPRESSIONS, POST_ENGAGEMENT, REACH, LANDING_PAGE_VIEWS

LINK_CLICKS, promoting an Instant Experiences app

ENGAGED_USERS

APP_INSTALLS, IMPRESSIONS, POST_ENGAGEMENT, REACH

LINK_CLICKS, promoting a mobile app

LINK_CLICKS

IMPRESSIONS, REACH, OFFSITE_CONVERSIONS

MESSAGES

CONVERSATIONS

IMPRESSIONS, POST_ENGAGEMENT, LEAD_GENERATION, and LINK_CLICKS

PAGE_LIKES

PAGE_LIKES

IMPRESSIONS, POST_ENGAGEMENT, REACH

POST_ENGAGEMENT

POST_ENGAGEMENT

IMPRESSIONS, REACH, and LINK_CLICKS

PRODUCT_CATALOG_SALES

OFFSITE_CONVERSIONS or LINK_CLICKS

IMPRESSIONS, POST_ENGAGEMENT, REACH, CONVERSATIONS, and VALUE

REACH

REACH

IMPRESSIONS

VIDEO_VIEWS

THRUPLAY


Tracking Specs

Tracking specs help you track actions taken by users interacting with your ad. Tracking specs only track; they do not optimize ads delivery for an action or charge you based on that action.

You can use tracking specs with any bid type and creative. To specify tracking specs use the ad field, tracking_specs.

We automatically select a default tracking spec set based on your objective, but you can track additional actions. For example, a link page post ad with POST_ENGAGEMENT objective defaults to post_engagement tracking, but you setup a Facebook pixel on the offsite page and track other actions.

The default tracking spec for the page post engagement objective is action.type = post_engagement with ids for the post and page:

curl -X POST \ -F 'name="My First Ad"' \ -F 'adset_id="<AD_SET_ID>"' \ -F 'creative={ "creative_id": "<CREATIVE_ID>" }' \ -F 'tracking_specs={ "action.type": "post_engagement", "post": "<POST_ID>", "page": "<PAGE_ID>" }' \ -F 'status="PAUSED"' \ -F 'access_token=<ACCESS_TOKEN>' \ https://graph.facebook.com/v19.0/act_<AD_ACCOUNT_ID>/ads
'use strict'; const bizSdk = require('facebook-nodejs-business-sdk'); const AdAccount = bizSdk.AdAccount; const Ad = bizSdk.Ad; const access_token = '<ACCESS_TOKEN>'; const app_secret = '<APP_SECRET>'; const app_id = '<APP_ID>'; const id = '<AD_ACCOUNT_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 = [ ]; params = { 'name' : 'My First Ad', 'adset_id' : '<adSetID>', 'creative' : {'creative_id':'<adCreativeID>'}, 'tracking_specs' : {'action.type':'post_engagement','post':'<postID>','page':'<pageID>'}, 'status' : 'PAUSED', }; const ads = (new AdAccount(id)).createAd( fields, params ); logApiCallResult('ads api call complete.', ads);
require __DIR__ . '/vendor/autoload.php'; use FacebookAds\Object\AdAccount; use FacebookAds\Object\Ad; use FacebookAds\Api; use FacebookAds\Logger\CurlLogger; $access_token = '<ACCESS_TOKEN>'; $app_secret = '<APP_SECRET>'; $app_id = '<APP_ID>'; $id = '<AD_ACCOUNT_ID>'; $api = Api::init($app_id, $app_secret, $access_token); $api->setLogger(new CurlLogger()); $fields = array( ); $params = array( 'name' => 'My First Ad', 'adset_id' => '<adSetID>', 'creative' => array('creative_id' => '<adCreativeID>'), 'tracking_specs' => array('action.type' => 'post_engagement','post' => '<postID>','page' => '<pageID>'), 'status' => 'PAUSED', ); echo json_encode((new AdAccount($id))->createAd( $fields, $params )->exportAllData(), JSON_PRETTY_PRINT);
from facebook_business.adobjects.adaccount import AdAccount from facebook_business.adobjects.ad import Ad from facebook_business.api import FacebookAdsApi access_token = '<ACCESS_TOKEN>' app_secret = '<APP_SECRET>' app_id = '<APP_ID>' id = '<AD_ACCOUNT_ID>' FacebookAdsApi.init(access_token=access_token) fields = [ ] params = { 'name': 'My First Ad', 'adset_id': '<adSetID>', 'creative': {'creative_id':'<adCreativeID>'}, 'tracking_specs': {'action.type':'post_engagement','post':'<postID>','page':'<pageID>'}, 'status': 'PAUSED', } print AdAccount(id).create_ad( 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_ACCOUNT_ID>\"; APIContext context = new APIContext(access_token).enableDebug(true); new AdAccount(id, context).createAd() .setName(\"My First Ad\") .setAdsetId(<adSetID>L) .setCreative( new AdCreative() .setFieldId(\"<adCreativeID>\") ) .setTrackingSpecs(\"{\\"action.type\\":\\"post_engagement\\",\\"post\\":\\"<postID>\\",\\"page\\":\\"<pageID>\\"}\") .setStatus(Ad.EnumStatus.VALUE_PAUSED) .execute(); } }
require 'facebook_ads' access_token = '<ACCESS_TOKEN>' app_secret = '<APP_SECRET>' app_id = '<APP_ID>' id = '<AD_ACCOUNT_ID>' FacebookAds.configure do |config| config.access_token = access_token config.app_secret = app_secret end ad_account = FacebookAds::AdAccount.get(id) ads = ad_account.ads.create({ name: 'My First Ad', adset_id: '<adSetID>', creative: {'creative_id':'<adCreativeID>'}, tracking_specs: {'action.type':'post_engagement','post':'<postID>','page':'<pageID>'}, status: 'PAUSED', })

For custom tracking specs, see Tracking Specs, Custom.

FAQ

Most actions in an ad, including link clicks, app installs, video viewing over a certain period, tag photo, like, comment, share, and so on.