Every network publishes a spec sheet, and every spec sheet omits the thing that actually causes rejection. This is the shape of the requirements as they behave in practice, not as they read.
Google App campaigns
- Delivery: a single self-contained HTML file, or a zip whose root is index.html.
- Click handling: the approved ExitApi script, with the CTA calling ExitApi.exit(). A window.open or a bare href will not register.
- Copy: no currency symbols or monetary amounts in reward language.
- The usual failure: a designer wires the end-card button to a link instead of the exit call, and the unit serves with a dead CTA.
AppLovin
- Delivery: single self-contained HTML.
- Click handling: mraid.open() where MRAID is present, with a graceful fallback.
- The usual failure: assets referenced by relative path rather than inlined, producing a blank frame in the SDK.
Unity Ads
- Delivery: zip with index.html at the root, all assets inlined or bundled, no traversal above root.
- Runtime: ES5 output, fixed 375×667 stage scaled by transform, MRAID lifecycle respected and viewableChange gating the start.
- The usual failure: modern CSS — clamp(), flex gap, aspect-ratio, env() safe-area insets — silently collapsing the layout on older WebViews.
Mintegral
- Delivery: zip, index.html at root, everything inlined, no external requests of any kind.
- Runtime: PlayTurbo's WebView is the strictest target in the set. ES5, absolute units, no fetch or XHR, no NodeList.forEach.
- The usual failure: a font or an image left as a remote URL. It works in every preview and blanks in production.
The portable subset
Build to the intersection and you ship everywhere: one HTML document, every asset inlined as a data URI, ES5 syntax, a fixed logical stage scaled with a transform, touch handlers with a mouse fallback, and a single exit function abstracted behind whichever click API the target expects.
Testing on the constraint rather than the target is the whole discipline. A unit that survives the strictest WebView renders on the rest of them; the reverse is not true, and the failure mode is a black frame no dashboard will explain.
Have a playable ready to ship? Check it against every network with the free playable ad tester. No signup.
Keep going
- Technical
Why Mintegral still wants ES5
A tour of the PlayTurbo WebView's refusals — no clamp(), no flex gap, no safe-area insets — and how to build a fixed scaled stage that survives them.
- Compliance
The sentence you must not paraphrase
Network disclaimers are quoted, not written. What each one requires, when it is required, and what happens when a designer tidies it up.
- Guide
How to make a playable ad with AI
From a URL to four network-ready packages: brand analysis, brief review, build, deterministic QA and handoff. What the model does and what you must still decide.