TikTok placement and creative diagnostic — the real builder, run on generated data. No figure here is a real campaign.
back to the portfolio →TikTok performance diagnostic — Ember & Ashes
Root-cause investigation: 5,200 TikTok installs, only 948 registered (18.2%). Root cause: campaigns are running on TikTok's INSTALL (CPI) optimization, not on APP EVENT (AEO) optimization with the registration event as the target. Migrate campaign type to fix.
5,200
Installs (TikTok)
AppsFlyer: 5,200
18.23%
Register / install
948 register events
$0.79
CPI
CPA register: $4.32
What's wrong with TikTok performance
⚠
Campaigns are configured for INSTALL optimization (CPI), not for in-app events (AEO) — this is the root cause
Installs = 5,200, Result = 0. The Result column is zero because Result only counts AEO (App Event Optimization) conversions; classic install campaigns don't populate it. TikTok delivered exactly what was asked for: 5,200 installs at $0.79 CPI. The problem is that 'cheapest install' is the wrong optimization target for a game with a registration funnel — it finds users who tap 'Install' easily (low intent), who then open the app for 10 seconds and quit.
Action: migrate from CPI campaigns to AEO campaigns with Complete Registration as the optimization event. Setup steps in TikTok Ads Manager: (1) New campaign → App promotion → choose App Event Optimization (AEO) instead of Install Volume; (2) at ad-group level set Optimization event = your registration event (sent via the AppsFlyer postback you already have); (3) expect installs to drop ~3-5× but registration rate to rise from 18.2% toward Facebook's 65%; (4) allow a 7-day learning phase (~50 registration events needed) before judging — algorithm is settling, ignore daily noise.
⚠
6 adgroups still optimize for INSTALL despite the registration event being available
These adgroups together spent $3.3k chasing installs the algorithm can mass-produce. Change Optimization event to your in-app register / signup event on each. Allow 3–7 days of re-learning before judging — install volume will drop, install→register % will climb sharply.
ℹ
CTR averages 3.7% — high for app-install campaigns (typical ~1-1.5%)
On a CPI-optimized campaign in the TikTok native feed, high CTR isn't malicious — it's the algorithm doing its job. Install-optimization finds users with the highest reflex-install probability while scrolling. They tap install impulsively, open the app, realize they're not in a 'try a new game' mindset, and bounce in 10 seconds. The mechanism is impulse-install + low intent, not incentive fraud.
One thing worth checking in the UI (we can't see it from the API without Ads Management scope): the ad-group placement setting. TikTok app campaigns include Pangle Audience Network by default. Pangle is third-party SDK inventory in other apps, where rewarded video and offer walls do exist. If your ad-group is set to Automatic placements rather than Select placements → TikTok only, some share of the impressions may be Pangle. Restrict to TikTok feed to remove that variable.
Data availability gaps. The current access token has only the
Reporting scope, so this report is missing:
placement / inventory breakdown (Pangle vs TikTok feed). To unlock these, re-authorize the API app with
Ads Management scope at
ads.tiktok.com → Marketing API → Apps and regenerate the access token. Then re-run
tiktok_pull.py.
1.Campaign objective mix
Which goal each TikTok campaign is optimized for. APP_PROMOTION with optimization_event=Install pumps install volume; APP_PROMOTION with optimization_event=Register (or your in-app event) optimizes for actual players.
| Objective | Spend | Share | |
|---|
| APP_PROMOTION | $4.1k | 100.0% |
|
2.Placement / inventory mix
Placement breakdown not available — the API rejected all dimension names tried (placement, inventory_type, placement_type). This is the most diagnostic signal we have; ask your TikTok rep which dimension is exposed for your account.
3.Optimization event audit
Per ad-group what TikTok's algorithm is told to maximize. Lines flagged red use INSTALL but get low register rate — the spend optimizes for the wrong goal.
| Optimization event | Adgroups | Spend | Installs | Registers | Reg/install |
|---|
| INSTALL | 6 | $3.3k | 4,212 | 769 | 18.26% |
| REGISTRATION | 3 | $779.00 | 988 | 179 | 18.12% |
4.Per-campaign metrics
The diagnostic table. Result is TikTok's count of the optimization-event conversions — when a campaign is set to optimize for "Complete Registration" (or any in-app event), this is the count of those events TikTok received via postback. If Result = 0 while Installs are high, the campaign is configured to optimize for an event that isn't being reported to TikTok — the algorithm has no quality signal and falls back to install-clickers.
| Campaign | Objective | Spend | Installs | Result (optim event) | Conversion | Regs (via metric) | Reg/install | CTR | CPI | Cost/Result |
|---|
| VN_EA_Install_Broad | APP_PROMOTION | $2.1k | 2,704 | 2,704 | 2,704 | 485 | 17.94% | 3.60% | $0.79 | $0.79 |
| VN_EA_Install_Lookalike | APP_PROMOTION | $1.2k | 1,508 | 1,508 | 1,508 | 284 | 18.83% | 2.65% | $0.79 | $0.79 |
| VN_EA_Register_Test | APP_PROMOTION | $779.00 | 988 | 988 | 988 | 179 | 18.12% | 4.02% | $0.79 | $0.79 |
How to read this row. These are CPI (install-optimized) campaigns, not AEO campaigns. Result only populates for AEO / Smart Performance campaigns that target in-app events — so for CPI campaigns the column is correctly 0. Conversion ≈ Installs because TikTok is counting installs as the conversion event. The number to act on is Reg/install via AppsFlyer (0.7%) — that's the symptom of "cheap-install optimization finds install-clickers, not players." Migrate the spend from CPI to AEO with registration as the optimization event; see the top of this report for the action list.
5.Wasteful creatives (high spend, near-zero register)
Ads that grabbed clicks & drove installs but produced almost no registrations. Audit the creative — likely a hook / promise mismatch with the actual game.
No wasteful creatives flagged — register rate is acceptable across ads.
6.TikTok vs AppsFlyer reconciliation
Same events, two source-of-truth systems. Gaps come from view-through attribution, postback delay, and click-fraud filters.
| TikTok | AppsFlyer | Δ |
|---|
| Installs | 5,200 | 5,200 | +0.0% |
| Registrations | 948 | 948 | +0.0% |