Meta Ads - Complete App Promotion support (iOS 14+ / SKAdNetwork)

Ask

Make goal: "app_promotion" fully launchable for iOS. Today the goal maps to Meta's App promotion objective with APP_INSTALLS optimization, and promotedObject: { applicationId, objectStoreUrl } is accepted on the ad set — that covers Android completely — but there is no field anywhere in the create surface for the three things Meta requires on iOS 14+ campaigns. Any iOS app campaign created through Zernio today is silently clamped by Meta to "iOS 13.7 or earlier" (effectively zero deliverable audience).

Scope: campaign/ad-set/ad creation for app installs and app-event optimization, app discovery reads, SKAN-aware insights.

Why

  1. App advertisers are iOS-first. Without these fields the goal exists but can't deliver on the platform that carries most app-install spend.

  2. The failure mode is the worst kind. Creation succeeds, delivery eligibility silently collapses, and the missing flag is immutable on Meta's side — the campaign must be deleted and recreated. Nothing errors; the ad set just shows "Apple App Store (iOS 13.7 or earlier)" in Ads Manager.

  3. The docs are silent either way. The Meta Ads "what you can't do" page doesn't mention app ads or SKAdNetwork, so integrators discover the gap in production.

Meta API level — the gaps, in priority order

  1. Campaign-level is_skadnetwork_attribution: true on campaign create (POST /v1/ads/create and POST /v1/ads/campaigns). Required for any campaign targeting iOS 14+; immutable after creation — it cannot be patched later, so exposing it on an update path (platformSpecificData) does not help. Without it Meta silently clamps user_os to iOS_ver_14.0_to_14.4 / pre-14 devices.

  2. Campaign-level promoted_object (application_id + object_store_url). Meta requires the promoted object on the campaign for SKAdNetwork/AEM campaign creation, not only on the ad set.

  3. Ad-set campaign_attribution enum (AEM | SKADNETWORK). Required on every iOS 14+ ad set; must be uniform across all ad sets in the campaign.

  4. user_os iOS 14+ targeting (user_os: ["iOS_ver_14.0_and_above"], user_device, device_platforms). Likely already transportable via rawTargeting, but needs (a) confirmation that validation doesn't strip it and (b) documentation — without item 1 it is silently clamped rather than rejected.

  5. Store-URL integrity on the creative. Meta rejects the ad with "Object store URL does not match promoted object" unless the creative's link_data.link (and CTA value link) is character-for-character identical to the ad set's promoted_object.object_store_url. Zernio must not normalize this URL or append tracking parameters to it. Related existing bug: tracking.urlTags is dropped on create (see docs/zernio/BUG-tracking-urltags-dropped.md), which forces integrators to bake tracking templates into linkUrl — for app ads that workaround is fatal, since the click URL must stay byte-identical to the store URL. url_tags must ride on the creative object. Also confirm INSTALL_MOBILE_APP / USE_APP are accepted callToAction values.

  6. SKAN validation rules encoded (or at least not blocked): billing_event and optimization_goal cannot both be APP_INSTALLS (the fixed IMPRESSIONS billing is fine), buying_type must be auction, TARGET_COST unavailable, deferred deep links unavailable, mobile-app custom audiences unavailable for inclusion targeting.

  7. App-event optimization pass-through: promotedObject.customEventType alongside applicationId + objectStoreUrl (AEO), and the VALUE optimization goal for app purchase-value bidding.

Reads / product asks

  • App discovery: expose GET act_{id}/advertisable_applications (app id, name, supported platforms, store URLs from app settings). There is currently no way to list Meta apps at all, so integrators must hand-enter applicationId — and the App Dashboard ID vs App Store ID confusion is the most common app-ads integration error. This edge also pre-validates that the ad account has permission to promote the app.

  • Campaign-limit read: passthrough for GET act_{id}/ios_fourteen_campaign_limits (available SKAN campaign/ad-set slots for the app). Meta caps concurrent iOS 14+ campaigns per app; without this read, creates fail unpredictably against the cap.

  • Insights: iOS 14+ campaigns cannot be aggregated with non-iOS campaigns for conversion metrics (Meta returns nothing on mixed queries) and require the default/unified attribution setting. The async report endpoint should support and document this, and ideally expose SKAN fields (skan_conversions, postback counts).

  • validateOnly coverage for all of the above so the whole iOS tree can be dry-run before spend.

  • Docs: an "App promotion" page stating the iOS requirements and the current Android/iOS support split explicitly.

References

  • Aggregated Event Measurement & SKAdNetwork limitations (campaign flag, campaign_attribution, limits): https://developers.facebook.com/docs/app-ads/SKAdNetwork-aem-and-limitations/

  • Ad Set promoted object reference: https://developers.facebook.com/docs/marketing-api/reference/ad-promoted-object/

  • Advantage+ app campaigns (valid optimization/bid/event combinations): https://developers.facebook.com/docs/app-ads/advantage-app-campaigns/

  • iOS 14 Marketing API changes (is_skadnetwork_attribution, ios_fourteen_campaign_limits): https://fb.me/iOS14-Marketing-Ads-Insights

  • App promotion campaign considerations (Ads Manager behavior, per-app campaign caps): https://www.facebook.com/business/help/651033805513936

Please authenticate to join the conversation.

Upvoters
Status

Completed

Board
💡

Feature Request

Date

11 days ago

Author

Fedir Bobylev

Subscribe to post

Get notified by email when there are changes.