Omnichannel ads is a new optimization solution that lets you drive in-store and website sales using one sales campaign. The solution also includes new store location ad features to make shoppers aware of their nearest store locations.
Omnichannel ad setup is only officially supported in the Meta Ads Manager UI for advertisers, who can also use Marketing APIs for campaign setup and creation.
The following are the API integrations needed to create omnichannel campaigns, ad sets and ads.
Apps should have the following permissions:
ads_managementads_readMore detailed information on permissions and access can be found here.
Advertisers will need access to the following assets:
AD_ACCOUNT_ID: ID of the ad account that ad campaigns, ad sets and ads will be associated with. More information here.PIXEL_ID: ID of a Meta Pixel. Used in promoted_object in ad set creation. More information on setup and permissions here.OFFLINE_CONVERSION_DATASET_ID: ID of offline dataset. Used in promoted_object in ad set creation. More information on setup and permissions here.Omnichannel ads support many features of Meta ads, including:
To create a new omnichannel ad campaign, make a POST request to the /campaigns endpoint with the following parameters:
name: The name of the campaign.objective: The objective of the campaign. Valid value is OUTCOME_SALES.status: The status of the campaign. Valid values are ACTIVE, PAUSED.promoted_object: Adding product_catalog_id will enable Advantage+ catalog ads.curl -X POST \ https://graph.facebook.com/v20.0/act_<AD_ACCOUNT_ID>/campaigns \ -F 'name=My Omni campaign' \ -F 'objective=OUTCOME_SALES' \ -F 'status=ACTIVE' \ -F 'access_token=<ACCESS_TOKEN>'
curl -X POST \
https://graph.facebook.com/v20.0/act_<AD_ACCOUNT_ID>/campaigns \
-F 'name=My Omni campaign' \
-F 'objective=OUTCOME_SALES' \
-F 'promoted_object={"product_catalog_id":"<PRODUCT_CATALOG_ID>"}' \
-F 'status=ACTIVE' \
-F 'access_token=<ACCESS_TOKEN>'A successful response will return the ID of the newly created campaign.
Example:
{
"id": "23845678901234567"
}An unsuccessful response will return an error object with an explanation for the cause of the error.
{
"error": {
"message": "Invalid parameter",
"type": "OAuthException",
"code": 100,
"is_transient": false
}The error codes that may be returned when creating an omnichannel ad campaign are the same error codes as in regular campaigns.
To create a new omnichannel ad set, make a POST request to the /adsets endpoint with the following parameters:
name: The name of the ad set.campaign_id: The ID of the campaign that the ad set belongs to.bid_strategy: The bid strategy for the ad set to suit your specific business goals.daily_budget: The daily budget for the ad set.attribution_spec: Conversion attribution spec used for attributing conversions for optimization. For omnichannel ads, only CLICK_THROUGH event_type with a 7 window_days and VIEW_THROUGH event_type with a 1 window_daysare supported.promoted_object: The object your ad set is promoting across all its ads.
promoted_object should have an omnichannel_object with Pixel and offline objects. PURCHASE is the only custom event type supported for omnichannel ad sets. Please review the example below.
product_set_id with the variation field set to PRODUCT_SET_AND_IN_STORE. See the example below.
product_set_id, a pixel_id that has an associated offline conversion dataset, an app ID, and a Pixel ID. You will also need to set the variation to PRODUCT_SET_WEBSITE_APP_AND_INSTORE. You do not need an omnichannel_object. See the example below.targeting: The targeting spec for the ad set.optimization_goal: OFFSITE_CONVERSIONS, which will optimize for people more likely to make a conversion in the site and storestatus: The status of the ad set. Valid values are ACTIVE, PAUSEDcurl -X POST \
https://graph.facebook.com/v20.0/act_<AD_ACCOUNT_ID>/adsets \
-F 'name=My Omni Adset' \
-F 'campaign_id=<OMNI_CAMPAIGN_ID>' \
-F 'bid_strategy=LOWEST_COST_WITHOUT_CAP' \
-F 'billing_event=IMPRESSIONS' \
-F 'daily_budget=10000' \
-F 'promoted_object={
"omnichannel_object":{
"offline":[{"offline_conversion_data_set_id":"<OFFLINE_CONVERSION_DATASET_ID>","custom_event_type":"PURCHASE"}],
"pixel":[{"pixel_id":"<PIXEL_ID>","custom_event_type":"PURCHASE"}]
}
}' \
-F 'attribution_spec=[
{"event_type":"CLICK_THROUGH","window_days":"7"},
{"event_type":"VIEW_THROUGH","window_days":"1"}
]' \
-F 'targeting={"facebook_positions":["feed"],"geo_locations":{"countries":["US"],"regions":[{"key":"4081"}],"cities":[{"key":777934,"radius":10,"distance_unit":"mile"}]},"genders":[1],"age_max":24,"age_min":20,"publisher_platforms":["facebook","audience_network"],"device_platforms":["mobile"],"flexible_spec":[{"interests":[{"id":"<INTEREST_ID>","name":"<INTEREST_NAME>"}]}]}' \
-F 'status=ACTIVE' \
-F 'optimization_goal=OFFSITE_CONVERSIONS' \
-F 'access_token=<ACCESS_TOKEN>'curl -X POST \
https://graph.facebook.com/v20.0/act_<AD_ACCOUNT_ID>/adsets \
-F 'name=My Omni Adset' \
-F 'campaign_id=<OMNI_CAMPAIGN_ID>' \
-F 'bid_strategy=LOWEST_COST_WITHOUT_CAP' \
-F 'billing_event=IMPRESSIONS' \
-F 'daily_budget=10000' \
-F 'promoted_object={
"omnichannel_object":{
"offline":[{"offline_conversion_data_set_id":"<DATASET_ID>","custom_event_type":"PURCHASE"}],
"pixel":[{"pixel_id":"<DATASET_ID>","custom_event_type":"PURCHASE"}]
}
}' \
-F 'attribution_spec=[
{"event_type":"CLICK_THROUGH","window_days":"7"},
{"event_type":"VIEW_THROUGH","window_days":"1"}
]' \
-F 'targeting={"facebook_positions":["feed"],"geo_locations":{"countries":["US"],"regions":[{"key":"4081"}],"cities":[{"key":777934,"radius":10,"distance_unit":"mile"}]},"genders":[1],"age_max":24,"age_min":20,"publisher_platforms":["facebook","audience_network"],"device_platforms":["mobile"],"flexible_spec":[{"interests":[{"id":"<INTEREST_ID>","name":"<INTEREST_NAME>"}]}]}' \
-F 'status=ACTIVE' \
-F 'optimization_goal=OFFSITE_CONVERSIONS' \
-F 'access_token=<ACCESS_TOKEN>'curl -X POST \
https://graph.facebook.com/v20.0/act_<AD_ACCOUNT_ID>/adsets \
-F 'name=My Omni Adset' \
-F 'campaign_id=<OMNI_CAMPAIGN_ID>' \
-F 'bid_strategy=LOWEST_COST_WITHOUT_CAP' \
-F 'billing_event=IMPRESSIONS' \
-F 'daily_budget=10000' \
-F 'promoted_object={
"product_set_id":"<PRODUCT_SET_ID>",
"custom_event_type":"PURCHASE",
"variation":"PRODUCT_SET_AND_IN_STORE",
"omnichannel_object":{
"offline":[{"offline_conversion_data_set_id":"<OFFLINE_CONVERSION_DATASET_ID>","custom_event_type":"PURCHASE"}],
"pixel":[{"pixel_id":"<PIXEL_ID>","custom_event_type":"PURCHASE"}]
}
}' \
-F 'attribution_spec=[
{"event_type":"CLICK_THROUGH","window_days":"7"},
{"event_type":"VIEW_THROUGH","window_days":"1"}
]' \
-F 'targeting={"facebook_positions":["feed"],"geo_locations":{"countries":["US"],"regions":[{"key":"4081"}],"cities":[{"key":777934,"radius":10,"distance_unit":"mile"}]},"genders":[1],"age_max":24,"age_min":20,"publisher_platforms":["facebook","audience_network"],"device_platforms":["mobile"],"flexible_spec":[{"interests":[{"id":"<INTEREST_ID>","name":"<INTEREST_NAME>"}]}]}' \
-F 'status=ACTIVE' \
-F 'optimization_goal=OFFSITE_CONVERSIONS' \
-F 'access_token=<ACCESS_TOKEN>'curl -X POST \
https://graph.facebook.com/v20.0/act_<AD_ACCOUNT_ID>/adsets \
-F 'name=My Web+App+In-store Adset' \
-F 'campaign_id=<OMNI_CAMPAIGN_ID>' \
-F 'bid_strategy=LOWEST_COST_WITHOUT_CAP' \
-F 'billing_event=IMPRESSIONS' \
-F 'daily_budget=10000' \
-F 'promoted_object={
"pixel_id":"<PIXEL_ID>",
"product_set_id":"<PRODUCT_SET_ID>",
"custom_event_type":"PURCHASE",
"variation":"PRODUCT_SET_WEBSITE_APP_AND_INSTORE"
}' \
-F 'attribution_spec=[
{"event_type":"CLICK_THROUGH","window_days":"7"},
{"event_type":"VIEW_THROUGH","window_days":"1"}
]' \
-F 'targeting={"facebook_positions":["feed"],"geo_locations":{"countries":["US"],"regions":[{"key":"4081"}],"cities":[{"key":777934,"radius":10,"distance_unit":"mile"}]},"genders":[1],"age_max":24,"age_min":20,"publisher_platforms":["facebook","audience_network"],"device_platforms":["mobile"],"flexible_spec":[{"interests":[{"id":"<INTEREST_ID>","name":"<INTEREST_NAME>"}]}]}' \
-F 'status=ACTIVE' \
-F 'optimization_goal=OFFSITE_CONVERSIONS' \
-F 'access_token=<ACCESS_TOKEN>'A successful response will return the ID of the newly created ad set.
{
"id": "23845678901234567"
}An unsuccessful response will return an error object with an explanation for the cause of the error.
{
"error": {
"message": "Invalid parameter",
"type": "OAuthException",
"code": 100,
"error_subcode": 3858449,
"is_transient": false,
"error_user_title": "Ad Account Ineligible For Omnichannel Ads",
"error_user_msg": "Omnichannel ads is only available for eligible Ad Account IDs. Use an eligible Ad Account ID or contact your Meta representative for more info.",
"fbtrace_id": "A8A163-BtrDGjzTEDskGTy"
}The error codes that may be returned when creating an omnichannel ad campaign are the same error codes as in regular campaigns.
The following error codes may be returned when creating a campaign:
| Subcode | Description |
|---|---|
2446432 | Omnichannel ads only support the OUTCOME_SALES objective. |
3858449 | Omnichannel ads are only available for eligible ad account IDs. Use an eligible ad account ID or contact your Meta representative for more info. |
3858450 | Ad set needs a valid Meta Pixel ID for omnichannel ads. Use a valid ID or create a Pixel in Meta Events Manager. |
3858451 | Omnichannel ads ad sets need a valid custom event type. The only valid event type is "Purchase". |
3858452 | Omnichannel ads ad sets need a valid offline dataset ID. Use a valid offline dataset or set one up in Events Manager. |
3858453 | Omnichannel ads ad sets only support an attribution spec of 7-day click-through and 1-day view-through. |
3858454 | Omnichannel ads ad sets only support the offsite_conversions optimization goal. |
3858513 | For datasets, Pixel ID and offline dataset ID fields must be the same. |
3858514 | Dataset must contain an offline dataset ID. |
3858515 | Dataset contains an invalid offline dataset ID. Check the setup of your unified dataset. |
To create a new ad, make a POST request to the /adcreatives endpoint with the following parameters:
name: The name of the ad creative.object_story_spec: The specifications of a creative containing the page ID and other content to create a new unpublished page post specified using one of link_data, photo_data, video_data, text_data or template_data.degrees_of_freedom_spec: Specifies the types of transformations that are enabled for the given creative.
local_store_extension for a high performance omnichannel ad format. (Only available for non Advantage+ catalog ads).product_set_id: Use the same product set as in ad set creation, if you are creating Advantage+ catalog ads.product_sales_channel to omni.curl -X POST \
https://graph.facebook.com/v20.0/act_<AD_ACCOUNT_ID>/ads \
-F 'name=My Omni Ad Creative' \
-F object_story_spec={
"page_id":"<PAGE_ID>",
"link_data":{
"link":"<LINK>",
"call_to_action": {"type": "SHOP_NOW"}
}
}' \
-F 'degrees_of_freedom_spec={
"creative_features_spec": {
"standard_enhancements":{
"action_metadata":{"type":"STICKY"},
"enroll_status":"OPT_IN"
},
"local_store_extension":{
"action_metadata":{"type":"MANUAL"},
"enroll_status":"OPT_IN"
}
}
}' \
-F 'status=ACTIVE' \
-F 'access_token=<ACCESS_TOKEN>'curl -X POST \
https://graph.facebook.com/v20.0/act_<AD_ACCOUNT_ID>/ads \
-F 'name=My Omni Advantage+ Catalog Ad Creative'' \
-F 'object_story_spec={
"page_id":"<PAGE_ID>",
"template_data":{
"call_to_action":{"type":"SHOP_NOW"},
"link":"<LINK>",
"name":"Headline {{product.price}}",
"description": "Description {{product.description}}",
"message": "Test {{product.name | titleize}}",
}
}' \
-F 'product_set_id="<PRODUCT_SET_ID>"' \
-F 'status=ACTIVE' \
-F 'access_token=<ACCESS_TOKEN>'curl -X POST \
https://graph.facebook.com/v20.0/act_<AD_ACCOUNT_ID>/ads \
-F 'name=My Omni Advantage+ Catalog Ad Creative'' \
-F 'object_story_spec={
"page_id":"<PAGE_ID>",
"template_data":{
"call_to_action":{"type":"SHOP_NOW"},
"link":"<LINK>",
"name":"Headline {{product.price}}",
"description": "Description {{product.description}}",
"message": "Test {{product.name | titleize}}",
}
}' \
-F 'product_set_id="<PRODUCT_SET_ID_FROM_SBLI_CATALOG>"' \
-F 'recommender_settings={"product_sales_channel": "omni"}`
-F 'status=ACTIVE' \
-F 'access_token=<ACCESS_TOKEN>'To create a new ad, make a POST request to the /ads endpoint with the following parameters
name: The name of the ad.adset_id: The ID of the ad set that the ad belongs to.creative: The creative spec or the ID of the ad creative for the ad.status: The status of the ad. Valid values are ACTIVE, PAUSED.curl -X POST \
https://graph.facebook.com/v20.0/act_<AD_ACCOUNT_ID>/ads \
-F 'name=My Omni Ad' \
-F 'adset_id=<OMNI_AD_SET_ID>' \
-F '{"creative_id":"<AD_CREATIVE_ID>"}' \
-F 'status=ACTIVE' \
-F 'access_token=<ACCESS_TOKEN>'A successful response will return the ID of the newly created ad.
{
"id": "23845678901234567"
}The error codes that may be returned when creating omnichannel ads are the same error codes as in regular ads.
The following error codes may be returned when creating a campaign:
| Subcode | Description |
|---|---|
3858455 | Omnichannel ads don’t support flexible formats for ad creative. Instead use single image or video, collection or carousel formats. |
3858456 | Omnichannel ads don’t support using ad creative from an existing post or creative hub mockup. |