真正能印钱的 TikTok 广告设置——我花了 6 个月才调好(别再走弯路)

The TikTok Ads Setup to Actually Print Money - It Took Me 6 Months to Get Right (Skip the Pain)

中文译文 · 9k 字

一句话摘要

标题主题:花 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,本页为站内中文整理)