What TikTok actually requires

TikTok's playable ad format has a specific, non-negotiable shape. Miss any one of these and the creative gets bounced in review — often without much detail on which rule tripped it:

  • ZIP output, 5 MB or smaller after compression. That's the compressed size of the final archive, not the uncompressed asset footprint — a build that looks fine unzipped can still fail once TikTok checks the packaged ZIP.
  • A first-level index.html. The main HTML file has to sit at the top level of the ZIP and be named exactly index.html — not buried in a subfolder, not named after your project.
  • A first-level config.json declaring Playable_orientation. This is the detail most teams miss (more on it below).
  • TikTok's own Playable SDK. The package must load TikTok's Playable-sdk.js — this isn't optional or interchangeable with a generic MRAID shim.
  • Click-through via window.openAppStore(). That's the only supported CTA call. A clickTag, an mraid.open() call, or a raw window.open() won't trigger TikTok's install flow correctly.
  • No MRAID format. TikTok explicitly prohibits the MRAID playable format — a build authored around AppLovin's or Unity Ads' MRAID conventions has to be re-wired, not just re-zipped.
  • No dynamic external material loading or JS redirects. Every asset needs to be present in the package and loaded locally; the creative can't fetch resources at runtime or redirect via script.

The config.json detail that's easy to miss

Why this trips people up: Google, AppLovin, Meta, Unity Ads, and Vungle all take a single HTML entry point (single file or ZIP) with no separate manifest. TikTok is the outlier — it specifically requires a config.json sitting alongside index.html in the first-level directory, declaring Playable_orientation. If a team builds one "generic" package and reuses it across networks, this is the file that quietly goes missing, because nothing about a Playworks/Luna export or most other networks' specs would have ever asked for it.

There's no visual symptom in a browser preview that tells you config.json is missing or malformed — the HTML still runs fine locally. It only surfaces as a rejection in TikTok's own review pipeline, which makes it exactly the kind of requirement worth checking before submission rather than after.

Manual export vs. PlayableKit

RequirementDoing it by hand from a Playworks/Luna exportWith PlayableKit
Entry fileMove/rename the exported HTML to first-level index.htmlGenerated automatically
config.jsonHand-write the file and set Playable_orientation to match your buildGenerated automatically from the source build's orientation
Playable SDKSource and wire in Playable-sdk.js yourselfIncluded and wired in automatically
CTAReplace whatever click-through call Playworks/Luna exported with window.openAppStore()Applied automatically
MRAID / external loadingStrip any MRAID-format code and dynamic asset fetchesHandled automatically — assets embedded, no MRAID, no runtime fetches
Compressed sizeRe-zip, check size, repeatChecked during build; flagged before you download

How PlayableKit builds a TikTok-ready package

You upload the same Luna/Playworks export ZIP you already have — nothing changes about how you build in Unity. Select TikTok as a target, and PlayableKit:

  1. Reads the exported build's orientation setting and writes a first-level config.json with the correct Playable_orientation value — no hand-editing JSON.
  2. Renames/relocates the entry file to a first-level index.html.
  3. Injects TikTok's Playable-sdk.js and rewires the existing click-through logic to call window.openAppStore() instead of whatever CTA method the source build used.
  4. Strips MRAID-format code paths and converts on-demand/external asset loading into locally packaged resources, so nothing in the creative depends on a runtime fetch or redirect.
  5. Zips the result and checks the compressed size against the 5 MB cap before handing you the download.

The output is a ZIP that matches TikTok's package shape exactly — same source build, no manual file surgery, and no guessing whether config.json made it in this time.

Not sure your current export is even structurally sound first? Run it through PlayableKit's free Playable Ad Validator to catch a missing entry file or broken inline script before you build for any network, or use the size checker to see where your compressed size actually stands against the 5 MB cap.

Where this fits in PlayableKit's plans

TikTok export is available starting on the Studio plan ($560/month, 100 builds) and up — Scale ($800/month, 2 seats, 300 builds) and Enterprise both include it as well, alongside every other supported network. If TikTok is one of the networks you're shipping to, check the plan comparison to confirm it's covered before you subscribe.