PlayableForge

Why a stock Unity WebGL build fails as a playable ad

Blog ยท 2026-09-06

Many teams' first playable is a stock Unity WebGL build with a store link on the end. It almost always fails network review. Here is why, and what a playable-specific engine does differently.

A WebGL build carries the whole engine

Unity's WebGL export ships the engine runtime compiled to WebAssembly: physics, animation, UI, audio, networking, input, whether or not the game uses them. Even an empty scene lands at several megabytes before any of your assets are added. Playable networks cap you at 5 MB and expect a first frame in under two seconds, so the engine alone has spent the budget.

It expects a server

A WebGL build loads its .wasm, .data and framework files from separate URLs. Playable networks forbid external requests and most want a single self-contained HTML file. Getting a WebGL build into one file means base64-inlining tens of megabytes, which makes the size problem worse.

It does not speak the network's API

Each network expects the ad to call its own hooks: ironSource's dapi, Mintegral's gameReady(), Meta's FbPlayableAd.onCTAClick(). A stock build knows none of them, and it will start playing before the ad is visible, which reviewers reject immediately.

What a playable engine does instead

That is the whole reason PlayableForge exists. Same Unity project, same C#, but a runtime built for a 5 MB budget rather than a 500 MB one.

Skip the manual work. PlayableForge exports a validated build for this network (and 20 others) from your Unity project in one click. Get early access.