What Creative Optimizations Do
Marketing Messages API for WhatsApp can automatically apply visual and textual enhancements to marketing template messages to increase engagement. They are inspired by Meta's Advantage+ creative tooling for ads.
Meta reports an average +13.9% click-through rate lift from the optimizations active as of January 2026 (A/B test on 50M+ messages from ~200 advertisers, December 1, 2025 – January 7, 2026, statistically significant at 95% confidence).
These optimizations introduce creative variability — the same template can render differently across messages because Meta is testing variants and selecting the highest-performing one over time. They are exclusive to MM API; Cloud API marketing sends never have them applied.
Active Optimizations
| Key | What it does |
|---|---|
image_brightness_and_contrast | Apply effective brightness/contrast filters to header images |
image_touchups | General visual quality enhancements |
image_animation | Convert header images to animated GIFs (in testing, may not always run) |
image_background_gen | Generate alternative image backgrounds |
image_banner | Apply colorful padding to transform image creative to optimal aspect ratio |
text_extraction_for_headline | Extract keywords/phrases from your message to create a headline highlighting key info |
text_extraction_for_tap_target | Extract keywords/phrases to create a title for the tap-target area |
text_formatting_optimization | Adjust text formatting (remove excess whitespace, bold key phrases). No content change |
auto_promotion_tag | Extract promotional phrases like "30% off" or "Free shipping" into a visual promotion tag on the image |
product_extensions | For single-image creatives, append related catalog products users are likely to engage with |
| Dynamic CTA | Tailor CTA text to match the message or URL's value proposition |
| Hyperlink formatting | Convert promotional keyphrases into hyperlinks mapped to the CTA, or shorten / format URL links in the message body |
Paused or Deprecated
These have been paused and should not be expected to apply to current sends, even if the keys appear in older configs:
add_text_overlay— was: add a text overlay onto your image using the message content- Image cropping (no key) — was: auto-crop header images to optimal dimensions
- Original
image_animationwas paused but is now back in testing under the same key
Meta will update its documentation if any of these restart.
Text Truncation (Always Applied)
Independent of creative_features_spec, all MM API sends have automatic text truncation applied based on message shape. The truncated content stays accessible behind a "Read more" toggle.
| Message shape | Truncated to |
|---|---|
| No CTA but link in body | 5 lines |
| Media header (image, video, document, location, GIF) | 3 lines |
| No header (text-only) | 4 lines |
This rule cannot be opted out of.
Where They Apply
- Template-level config wins. If a template has its own
creative_features_spec, that overrides the WABA-level default for messages sent with that template. - Default state at template level: enabled. New templates have all optimizations on unless you explicitly opt out per key.
- Default state at WABA level: disabled. WABA-level config requires explicit
OPT_INper key to apply. - Both default behaviors are intentional — templates lean into optimization out of the box, while account-wide opt-in stays a deliberate choice.
Configure at the Template Level
Set creative_features_spec inside degrees_of_freedom_spec when creating or updating the template:
POST /<WABA_ID>/message_templates
{
"name": "<TEMPLATE_NAME>",
"language": "<TEMPLATE_LANGUAGE_AND_LOCALE_CODE>",
"components": [/* ... */],
"degrees_of_freedom_spec": {
"creative_features_spec": {
"image_brightness_and_contrast": { "enroll_status": "OPT_OUT" },
"image_touchups": { "enroll_status": "OPT_IN" },
"image_animation": { "enroll_status": "OPT_IN" },
"image_background_gen": { "enroll_status": "OPT_IN" },
"auto_promotion_tag": { "enroll_status": "OPT_IN" },
"text_extraction_for_headline": { "enroll_status": "OPT_IN" },
"text_extraction_for_tap_target": { "enroll_status": "OPT_IN" },
"product_extensions": { "enroll_status": "OPT_OUT" },
"text_formatting_optimization": { "enroll_status": "OPT_OUT" }
}
}
}
Each key takes either OPT_IN or OPT_OUT. Keys you omit fall back to the template default (enabled).
Configure at the WABA Level
Apply a default across every marketing template under a WABA:
POST /<WABA_ID>
{
"degrees_of_freedom_spec": {
"creative_features_spec": {
"image_touchups": { "enroll_status": "OPT_IN" },
"image_animation": { "enroll_status": "OPT_IN" },
"image_brightness_and_contrast": { "enroll_status": "OPT_IN" },
"image_background_gen": { "enroll_status": "OPT_IN" },
"auto_promotion_tag": { "enroll_status": "OPT_IN" },
"text_extraction_for_headline": { "enroll_status": "OPT_IN" },
"text_extraction_for_tap_target": { "enroll_status": "OPT_IN" },
"product_extensions": { "enroll_status": "OPT_IN" },
"text_formatting_optimization": { "enroll_status": "OPT_OUT" }
}
}
}
WABA-level keys you omit stay at the WABA default (disabled). A template that explicitly sets a key still wins over the WABA default.
Retrieve Current Config
Template:
GET /<TEMPLATE_ID>?fields=degrees_of_freedom_spec
{
"degrees_of_freedom_spec": {
"creative_features_spec": [
{ "key": "IMAGE_BRIGHTNESS_AND_CONTRAST", "value": { "enroll_status": "OPT_OUT" } },
{ "key": "IMAGE_TOUCHUPS", "value": { "enroll_status": "OPT_OUT" } },
{ "key": "TEXT_EXTRACTION_FOR_HEADLINE", "value": { "enroll_status": "OPT_OUT" } },
{ "key": "PRODUCT_EXTENSIONS", "value": { "enroll_status": "OPT_IN" } },
{ "key": "TEXT_FORMATTING_OPTIMIZATION", "value": { "enroll_status": "OPT_IN" } }
]
},
"id": "123456789"
}
Note the read shape uses upper-case keys and an array of {key, value} objects, while the write shape uses lower-case keys and an object map.
WABA:
GET /<WABA_ID>?fields=degrees_of_freedom_spec
{
"degrees_of_freedom_spec": {
"data": [
{
"creative_features_spec": [
{
"image_brightness_and_contrast": "OPT_IN",
"image_touchups": "OPT_IN",
"image_animation": "OPT_IN",
"image_background_gen": "OPT_IN",
"auto_promotion_tag": "OPT_IN",
"text_extraction_for_headline": "OPT_IN",
"product_extensions": "OPT_IN",
"text_extraction_for_tap_target": "OPT_IN",
"text_formatting_optimization": "OPT_IN"
}
]
}
]
},
"id": "1234567890"
}
The WABA read shape is yet another variant — flat key/value pairs inside creative_features_spec[0]. Plan your client code accordingly.
Operational Notes
- Meta is continuously adding new optimizations. New keys may be applied automatically to opted-in templates without explicit migration. Audit your
degrees_of_freedom_specperiodically if you care about deterministic rendering. - Optimizations only apply on MM API sends. The same template sent through Cloud API
/messageswill render verbatim with no enhancements. - The same template can render differently across messages — this is the design, not a bug. If your QA process expects pixel-identical sends, MM API is the wrong send path.
- All optimizations preserve message content. Text formatting and truncation re-flow but do not alter the words.