What Google Ads actually requires

This is the complete technical spec Google checks a playable ZIP against — no more, no less:

RequirementRule
Output typeZIP archive
Max size5 MB
Max files in ZIP512
Entry fileindex.html
Document structureMust include a <!DOCTYPE> declaration and proper <html>/<body> tags
OrientationMust declare an orientation meta tag
Asset pathsLocal relative paths only, with a short allow-list of external libraries
Click-throughExitApi.exit(), paired with a clickTag variable
AudioMust stay muted until a user interaction

The external-asset allow-list

Unlike AppLovin or Meta, Google doesn't require every asset to be inlined as base64. Local relative paths inside the ZIP are fine, and Google additionally permits a short, specific list of externally hosted resources:

  • Google's own exit API script, loaded from https://tpc.googlesyndication.com/pagead/gadgets/html5/api/exitapi.js
  • Google Fonts
  • Google-hosted jQuery, CreateJS, or GreenSock (GSAP)

Anything outside that list — a CDN font, a self-hosted analytics script, an arbitrary third-party library — is not on Google's allow-list and is a real risk of rejection, even though Google's model is otherwise more permissive about external requests than most other networks.

Click-through: clickTag + ExitApi.exit()

Google's click-through model has two parts. A clickTag variable holds the destination URL (this is a long-standing convention from Google's display-ad ecosystem, carried over into HTML5 playables), and the actual exit call is ExitApi.exit(), provided by the exitapi.js script above. Neither of these exists in a Playworks/Luna export by default — Unity's exporter has no reason to know Google's click convention, so this wiring has to be added specifically for Google.

Audio: muted until interaction

Google requires that audio in the creative stay muted until the user has interacted with it. A Playworks/Luna build that autoplays sound on load — which is a completely normal thing for a Unity project to do in its own player — will violate this the moment it's dropped into Google's ad surface unmodified.

Why the raw Playworks/Luna export doesn't meet this

Playworks (formerly Luna) builds a working playable from your Unity scene and exports it as a ZIP. That export runs correctly in a browser, but it's built to be a generic HTML5 export — not a Google-specific one. Concretely, a fresh export typically has none of the following:

  • No clickTag variable and no reference to ExitApi.exit() or Google's exitapi.js — Playworks/Luna has no built-in concept of Google's click-through convention.
  • No orientation meta tag, since Playworks/Luna doesn't target a single network's markup requirements.
  • No guarantee of muted-until-interaction audio — Unity's default audio behavior is designed for a standalone player, not an ad surface with a strict autoplay rule.
  • No guarantee the file count and total size stay under 512 files and 5 MB once you're bundling Unity's runtime, textures, and audio the way a generic export does.

None of this means the export is broken — it just wasn't built with Google's checklist in mind, because Google's checklist isn't Unity's problem to solve.

How PlayableKit adds it automatically

PlayableKit takes that same Playworks/Luna export ZIP and produces a Google-specific package: index.html as the entry file with a valid DOCTYPE and proper html/body structure, the orientation meta tag added, the clickTag variable and ExitApi.exit() wiring inserted and pointed at Google's exitapi.js, audio gated behind the first user interaction, and the whole thing checked against the 5 MB / 512-file ceiling before it's zipped up. You don't hand-edit the export's HTML or track Google's rules yourself — you upload the same build once and select Google Ads as a target.

Worth knowing: if you want to confirm your current export's size and file count against Google's 5 MB / 512-file limits before doing anything else, PlayableKit's free size checker does that in seconds with no signup. The Playable Ad Validator checks structural issues — missing entry file, broken inline script, missing engine assets — across all supported networks, also for free.

How to do it

  1. Export from Unity. Build your playable with Unity Playworks/Luna as you normally would, producing the export ZIP (on a typical setup, that's under ProjectRoot\LunaTemp\stage4\create-hub).
  2. Upload to PlayableKit. Upload that same export ZIP to PlayableKit — no re-export or manual editing needed first.
  3. Select Google Ads. Choose Google Ads as a target network (you can select others at the same time if you're shipping to more than one network from this build).
  4. Download. PlayableKit builds a Google-compliant ZIP — entry file, DOCTYPE/html/body structure, orientation meta, clickTag/ExitApi wiring, muted-audio gating, and size/file-count limits all handled — ready to upload to Google Ads.

Pricing

Google Ads is included on every paid PlayableKit plan. The Starter plan is $400/mo and covers Google Ads, Meta, AppLovin, and Unity Ads. Studio ($560/mo) and Scale ($800/mo) open up the remaining networks — Mintegral, TikTok, and Vungle — plus higher build limits and, on Scale, additional seats. Enterprise pricing is custom for teams that need dedicated infrastructure or support. See the full breakdown on the pricing page.