PAYATHON 2026

如何获取每个 iOS app 的月度收入报告?

支付阿杰

结论

可以按 app 统计月度收入,但不能直接使用汇总付款金额。需要下载 App Store Connect 中对应月份和地区的详细财务报告,通过 Apple Identifier 或 Vendor Identifier(通常可与 app 的 SKU 对应)区分应用,再汇总各行的 Extended Partner Share。

这里得到的是各 app 在财务报告中的开发者应得款,不一定与当月银行到账金额逐分一致。税款、预扣税、汇率换算、调整项和付款周期都可能造成差额。

操作步骤

在 App Store Connect 中依次进入:

Payments and Financial Reports → 选择财务月份和地区 → 下载详细报告

不要只看页面上按国家或地区显示的付款汇总。下载的压缩文件通常包含制表符分隔的明细数据,每行对应某个 app、内购项目或订阅产品在特定市场的结算记录。

主要会用到这些字段:

  • Apple Identifier:Apple 为 app 分配的数字 ID。
  • Vendor Identifier:开发者设置的产品标识。对于 app,通常可以通过 SKU 建立映射。
  • Title:app 或内购项目的名称,不适合单独作为唯一标识。
  • Quantity:结算数量,退款记录可能是负数。
  • Extended Partner Share:该行对应的开发者应得金额。
  • Partner Share Currency:开发者应得金额的币种。
  • Sales or Return:销售或退款类型。

先建立 app 与标识符的对应关系,例如:

AppApple IdentifierSKU
App A123456789company.app.a
App B987654321company.app.b

然后按以下维度汇总:

月份 + Apple Identifier(或 SKU)+ Partner Share Currency

同一个 app 的内购和订阅可能有各自的产品标识。如果分包商的分成包含这些收入,还需要把相关内购产品映射到所属 app,不能只统计 app 本身的下载记录。

自动汇总示例

下面的 Python 示例读取解压后的 TSV 财务报告,并按 app 和币种累计 Extended Partner Share。不同报告类型或时期的字段名称可能有所变化,使用前要先检查下载文件的实际表头。

import csv
from collections import defaultdict
from decimal import Decimal

APP_MAPPING = {
    "123456789": "App A",
    "987654321": "App B",
}

totals = defaultdict(lambda: Decimal("0"))

with open("financial_report.txt", "r", encoding="utf-8-sig", newline="") as file:
    reader = csv.DictReader(file, delimiter="\t")

    for row in reader:
        apple_id = row["Apple Identifier"].strip()
        app_name = APP_MAPPING.get(apple_id)

        if app_name is None:
            continue

        currency = row["Partner Share Currency"].strip()
        amount = Decimal(row["Extended Partner Share"].strip())

        totals[(app_name, currency)] += amount

for (app_name, currency), amount in sorted(totals.items()):
    print(f"{app_name}: {amount} {currency}")

如果报告中的金额列不是 Extended Partner Share,应根据实际表头选择表示整行结算金额的字段。不要在未核对字段定义时直接使用 Customer Price × Quantity,因为消费者价格可能包含税费,并不等于开发者的实际所得。

通过 App Store Connect API 下载

如果需要长期进行月度结算,可以使用 App Store Connect API 自动下载财务报告。相关接口是:

GET /v1/financeReports

请求通常需要指定厂商编号、报告日期、报告类型和地区代码,并使用 App Store Connect API Key 生成的 JWT 进行认证。接口要求可能调整,具体可用参数和日期格式应以当前的 App Store Connect API 文档为准。

下载结果通常是压缩的 TSV 数据,可以按以下流程处理:

下载各地区财务报告
        ↓
解压并读取 TSV
        ↓
把 app、内购和订阅标识映射到所属 app
        ↓
按 app 与结算币种汇总 Extended Partner Share
        ↓
处理税款、调整项和舍入差异
        ↓
生成分包商月度结算单

为什么不能直接按页面付款金额拆分

付款页面显示的是结算主体最终收到的地区级付款,并不是按 app 划分的账本。实际付款可能包括:

  • 多个 app 和内购项目合并后的收入;
  • 退款以及以前月份的调整;
  • 税款或预扣税;
  • 不同商店货币到结算货币的转换;
  • 因最低付款门槛产生的跨月结转;
  • 银行费用或其他无法直接归入单个 app 的项目。

因此,分包商结算通常应以详细财务报告中的 app 级应得款为依据,而不是把银行到账金额简单地按比例拆分。

注意事项

  • 最终收入应使用财务报告计算。Sales and Trends 更适合查看销量和预估收入,其中的数据可能还没有完成财务结算。
  • 不同币种必须分别求和。除非合同明确约定汇率来源和换算日期,否则不能直接相加。
  • 退款和冲销要保留负数,不能取绝对值。
  • app 改名后,Title 也会变化,最好使用 Apple Identifier、SKU 或稳定的产品映射。
  • 订阅、消耗型内购等通常有独立的产品标识,需要明确这些收入是否计入对应 app。
  • 如果要求”各 app 收入之和必须等于银行到账金额”,还需要另行制定税款、汇兑差额和公共调整项的分摊规则。App Store Connect 不会自动完成这种合同层面的分账。

备注:内容仅供参考。