Skip to main content

Meta Ads: Support the “Promotion” creative setting

We use Zernio to automate e-commerce Sales / Conversion ads and need API support for Meta Ads Manager’s “Promotion” option under:

Ad creative → Creative settings → Promotion

Product requirements:

  • Enable or disable Promotion through POST /v1/ads/create

  • Support any required promotion details, such as offer information or promo codes

  • Support both standalone creation and attaching an ad to an existing ad set

  • Preserve the setting when duplicating an ad or replacing its creative

  • Return the actual applied status so we can verify that Ads Manager shows Promotion as enabled

Currently, setting creativeFeatures.auto_promotion_tag to OPT_IN does not enable this option in Ads Manager.

This is important for our automated e-commerce ad creation workflow.

2 comments

Log in to comment and vote

Comments2

  • Miquel Palet López

    Team•

    Sep 11

    Correcting my earlier comment: I marked this Completed and that was wrong. Gavin tested it in production and Promotion is still off in Ads Manager. I have reopened it and verified why.

    What we shipped does not work. We send creative_sourcing_spec.promotion_metadata_spec. I tested that directly against Meta today on our own ad account, with two promotion types:

    • Meta accepts the creative and returns an id.

    • Meta validates the field, so it is a recognised parameter. Sending a malformed value returns (#100) Param creative_sourcing_spec['promotion_metadata_spec'][0] must be a JSON object.

    • Meta does not store it. Reading the creative back returns creative_sourcing_spec with the promotion absent entirely, and on a second test the whole field came back null. Requesting the nested field explicitly returns nothing either.

    So the field is accepted and silently discarded. That is why the ad is created successfully and the setting never appears.

    The other candidate is also ruled out. creative_features_spec.auto_promotion_tag does persist as OPT_IN on read-back, which is what made it look promising, but Gavin had already tested it and it does not enable the Ads Manager setting. It also has no way to carry a promotion type, value or promo code, so it is a different feature.

    Current honest status: we have no verified API path to the Ads Manager Promotion creative setting. Both known candidates have now been tested and neither works. This stays open rather than Completed, and we are not going to claim it is delivered again until the setting is confirmed visible in Ads Manager.

    Apologies for the premature close. The mistake was verifying that Meta accepted the request rather than verifying the result in the product.

  • Miquel Palet López

    Team•

    Sep 10

    Shipped and live. First, the reason your attempt could never have worked: creativeFeatures.auto_promotion_tag is an Advantage+ enhancement flag, not the Promotion setting. Ads Manager's Promotion lives somewhere else entirely, on the creative's creative_sourcing_spec.promotion_metadata_spec. Since we passed creativeFeatures through untouched, Meta simply ignored the key and nothing surfaced.

    What you use now. A dedicated promotion object on POST /v1/ads/create and POST /v1/ads/creatives:

    "promotion": { "type": "PERCENTAGE_OFF", "value": 20 }
    "promotion": { "type": "PROMO_CODE", "value": 10, "code": "ZERNIO10", "startDate": "…", "endDate": "…" }

    Accepted types, established by probing Meta directly rather than from docs: AMOUNT_OFF, FREE_RETURN, FREE_SHIPPING, PERCENTAGE_OFF and PROMO_CODE.

    It works on standalone creation and when attaching to an existing ad set, and it survives duplicating an ad and replacing its creative. Separately, creativeFeatures now applies on every creative shape rather than only the single standalone one, and is preserved through duplicate and replace, which it was not before.

    Where we could not fully meet your fifth requirement, returning the applied status. Meta accepts the promotion on create, but does not give it back on readback. We verified this in production today: two paused ads created with a promotion, then read straight from the Graph API, and creative_sourcing_spec comes back populated with other keys while promotion_metadata_spec is absent. So rather than guess, the create response carries creative.promotionStatus: "not_returned", which tells you honestly that we sent it and Meta did not echo it, instead of a confident value we cannot stand behind. creativeFeatures does round-trip, and we confirmed that live too.

    One favour, since you have the workflow in front of you: create one ad with a promotion and check whether Ads Manager shows it enabled. That is the single thing neither of us can see through the API. If it does not show, we will take it to Meta with the evidence.