WhatsApp Messaging Ads — Feature Parity Request with Standard Meta Ad Creation
Hi Zernio Team,
We have completed integration testing of WhatsApp Messaging Ads and would like to request several missing capabilities needed for production use in our Quick Launch workflow.
Our main requirement is to achieve Campaign / Ad Set / Targeting / Creative parity with the standard Meta ad creation flow wherever Meta supports the same capability.
1. Full Meta targeting / rawTargeting
We need Meta-native flexible_spec support so our layered targeting can be preserved:
L1: industry / application
L2: commercial / purchasing qualification
L3: job / decision-making role
Tags within each layer are OR, while layers are AND.
We tested rawTargeting with the Messaging Ads endpoint and it was ignored.
Please support rawTargeting with the same passthrough behavior available in the standard ad creation flow.
2. Audience language targeting
Please support audience languages.
Currently our WhatsApp campaigns cannot preserve language restrictions and remain unrestricted by language.
3. Gender targeting
Please support gender targeting and allow the resulting value to be read back from the actual Meta Ad Set.
4. Campaign-level budget / CBO
Please support true Campaign Budget Optimization natively.
budgetLevel=campaign did not create campaign-level budget in our testing.
5. Native scheduling
Please support:
startDateendDateexplicit timezone handling
Our current workaround can set the schedule after creation, but native support would reduce requests and failure points.
6. Add a new Ad Set to an existing Campaign
Please support an equivalent of:
existingCampaignId
We use multiple Persona Ad Sets under one Campaign and currently need an additional copy/move workflow.
7. Independent ad description
Please support an independent:
description
in addition to headline and primary text, with documentation on applicable placements.
THANKS again for the fast response!
Log in to comment and vote
Comments1
Miquel Palet López
Sep 29
Hi Alan, thanks for the detailed list. All 7 are live on
POST /v1/ads/messaging(WhatsApp, Messenger, Instagram Direct and multi-destination), and on/v1/ads/calltoo. Messaging ads now use the exact same targeting, budget and schedule builders asPOST /v1/ads/create, so there is no separate subset anymore. Before this, the fields you sent were silently stripped, sorry about that.rawTargeting: sent to Meta as the base layer, same passthrough as create, so a layered
flexible_spec(entries AND, ids inside an entry OR) lands as is. Flat fields you also send win per key. Includetargeting_automationin it (or sendadvantageAudience).languages: ISO codes (
"en","es","pt_BR"), mapped to Meta locales.gender:
male/female. Verified on a real ad set: Meta returnsgenders: [2], and it is stored on the ad as well. You can read the live ad set withGET /v1/ads/ad-sets/{adSetId}.Campaign budget:
budgetLevel: "campaign"now creates a real CBO campaign (the ad set carries no budget).startDate / endDate: with an offset they are used as is; without one (
"2027-01-15T09:00:00") they are read in the ad account timezone. A date-only end runs to 23:59:59 local, and lifetime budgets needendDate.existingCampaignId: adds a new messaging ad set (its own targeting, schedule and creatives) to a campaign you already have, which covers your persona ad sets. If that campaign has a campaign budget, leave out
budgetAmount/budgetType. Otherwise they go on the new ad set. The campaign objective must be OUTCOME_ENGAGEMENT, OUTCOME_SALES or OUTCOME_LEADS. Adding ads to an existing ad set was already there withadSetId. Note that Meta requires every ad set in a lowest-cost CBO campaign to use the same optimization goal, so a messaging ad set cannot join a CBO campaign whose ad sets optimize for something else (Meta error 1885760).description: independent link description, also per entry in
creatives[]. Meta mainly shows it on Facebook Feed, under the headline, when there is room. Instagram, Stories, Reels and Messenger placements do not display it.Example:
POST /v1/ads/messaging { "accountId": "...", "adAccountId": "act_...", "destination": "whatsapp", "name": "Quick launch, persona A", "headline": "Talk to a specialist", "body": "Get a quote on WhatsApp in minutes.", "description": "Replies within the hour", "imageUrl": "https://cdn.example.com/promo.jpg", "budgetAmount": 50, "budgetType": "daily", "budgetLevel": "campaign", "startDate": "2027-01-15T09:00:00", "endDate": "2027-02-15", "gender": "female", "languages": ["en", "es"], "rawTargeting": { "geo_locations": { "countries": ["US"] }, "flexible_spec": [ { "interests": [{ "id": "6003107902433" }, { "id": "6003139266461" }] }, { "behaviors": [{ "id": "6002714895372" }] } ], "targeting_automation": { "advantage_audience": 0 } } }Then add a persona ad set to that campaign with
"existingCampaignId": "<platformCampaignId>"and no budget fields. Everything else (exclusions, behaviors, work fields, custom audience include/exclude, savedTargetingId, special ad categories) works the same as on create. Docs: messaging ads.validateOnly: trueworks with all of it.