Cross-Platform Ad Transfer: Move a Campaign from Meta to TikTok in 32 Seconds
Most of the time spent "trying TikTok" is spent re-entering the campaign you already built on Meta. Here is the schema mapping we use at Whathead to do it in a single click.
Marketers always ask the same thing: "I have a working Meta campaign — can I just run it on TikTok too?" Yes, mostly. But "mostly" is doing a lot of work. The objective names are different. The placement options are different. TikTok has Smart+ and Meta has Advantage+. Targeting fields overlap maybe 60%. Here is how we close that gap.
Why translation is hard
Each ad platform models the world differently. Meta thinks in terms of objectives → ad sets → ads, with placement defined at the ad set level. TikTok thinks in terms of objectives → ad groups → ads, with placement defined at the campaign level. Both are reasonable; they are not interoperable.
The naive approach is to write a giant if-statement that copies fields one to one and prays. That breaks the moment a creative requires a 9:16 video TikTok wants but Meta does not. Or when the optimization goal "LINK_CLICKS" is valid on Meta but does not exist on TikTok (TikTok calls it "CLICK").
The intermediate representation
Whathead does not translate Meta directly into TikTok. We translate Meta into a platform-agnostic shape we call the "creative intent", then translate that shape into TikTok. The intent is small — about 30 fields — and it is what the user actually meant when they built the campaign.
A simplified version of the intent looks like this:
interface CreativeIntent {
objective: 'awareness' | 'traffic' | 'leads' | 'sales' | 'app_promotion'
audience: {
geo: string[]
age: { min: number; max: number }
interests?: string[] // resolved per-platform
languages?: string[]
}
placements: 'auto' | string[]
budget: { amount: number; currency: string; cadence: 'daily' | 'lifetime' }
schedule: { start: Date; end?: Date }
creatives: Creative[] // already platform-agnostic
} When a Meta campaign comes in, we map it to this shape. When the user picks "Send to TikTok", we map this shape to TikTok's ad group schema. Two single-direction translations are easier to maintain than one giant matrix.
Where it gets lossy
Some fields cannot survive the translation. We prefer being honest about that over silently dropping them.
• Custom audiences are platform-specific. A Meta lookalike does not exist on TikTok. We surface the warning and let the user pick a TikTok native audience to substitute.
• Placements that exist on one platform only. Reels-style placements map; Audience Network does not have a TikTok equivalent.
• Bid strategies. Meta's "Cost cap" and TikTok's "Cost cap" sound the same but compute differently — we map them but flag the difference.
Why 32 seconds
Most of the time is not in our code — it is in TikTok's API. Each ad creation call takes ~1 second on a warm Advanced-tier connection. A typical campaign with 4 ad groups × 4 ads = 16 creation calls + 1 campaign call = 17 sequential operations. With our parallel batching (capped at TikTok's 10 QPS limit), that lands at 25-32 seconds.
The remaining 5 seconds is media — TikTok needs the videos uploaded into its CDN before they can be attached to ads. We pre-fetch and re-upload from the Meta-side asset URLs so the user does not re-pick anything.
Idempotency, again
Same as the multi-account Meta case: cross-platform transfers must be idempotent. If TikTok times out on ad number 12 of 16, the user retries and we replay the 11 we already finished. The replay returns the same TikTok IDs, so the buyer's reporting dashboard does not see "two campaigns started at 11:42 with the same name".
Try it
Cross Transfer is on every Whathead plan starting Growth. Connect your Meta and TikTok ad accounts, build once, transfer in a click. The 32 seconds is a real number — we measured it from the moment the user clicks "Send to TikTok" until the last ad shows as published in our UI.