App Store Connect 能告诉你每个 App 卖了多少,但它不知道这个 App 运行要花多少钱,所以回答不了“这个 App 赚没赚钱”。
MarginDeck 1.9 可以把每个 App 每月的净收入导入进来,和你记录的成本放在一起。有两种方式:连接 API 密钥,或者导入月报文件。两种方式保存的是同一份记录,两种都用,同一个月也不会算两次。
MarginDeck 读取什么
两种方式读取的都是 Apple 的销售总报告(Summary Sales Report),也就是“销售和趋势报告”里可以下载的那份报告。
- 净收入:每一行按 Developer Proceeds × Units 计算。退款的 Units 是负数,会从当月扣掉。
- 按 App 合计:App 内购买和订阅都算进所属的 App。
- 只算付费销售:免费下载和更新不计入。
- 按太平洋时间的自然月,和 Apple 报告的日期一致。
- 按各地区商店的币种:澳大利亚的销售是 AUD,英国的是 GBP。MarginDeck 保留每种币种的原币金额,算合计时用欧洲央行的月度参考汇率换算。
App Store 的部分币种,欧洲央行不发布汇率,比如 TWD、SAR、AED、VND。这些币种的收入会按原币金额保存,标为“不计入”,不会被计入合计,也不会按估算的汇率换算。
销售报告记录的是卖出了多少。Apple 实际付给你的钱按财务报告结算,用的是 Apple 的财务月、最终调整和付款当天的汇率。所以 MarginDeck 里某个月的数字,和 Apple 的付款可能有一点差别(Apple 对两者区别的说明)。
方式一:连接 App Store Connect
- 在 App Store Connect 打开 用户和访问 › 集成 › 团队密钥。如果是第一次用 API,要先由账户持有人申请 API 访问。
- 生成一把密钥,名称填 MarginDeck,访问权限选 销售和报告。只需要这一项,不需要财务或管理权限。
- 下载
.p8文件,复制 Issuer ID 和密钥 ID。.p8文件只能下载一次。 - 在 付款和财务报告 页面左上角,复制“供应商 #”后面的数字。
- 在 MarginDeck 打开 设置 › 收入来源 › App Store Connect,选 连接 App Store Connect。填入两个 ID 和供应商编号,选择
.p8文件,再选 检查并保存。
MarginDeck 会先用这把密钥试一次,确认能用后存进这台 Mac 的钥匙串,然后开始第一次同步。
| 同步 | 读取的范围 |
|---|---|
| 第一次同步 | 过去 12 个月。Apple 的销售报告只保留一年。 |
| 之后每次同步 | 最近 3 个月,用来更新 Apple 之后做的调整 |
本月的数字是 Apple 日报截至昨天的合计。上个月在每月 8 号之前也按日报合计,从 8 号起改读 Apple 的月报。
要同步时,在收入页或设置里选 同步收入。打开仪表盘时也会自动同步,最多每 6 小时一次。某个 App 第一次出现时,MarginDeck 会问它属于哪个产品;之后同步就直接保存,并告诉你有什么变化,比如新增了一个月或更新了一个月。
方式二:导入销售月报
这种方式不需要 API 密钥,适合不想创建密钥的时候。
- 在 App Store Connect 打开 趋势,在左侧选 销售和趋势报告。在 销售总报告 一栏选好供应商,点日期改为按月并选好月份,然后点 下载。文件名类似
S_M_85412345_20261031.txt.gz;如果文件名以S_D_开头,说明下载的是日报。 - 把文件拖到 MarginDeck 的收入页,或者选 + › 导入报表文件…。
.txt.gz和解压后的.txt都可以,也可以一次导入多个文件。 - 检查预览。每个月会标出 新增、替换(并显示原来保存的金额)或 没有变化。第一次导入时,为每个 App 选择对应的产品,然后选 保存导入结果。
导入时请保留原来的文件名。MarginDeck 靠文件名里的供应商编号(S_M_<供应商编号>_…)判断报告属于哪个账户。目前只支持销售月报;导入日报或周报会提示你下载月报。“付款和财务报告”页面里下载的是另一种报告,MarginDeck 读不了。
同一个月再导入一次,或者导入已经同步过的月份,都是替换,不会叠加。
如果你还有 Gumroad、Paddle、Lemon Squeezy 等平台的收入,可以把报表交给 Claude 或 Codex,再在 MarginDeck 里整批确认。
同时使用 RevenueCat
RevenueCat 每个项目每月只给一个合计,一个项目里可能同时有 App Store、Google Play 和 Stripe 的收入,没法按 App 拆开。所以每个月,MarginDeck 要么算 RevenueCat 的合计,要么算 App Store 报告,不会两边都算。
MarginDeck 通过对比 bundle ID 判断 App 是否在某个 RevenueCat 项目里。为此需要满足两点:
- RevenueCat 已按 1.9 的权限连接。如果设置里 RevenueCat 旁边显示“重新连接”,重新连接一次即可。
- 已连接 App Store Connect。SKU 不一定等于 bundle ID,只有 App Store Connect 能告诉 MarginDeck 每个 App 的 bundle ID。如果只导入报表文件,MarginDeck 会对每个 App 问一次:“这个 App 的收入已经算在 RevenueCat 里了吗?”
对于包含在 RevenueCat 项目里的 App,每个月按下面的规则处理:
| RevenueCat 当月 | App Store 当月 |
|---|---|
| 有收入 | 灰色显示“已含在 RevenueCat,不计入” |
| 没有记录 | 计入 |
| 是 0 | 计入。已创建但没在用的项目每个月都是 0。 |
要修改判断结果,在收入页打开这个 App 对应的产品,点任意一个月旁边的 ⋯,在 RevenueCat 下选“自动判断”、“不在 RevenueCat 里”,或者包含这个 App 的 RevenueCat 项目。修改会对这个 App 的所有月份生效。
RevenueCat 这一侧的计算,见从 RevenueCat 收入算出每个 App 的利润。
哪些数据只留在你的 Mac 上
密钥保存在这台 Mac 的钥匙串里,不会进入备份。请求从你的 Mac 直接发给 Apple。每个 App 每个月,MarginDeck 只保存各币种的净收入合计,以及 App 名称、SKU、bundle ID 和你的供应商编号。断开连接会删除密钥,已经保存的月份会保留。
常见问题
密钥需要什么权限?
只需要“销售和报告”,而且必须是团队密钥。个人密钥读取不了销售报告。
为什么某个月和 Apple 付给我的钱对不上?
销售报告和付款按不同的月份和汇率结算(见上文)。几个月合起来看,两者应该比较接近。
为什么有一行显示“TWD 没有汇率,不计入”?
欧洲央行不发布这个币种的汇率,所以 MarginDeck 没法把它换算成你的显示币种。原币金额仍然可以看到,但合计和利润里不包含它。
能导入一年以前的月份吗?
销售报告不行。Apple 的日报、周报和月报都只保留一年(报告可用时间)。更早的收入可以手动录入。
导入文件必须先连接 API 密钥吗?
不用,报表文件可以单独导入。如果希望 MarginDeck 自动更新最近几个月,或者自动和 RevenueCat 匹配 App,再连接 App Store Connect。