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 exactlyindex.html— not buried in a subfolder, not named after your project. - A first-level
config.jsondeclaringPlayable_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. AclickTag, anmraid.open()call, or a rawwindow.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
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
| Requirement | Doing it by hand from a Playworks/Luna export | With PlayableKit |
|---|---|---|
| Entry file | Move/rename the exported HTML to first-level index.html | Generated automatically |
config.json | Hand-write the file and set Playable_orientation to match your build | Generated automatically from the source build's orientation |
| Playable SDK | Source and wire in Playable-sdk.js yourself | Included and wired in automatically |
| CTA | Replace whatever click-through call Playworks/Luna exported with window.openAppStore() | Applied automatically |
| MRAID / external loading | Strip any MRAID-format code and dynamic asset fetches | Handled automatically — assets embedded, no MRAID, no runtime fetches |
| Compressed size | Re-zip, check size, repeat | Checked 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:
- Reads the exported build's orientation setting and writes a first-level
config.jsonwith the correctPlayable_orientationvalue — no hand-editing JSON. - Renames/relocates the entry file to a first-level
index.html. - Injects TikTok's
Playable-sdk.jsand rewires the existing click-through logic to callwindow.openAppStore()instead of whatever CTA method the source build used. - 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.
- 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.
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.