一句话摘要
标题主题:花 6 个月调好的 TikTok 广告印钱设置
真正能印钱的 TikTok Ads 设置——我花了 6 个月才搞对(帮你跳过这份痛) 2026 年 6 月 19 日 · 8 分钟阅读 · 查看原文 ↗ Tiktok 广告 付费墙 移动应用
我运营一个 bootstrapped 的 iOS 订阅应用。有几个月,我把广告预算烧进 TikTok,换回来的全是垃圾:Ads Manager 里 0 转化,而我的支付处理器清楚地显示有人在订阅。
广告是有效的。归因是坏的。而一条坏的归因管道意味着 TikTok 的算法在盲目优化——如果它永远不知道谁买了,它就找不到更多买家。
这正是我希望第一天就有人塞给我的确切设置。如果你是一个在发订阅应用的 vibe coder,抄这个,跳过那 6 个月的痛。
为什么这很难(以及为什么大多数指南帮不上忙)
在 iOS 上,Apple 的隐私框架(ATT + SKAN)横在你的应用和广告网络之间。默认情况下,TikTok 几乎看不到安装之后发生了什么。两件事会出错:
SKAN 节流——Apple 只有在你跨过一个隐私阈值(约 90 次安装/天)之后才发送转化回传。低于那个值,多达约 74% 的回传会返回空。在小预算上,你就是在盲飞。
信号冲突——如果你同时装了 TikTok SDK 和一个 MMP,TikTok 会一直去听错的那个,即便归因实际上在工作,也会报 0 转化。
解法是一套带实时上报的、正确的移动测量伙伴(MMP)设置,并且手动告诉 TikTok 信任它。下面是完整内容。
技术栈
应用:iOS 订阅应用(我的情况是 React Native / Expo)
MMP:AppsFlyer
订阅:RevenueCat
广告:TikTok Ads Manager + Business Center
这四个必须以特定方式互相通信。顺序很重要。
第 1 步——TikTok Business Center 和账户结构
在 Business Center 里新建一个广告主账户。
把你的 TikTok 账号链接上去。
前往 Tools → Events Manager → New data source。
添加你的 MMP:选择 AppsFlyer,粘贴你的 iOS App Store 链接,并选择 All App Events。
不要跳过 Business Center 这一层。它是让你以后能干净地管理权限的东西。
第 2 步——AppsFlyer 仪表盘配置
这是大多数设置悄悄失败的地方。默认值对需要实时信号的小 bootstrapper 来说是错的。
应用设置
聚合高级隐私(AAP):关闭。这是大头。AAP 打开时,AppsFlyer 只向合作伙伴发送聚合的匿名数据——这会杀死 iOS 实时上报。在应用层面把它关掉。
时区:设成你的上报时区(我的是 Europe/Berlin),这样营收和你的一天对齐。
合作伙伴集成(TikTok)
把 TikTok 配置为 Advanced SRN 合作伙伴。
Advanced Privacy 开关(合作伙伴层面):也关闭。应用层面的 AAP 和合作伙伴层面的开关都得关。
权限——给 TikTok 全部这些:
广告网络权限:开
配置集成:开
配置应用内事件回传:开
访问聚合转化数据:开
访问聚合应用内事件数据:开
访问聚合营收数据:开
使用成本导入:开
SKAN Conversion Studio
SKAN 测量:开
支持匿名用户:开
(等实时上报解锁后,你会在 TikTok 里把 SKAN 关掉——下面细说。这里先把它配置好作为兜底。)
第 3 步——RevenueCat → AppsFlyer 集成
在 RevenueCat 里,前往 Integrations → AppsFlyer 并启用它。
填入你的 iOS App key 和 iOS App ID。
使用默认事件名。
现在 RevenueCat 会自动把 rc_initial_purchase_event、rc_renewal_event 和 rc_cancellation_event 以服务端方式发给 AppsFlyer——前提是 AppsFlyer ID 被正确设置为一个订阅者属性。最后那部分是一步代码,也是会悄悄坏掉的那一步。
第 4 步——代码(没人写文档的部分)
这是胶水。如果你是 vibe coding,把这些作为硬性要求贴进你的设置里,因为那些"显而易见"的做法是错的。
用正确的方式初始化 AppsFlyer
懒加载 AppsFlyer SDK,这样它不会在 Expo Go 里崩溃。
在应用启动时初始化,但先检查 ATT 状态。如果它还是 undetermined,就先等(最多约 60 秒)用户的 ATT 回答再初始化。这让归因在有或没有 IDFA 的情况下都能正确发生。
把 AppsFlyer 链接到 RevenueCat——用对方法
初始化之后,拿到 AppsFlyer UID 并用这个传给 RevenueCat:✅ Purchases.setAppsflyerID(uid) ❌ 不要用 setAttributes({ $appsflyer_id: uid })——那会创建一个无效的属性名,整条服务端管道就悄悄失败了。
在打开付费墙之前重新同步同一个 ID(一个小小的 syncAppsFlyerIdToRevenueCat() 辅助函数)。双保险。
追踪这些事件
af_content_view → 打开付费墙时
af_complete_registration → 注册后
af_login → 登录时
af_start_trial → 试用开始时
af_purchase → 直接购买时
每个购买事件都必须把 Apple Transaction ID 作为 af_order_id 传进去,用于去重。同时在本地(例如 AsyncStorage)做防护,让同一个事件不会触发两次。
为什么 SDK 和 RevenueCat 都要发事件:SDK 捕获实时购买;RevenueCat 捕获 SDK 永远看不到的续订和取消。因为两者用的是同一个 Apple Transaction ID,AppsFlyer 会自动去重。你得到全量覆盖,还不会有重复计数。
还有一个坑:购买成功之后,调用 Purchases.logIn() 传入你真正的后端用户 ID(我的情况是 Supabase),而不是匿名的 RevenueCat ID——否则你在保存订阅时会撞上行级安全(RLS)违规。
第 5 步——ATT 提示和 Info.plist
在一个自然的时刻展示 ATT 提示——我是在认证页面的"Get Started"上触发的。
你的 Info.plist 需要:追踪用途描述字符串、AppsFlyer SKAN 端点(https://appsflyer-skadnetwork.com)、以及 AppsFlyer 合作伙伴的完整 SKAdNetwork ID 列表——包括所有 TikTok/ByteDance 的 ID(238da6jt44、899vrgt9g8、mj797d8u6f、22mmun2rn5)。
没有那些 ID,iOS 字面上无法把 SKAN 回传发给 TikTok。这是一个常见的静默失败。
第 6 步——修复"0 转化"的那个开关
这是让我耗了几周的那个。
在 TikTok Events Manager 里,Primary Signal 必须设为 AppsFlyer(MMP)——而不是 TikTok App Events SDK。
如果你两个都装了,TikTok 默认去 SDK,即便 AppsFlyer 把一切都看对了,也显示 0 转化。这个开关不会自动发生。我不得不让 TikTok 支持手动把它翻转过来(提了 support ticket 之类的)。
如果你的 Ads Manager 显示零转化,但你的 MMP 显示有归因——原因几乎总是这个。
第 7 步——Campaign 结构
以 App Promotion 为目标,创建一个 iOS 14.5+ 专属 Campaign。
以 Subscribe 作为转化目标去优化。
一旦 TikTok 显示"你的应用有资格进行 iOS 实时上报",就把 SKAN 归因关掉。现在转化近乎实时地出现,而不是被 Apple 的隐私阈值延迟和节流。实时信号 = 更快、更聪明的算法优化。这是小预算上最大的一次解锁。
AppsFlyer 里的事件回传映射:
af_complete_registration → Registration(无值/营收,所有媒体来源)
af_content_view → ViewContent(有值,无营收,所有媒体来源)
af_purchase → Subscribe(有值 + 营收,所有媒体来源)
af_start_trial → StartTrial(有值 + 营收,所有媒体来源)
af_skad_revenue → Subscribe(有值 + 营收,仅此合作伙伴)
rc_initial_purchase_event → Subscribe(有值 + 营收,仅此合作伙伴)
我实际上怎么跑这些 campaign
上面的设置是地基。下面是我在地基之上怎么花钱的:
直接进美国市场。别像我一样在欧洲耗几个月。好几个月我都在跑德国和一堆东拼西凑的欧洲国家,为每一单转化打平而拼。我切换到美国的那一天,一切都变了——购买意图高得多,campaign 几乎立刻盈利。同一个应用、同样的创意,完全不同的经济学。如果我能重来,我会彻底跳过欧洲市场,第一天就上美国。
语言:永远 All。别按语言切碎。
早期阶段跳过 Target CPA。让它学。
学习期:5–7 天。别碰它,别慌。
预算爬坡:从约 €40/天开始跑约 4 天,然后逐步放大。突然跳变会重置学习。
创意健康检查:一条好创意能让 40–60%+ 的观众把一个 6 秒视频看到 100%。
Smart+:跑 1–2 周,约 5 条创意,杀掉输家,留下赢家。
每 7–14 天轮换创意以对抗疲劳。
精简版
用 MMP(AppsFlyer),不只是 TikTok SDK。
关掉聚合高级隐私——应用层面和合作伙伴层面都关。
用 Purchases.setAppsflyerID()——永远不要用 setAttributes。
把所有 TikTok SKAdNetwork ID 放进你的 Info.plist。
手动把 TikTok 的 Primary Signal 设为 MMP。这修好那个可怕的"0 转化"。
一旦有资格,关掉 SKAN 以获得实时上报。
在做任何判断之前,给它 5–7 天的学习期。
小预算上的 SKAN 是个陷阱——Apple 的隐私阈值只在约 90 次安装/天才正常。通过 MMP 的实时上报,才是让一个 bootstrapper 的预算真正找到买家的东西。
这就是全部。花了我 6 个月。应该只花你一个下午。
我在公开地 build in public——边做边分享每一个失败和数字。如果这有用,跟上我。🚐 标签:# X # Tiktok # 广告 # 付费墙 # 移动应用 # 订阅 # 移动应用 相关文章 如何用完全没测过的创意开始 TikTok Ads(几周内印 $$$) 这是我为独立 iOS 开发者写的 TikTok ads 系列的第 3 部分。如果你还没读前两篇,从那里开始——这篇直接建立在它们之上: 移动应用 Tiktok 广告 付费墙
原文参考:https://maxed.wiki/posts/the-tiktok-ads-setup-to-actually-print-money-it-took-me-6-months-to-get-right-skip-the-pain/ (Maxed.wiki,本页为站内中文整理)