Why Meta-specific testing matters
A general "does this playable work" pass isn't enough for Meta. Its rejection reasons are narrower and more literal than most networks': a stray external font request, audio that starts a beat early, a CTA wired to the wrong function — any one fails the file even if the gameplay itself is fine. None of these require Meta's review team to catch them. They're visible in a browser's dev tools or with thirty seconds of manual tapping, so every rejection for one of them is a review cycle you didn't need to lose.
This checklist is deliberately narrow — just what's specific to Meta's spec: single-file packaging, zero external requests, FbPlayableAd.onCTAClick(), gated audio, the 2 MB/5 MB size targets, and the MRAID prohibition. For the broader routine that applies across every network — opening the raw export locally, testing orientation — see how to test a Unity Playworks/Luna export before submitting.
The Meta-specific checklist
1. Confirm zero external requests in the network tab
Open the built Meta HTML file in a browser, open dev tools, switch to the Network tab, and reload. Meta's spec prohibits any external request once the ad is live — no CDN-hosted image, no external font, no analytics ping, nothing fetched over the network. If the Network tab shows anything other than the single HTML document loading, that's a request Meta's review pipeline will also see, and it's disqualifying regardless of what it was for.
2. Confirm FbPlayableAd.onCTAClick() actually fires on tap
Meta's click API is specific to Meta — not window.open(), not an MRAID call, not an auto-redirect on load. Tap the install/CTA button yourself and confirm FbPlayableAd.onCTAClick() is the function that actually executes. Without a full Meta test harness, the easiest check is to open dev tools, set a breakpoint or temporary console.log inside the function, and confirm it fires on tap and only on tap — never before the user has interacted.
3. Confirm audio is gated behind interaction
Sound is only allowed to start after a real user interaction. Load the playable cold, with sound on, and listen. If anything plays before you've tapped the screen — even a short sting on load — that's a violation regardless of volume or content. Then tap through and confirm audio starts correctly once you have interacted, since muting everything to be safe is its own kind of broken build.
4. Confirm the real file size against the 2 MB target and 5 MB cap
5 MB is Meta's hard cap; 2 MB is what it actually recommends, because a creative that clears the cap but sits well above the recommendation loads slowly on a feed scroll and hurts delivery even when it technically passes review. Check the size of the final, single-file build after every asset has been embedded as base64 — not the size of your raw export, since encoding inflates size, sometimes substantially, past what the source files suggested.
5. Confirm there's no MRAID in the file
Meta doesn't use MRAID. If this same build is also shipping to AppLovin or Unity Ads, double-check the Meta version doesn't still contain mraid.open() or other MRAID lifecycle calls left over from that wiring — a creative that's otherwise correct but contains MRAID references is the wrong shape for Meta and gets rejected on that basis alone.
Where the free tools fit
PlayableKit's free tools cover the mechanical half of this list — the part that's about the file itself rather than what happens when a person taps it:
| Checklist item | How to verify |
|---|---|
| Zero external requests | Network tab, or catch it upstream with the free Validator |
| Real file size vs. 2 MB/5 MB | The free Size Checker reports actual encoded size against Meta's real caps |
| MRAID references present | Validator flags leftover MRAID calls in a Meta-targeted build |
| CTA actually fires on tap | Manual test — no tool can confirm real tap behavior for you |
| Audio gated behind interaction | Manual test — load cold with sound on and listen |
The Validator and Size Checker exist specifically to catch the structural, rule-based failures before you spend time on the manual checks — there's no point confirming the CTA fires correctly on a build that's still making an external request and would get rejected for that regardless. For the full technical spec behind this checklist — every requirement, not just the pre-submission version — see Meta playable ads: requirements, formats & common errors.