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.
Log in to comment and vote
Comments2
Miquel Palet López
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_specwith the promotion absent entirely, and on a second test the whole field came backnull. 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_tagdoes persist asOPT_INon 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
Sep 10
Shipped and live. First, the reason your attempt could never have worked:
creativeFeatures.auto_promotion_tagis an Advantage+ enhancement flag, not the Promotion setting. Ads Manager's Promotion lives somewhere else entirely, on the creative'screative_sourcing_spec.promotion_metadata_spec. Since we passedcreativeFeaturesthrough untouched, Meta simply ignored the key and nothing surfaced.What you use now. A dedicated
promotionobject onPOST /v1/ads/createandPOST /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_OFFandPROMO_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,
creativeFeaturesnow 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_speccomes back populated with other keys whilepromotion_metadata_specis absent. So rather than guess, the create response carriescreative.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.creativeFeaturesdoes 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.