Skip to main content

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:

  • startDate

  • endDate

  • explicit 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!

Status: Completed1 comment

Log in to comment and vote

Comments1

  • Miquel Palet López

    Team•

    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/call too. Messaging ads now use the exact same targeting, budget and schedule builders as POST /v1/ads/create, so there is no separate subset anymore. Before this, the fields you sent were silently stripped, sorry about that.

    1. 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. Include targeting_automation in it (or send advantageAudience).

    2. languages: ISO codes ("en", "es", "pt_BR"), mapped to Meta locales.

    3. gender: male / female. Verified on a real ad set: Meta returns genders: [2], and it is stored on the ad as well. You can read the live ad set with GET /v1/ads/ad-sets/{adSetId}.

    4. Campaign budget: budgetLevel: "campaign" now creates a real CBO campaign (the ad set carries no budget).

    5. 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 need endDate.

    6. 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 with adSetId. 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).

    7. 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: true works with all of it.