Playable ads guide

Meta (Facebook) Playable Ads: 2026 Creation & Review Guide

Meta's app install campaigns support HTML5 playable and interactive end card formats across Facebook and Instagram placements. A playable filters for install intent before anyone reaches the store, but Meta's review has a few requirements that catch most teams the first time. This guide covers what you need to pass review and what tends to work on Meta's placements. Current specs: Meta playable ad specs.

What Meta Expects From the File

  • A ZIP with index.html at its root, or a single self-contained HTML file: all assets (images, CSS, JS) embedded; no external URLs.
  • Two size limits: the ZIP may be up to 5 MB, but the index.html inside it must stay under 2 MB.
  • No MRAID: the asset must not require mraid.js. The store exit is FbPlayableAd.onCTAClick(), which takes no URL: Meta sends the user to the destination on the campaign.
  • No HTTP requests and no JavaScript redirects.
  • Mobile-first layout: Meta serves in-app on Facebook and Instagram feeds.
  • No data collection or tracking scripts: Meta adds its own pixel; don't inject a second one.
  • End card must be functional without audio: playables run muted by default.

Facebook vs Instagram Placement Considerations

Meta serves your playable across both Facebook and Instagram inventory unless you restrict placements. The two surfaces have different aspect ratios and user behaviors. Facebook feed units are often closer to 4:5 or 1:1; Instagram Stories and Reels favor 9:16 vertical. Design for portrait first, since it works well enough in most placements, and add a landscape variant only if your data shows real Facebook desktop volume.

Meta's Advantage+ audience targeting can expand your playable beyond the segment you defined. That usually helps, but verify that the CTA URL works for both iOS and Android users since the audience may skew differently than you expect across platforms.

What Causes Meta Playable Review Failures

  • External image or script URLs: Meta's sandbox checker rejects any network request.
  • An mraid.js tag or a window.open() redirect left in from another network's build: Meta's specification forbids both.
  • Audio that plays automatically: muted-by-default means autoplay audio won't fire.
  • Overly aggressive CTA timing: if the install prompt appears immediately with no interaction, Meta may flag it.
  • App Store links that don't match the advertised app: links are verified against your Business Manager app asset.

Keeping index.html Under 2 MB

Meta's two size limits catch teams who check only the ZIP. The ZIP may be up to 5 MB, but the index.html inside it must stay under 2 MB, and if your images, fonts and audio are embedded in that HTML file, they count against the smaller limit. A creative that is comfortably under 5 MB overall can still fail on the HTML alone.

Two things push the HTML up faster than people expect. First, base64 embedding makes binary assets roughly a third larger than the original files, so a 1.5 MB folder of images does not stay 1.5 MB once inlined. Second, a single uncompressed background image is often the largest thing in the file. Practical steps:

  • Convert photographic images to WebP and size them to the largest display size they are ever shown at, not to the source resolution.
  • Keep audio short and compressed, or leave it out: the creative runs muted by default anyway.
  • Use a font only if the design depends on it, and only the weights you actually use.
  • Check the export size before uploading, not after a rejection.

For the full workflow, see reducing playable ad file size and asset formats and compression.

Designing for Muted, Thumb-Driven Feeds

Meta's surfaces are scrolled with one thumb, with sound off, by people who did not come to see an ad. That shapes a few design decisions more than any file rule does.

  • Make the first interaction obvious without words. A hand or arrow pointing at the thing to tap reads faster than an instruction line.
  • Put meaning in text and motion, not in sound. If the reward moment relies on a sound effect, add a visual one: a burst, a counter, a pop.
  • Keep important content away from the very top and bottom of a vertical layout. On Stories and Reels the platform draws its own interface over those edges, so a CTA placed flush to the bottom can sit under it.
  • Size tap targets for a thumb. A CTA that is easy to hit with a mouse in a desktop preview can be fiddly on a phone.

Creating Meta-Compliant Playable Ads

In Playable Ads Maker, design your creative in the Image editor (for end cards) or the Video editor (for video-plus-end-card flows). Set your iOS App Store URL and Android Play Store URL in the export modal, then select Meta as your target network. The Meta export wires the CTA to FbPlayableAd.onCTAClick(), leaves out mraid.js, embeds every asset and packages index.html and main.js as a ZIP. Upload it in Meta Ads Manager under your app install campaign's creative section, in the Playable Ad format.

Testing on Meta

Use Meta's Creative Hub to preview your playable before submitting to a live campaign. It simulates the in-app webview environment and shows how the creative renders on different device sizes. This catches layout issues before they affect live impressions.

Porting a Build From Another Network to Meta

The most common Meta rejection on a team's first attempt is a file that was built for an MRAID network and repurposed. The differences are small but each one is a failure: the mraid.js tag has to go, every mraid.open() call has to become FbPlayableAd.onCTAClick(), any window.open() fallback has to go, and the result has to be packaged the way Meta expects. Doing that by hand is possible, but every later change means doing it again, and a single missed call is enough to fail review.

It is safer to treat the network as an export setting rather than a file edit: keep one project, select Meta at export, and let the exporter produce the Meta build alongside the others. If you want the background on why the networks differ, what MRAID is explains the protocol Meta does not use.

A Pre-Submission Checklist for Meta

  1. The package is a ZIP with index.html at its root, or a single self-contained HTML file.
  2. The ZIP is within 5 MB and index.html is under 2 MB.
  3. There is no mraid.js tag and no window.open() or location redirect anywhere in the file.
  4. Every CTA path calls FbPlayableAd.onCTAClick().
  5. Nothing is loaded from the network: no CDN images, fonts, scripts or analytics.
  6. The creative is fully understandable with sound off, and nothing depends on audio starting by itself.
  7. The first interaction is available promptly, and the CTA is not forced before the user has done anything.
  8. The app in the campaign matches the app the creative advertises.
  9. It has been previewed on real devices in portrait, and in landscape if you serve landscape placements.

The spec checker automates the mechanical items on that list, and playable ad rejection reasons covers failures that are not specific to Meta.

Split Testing on Meta

Meta's Advantage+ campaigns automate creative selection, but you can still run A/B tests by creating separate ad sets with different playable creatives. Test one variable at a time (headline vs CTA copy vs background art) and run each variant for at least 3–5 days before evaluating. In Playable Ads Maker a second variant takes a few minutes: duplicate the project, change one element, re-export, upload.

Create playable end cards in minutes—no code required.

Open Playable Ads Maker

Check a build against these specs

The free Playable Ad Spec Checker grades an HTML or ZIP against every network’s size cap, packaging, MRAID rules and store-exit calls. It runs entirely in your browser — no upload, no sign-up.