Ads and Commerce

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

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}/campaigns

Example 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

NameDescription
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}/adsets

Example 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

NameDescription
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}/ads

Example 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).