Promoted products optimization
Updated: Apr 24, 2026
Copy for LLM
Ads in WhatsApp Status are available via the Marketing API. Learn more about ads in WhatsApp Status.
Generally Available: Promoted products optimization is available to all RMN-tagged accounts. No allowlisting is required.
This guide covers setting up promoted products optimization ad campaigns.
Before you begin
- Make sure you meet the Prerequisites in the product set optimization overview.
- Review Get Started with Advantage+ Catalog Ads.
Eligibility
Promoted products optimization is automatically available to:
- RMN-tagged accounts in CRM — no allowlisting required.
- Advertisers can self-identify as an RMN by updating their advertiser settings business details.
For other use cases, contact your Meta sales representative.
Activation
- Ads Manager (UI): Enable PPO with a single checkbox: select “Prioritize conversions of products in this set instead of your entire catalog” at the ad set level.
- Marketing API: Set “product_set_optimization”: “enabled” in the promoted_object field of your ad set.
- Omnichannel optimization: PPO is compatible with omnichannel optimization to drive both in-store and online sales within a single campaign. No additional configuration is needed.
- Value Optimization (VO): PPO supports Value Optimization to optimize for purchase value rather than purchase count. Set optimization_goal to VALUE at the ad set level.
Single-brand product sets
To create a product set, you can filter your catalog items using any expression. See Product Sets for the full parameter reference.
Example requests
A product set created using the vendor ID:
curl -X POST \
-F 'name=<PRODUCT_SET_NAME>' \
-F 'filter={"vendor_id": {"eq": ["<FILTER_VALUE>"]}}' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v26.0/<CATALOG_ID>/product_sets
A product set created using the brand:
curl -X POST \
-F 'name=<PRODUCT_SET_NAME>' \
-F 'filter={"brand": {"i_contains": "<BRAND>"}}' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v26.0/<CATALOG_ID>/product_sets
Ad campaign creation
Endpoint:
POST /act_{ad-account-id}/campaignsExample request
curl -X POST \
-F 'name=<PRODUCT_CATALOG_SALES_CAMPAIGN_NAME>' \
-F 'objective=OUTCOME_SALES' \
-F 'promoted_object={"product_catalog_id": "<CATALOG_ID>"}' \
-F 'status=PAUSED' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v26.0/act_<AD_ACCOUNT_ID>/campaigns
Key parameters
| Name | Description |
|---|---|
objective | Required. Set to OUTCOME_SALES for Advantage+ catalog ads. |
promoted_object | Required. Must include product_catalog_id. |
Ad set creation
Endpoint:
POST /act_{ad-account-id}/adsetsExample request
curl -X POST \
-F 'name=<PRODUCT_CATALOG_SALES_ADSET_NAME>' \
-F 'start_time=<START_TIME>' \
-F 'end_time=<END_TIME>' \
-F 'billing_event=IMPRESSIONS' \
-F 'optimization_goal=OFFSITE_CONVERSIONS' \
-F 'bid_strategy=LOWEST_COST_WITHOUT_CAP' \
-F 'daily_budget=<DAILY_BUDGET_IN_MINIMUM_DENOMINATION>' \
-F 'campaign_id=<CAMPAIGN_ID>' \
-F 'targeting={ "geo_locations": {"countries":["<COUNTRY>"]},
"dynamic_audience_ids": ["<DYNAMIC_AUDIENCE_ID>"] }' \
-F 'promoted_object={"product_set_id":"<PRODUCT_SET_ID>", "product_set_optimization":"enabled"}' \
-F 'budget_source=RMN' \
-F 'status=PAUSED' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v26.0/act_<AD_ACCOUNT_ID>/adsets
Key parameters
| Name | Description |
|---|---|
billing_event | For example, LINK_CLICKS or IMPRESSIONS. |
budget_source | Required. Source of the budget being used. Set to RMN for promoted products optimization. |
promoted_object.custom_event_type | Optional. Define a conversion event (for example, PURCHASE). |
promoted_object.product_set_id | Required for Advantage+ catalog ads. The product set to promote. |
targeting | Audience definition (broad or retargeting). |
Note: Once the ad set is created, you cannot update the
product_set_optimization and product_set_id fields in the promoted_object parameter.For static ads only
If you are creating a static ad campaign, ensure the conversion event in the ad set is set to
PURCHASE.Ad creation
Note: Include the
url_tags parameter when creating your ads.Endpoint:
POST /act_{ad-account-id}/adsExample request
curl -X POST \
-F 'name="<PRODUCT_CATALOG_SALES_AD_NAME>"' \
-F 'adset_id="<ADSET_ID>"' \
-F 'creative={
"product_set_id": "<PRODUCT_SET_ID>",
"asset_feed_spec": {"ad_formats": ["CAROUSEL"],"optimization_type": "FORMAT_AUTOMATION"},
"creative_sourcing_spec": {"source_url": "<URL>"},
"object_story_spec": {
"page_id": "<PAGE_ID>",
"template_data": {
"call_to_action": {"type": "SHOP_NOW"},
"format_option": "carousel_images_multi_items",
"link": "<URL>",
"multi_share_end_card": false
}
},
"degrees_of_freedom_spec": {
"creative_features_spec": {
"media_type_automation": {
"enroll_status": "OPT_IN"
}
}
},
"title": "{{product.name}}",
"url_tags": "<KEY1>=<VALUE1>&<KEY2>=<VALUE2>"
}' \
-F 'status="PAUSED"' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v26.0/act_<AD_ACCOUNT_ID>/ads
Note: The
degrees_of_freedom_spec field is for single-brand ads only.Reporting
Ads Manager
For PPO campaigns, the Results column displays Prioritized Product Set Purchases. Derived metrics (cost per result, ROAS, result value) are populated automatically.
Product set purchase breakdown: Enable the product set purchase breakdown in Ads Manager for granular visibility across:
- Website purchases
- In-app purchases
- Offline purchases
Insights API
The same PPO breakdown is available programmatically via the Insights API, using the existing action breakdown mechanism - add promoted_product_set_result to action_breakdowns.
The response splits actions / action_values by promoted_product_set_result, with two values:
- Prioritized product set purchases - purchases including at least one product from the promoted product set (the core PPO result).
- Other product purchases - attributed purchases that did not include a promoted product set product (halo conversions).