All posts
PRICING

Reading Apple Sales and Trends for global pricing decisions

A practical guide to extracting territory-level pricing signals from Apple's Sales and Trends reports — covering yield-per-unit analysis, voluntary vs involuntary churn signals, and how to automate the whole pipeline with the App Store Connect API.

By the AppsOps team · · 8 min read

Most iOS developers check their total revenue dashboard and call it a day. But buried in Apple's Sales and Trends reports is territory-level data that can fundamentally reshape every pricing decision you make — if you know how to read it.

This guide walks through what these reports actually contain, how to extract meaningful pricing signals from them, and how to automate the analysis using the App Store Connect API. By the end, you will have a repeatable framework for turning raw Apple data into concrete price-tier decisions.

What's inside Apple Sales and Trends reports

Apple gives developers access to several distinct report types under the Sales and Trends umbrella. For pricing decisions, three are most useful: the Sales report, the Subscription report, and the Subscription Events report.

The Sales report (available daily or weekly) is the most fundamental: line-by-line transaction records that include units sold, customer price, developer proceeds, territory (via a two-letter Country Code), product type identifier (paid download, free download, redownload, in-app purchase, and others), and both customer-facing and developer-facing currency fields. Every row represents one SKU in one territory on one date.

The Subscription report (daily or weekly) gives you active subscriber counts broken down by territory, subscription duration, and status — free trial, introductory offer, standard paid. It is your snapshot of the subscriber base at any given point in time and the starting point for cohort-style retention analysis by market.

The Subscription Events report (daily or weekly) records individual lifecycle events — New Subscription, Renewal, Cancel, Billing Retry, Grace Period, Resubscribe — again with a Country Code on every row. This is where churn patterns by market become visible, and where the distinction between voluntary and involuntary churn starts to emerge.

All three are delivered as gzip-compressed, tab-separated value (.tsv) files. Not the most developer-friendly format, but straightforward to parse with Python, R, or any spreadsheet tool that handles TSV imports. The column headers are included in each file, so field discovery is self-contained.

Report type Cadence Key columns for pricing Best use
Sales Daily / Weekly Country Code, Units, Developer Proceeds, Customer Price, Customer Currency Revenue per territory, yield per unit
Subscription Daily / Weekly Country Code, Active Standard Price Paid Subscriptions, Active Free Trial Subscriptions Subscriber counts and base size by market
Subscription Events Daily / Weekly Country Code, Event, Subscription Duration Churn, billing retry, and resubscribe signals by market

Territory-level data as a pricing signal

The Country Code column is the lens through which pricing work becomes actionable. Once you segment your sales data by country, three patterns are worth watching closely.

The yield-per-unit ratio. Divide Developer Proceeds by Units for a given territory and time window. In a market where your pricing is well-calibrated, this figure should sit close to your list price multiplied by 0.85 (Apple's Small Business Program rate, applicable to most indie developers earning under $1M annually) or 0.70 (the standard 30% commission rate). A figure materially below that ratio often indicates the territory is being served by a lower price tier than you intended, or that exchange-rate movements have eroded the effective local price. A figure above it can point to an untested opportunity to move to a higher tier.

Volume without revenue. Some territories show strong unit numbers but contribute a disproportionately small share of total proceeds. This is the classic symptom of a currency mismatch: your app is priced in USD, Apple converts it to local currency using its tier system, and the resulting local price may be lower than you intended — leaving revenue on the table. Research from Phiture and reports from RevenueCat have both pointed to meaningful conversion and retention improvements when developers set genuinely local prices rather than relying on Apple's automatic currency conversion alone.

The PPP gap. Cross-reference your territory proceeds-per-unit against World Bank Purchasing Power Parity indices. If your proceeds-per-unit in Brazil, Indonesia, or Egypt is running at 15–25% of your US figure, that delta often maps closely to known PPP differentials — suggesting your app may simply be unaffordable for a large share of the addressable market in those countries. That is a pricing decision, not a product one.

Quick diagnostic: Pull 90 days of weekly Sales report data. Sort your territories by unit count, descending. For your top 10 territories by volume, calculate Developer Proceeds ÷ Units. A 3× or higher spread between your highest-yield territory (typically the US, UK, or Australia) and your lowest-yield territory in that same top-10 list is a strong signal that territory-specific pricing adjustments will move the needle on total revenue.

For context on how Apple's tier structure maps list prices to local currencies in the first place, see our guide to the Apple price tier system.

Reading subscription events for churn patterns by market

The Subscription Events report is where pricing stress shows up most clearly for subscription businesses. When subscribers cancel — particularly in the first or second renewal period — the territory distribution of those cancellations can tell you whether you are facing a price problem or a product problem.

A useful starting metric: calculate a rough renewal rate per territory as Renewals ÷ (Renewals + Cancels) for a rolling 90-day window. A territory where this ratio sits 15–20 percentage points below your overall average warrants closer attention. The next step is to distinguish voluntary churn from involuntary churn, because the remedies are entirely different.

Voluntary churn shows up as Cancel events with no subsequent Resubscribe activity in the weeks following. This is the price sensitivity signal: customers are actively choosing not to renew. When this pattern is concentrated in markets with lower per-capita incomes, or in markets where your yield-per-unit from the Sales report is already below your overall average, the most likely explanation is that the renewal price exceeds what the local market will sustain. The resolution is typically a lower localized price tier or a discounted annual plan — not a better onboarding email sequence.

Involuntary churn presents differently: high Billing Retry counts, extended Grace Period events, and eventually a subscription expiration without a corresponding Cancel event preceding it. This is payment infrastructure failure, more common in markets where international credit cards are less prevalent — parts of Southeast Asia, Latin America, and sub-Saharan Africa. Apple has progressively expanded local payment method support across more territories, and involuntary churn in some of these markets has declined as that coverage has grown.

45+territories where Apple supports local payment methods beyond international credit cards

Getting these two churn types confused leads to the wrong interventions. Cutting prices to fix involuntary churn will not recover those subscribers; and adding lifecycle notifications to address price-driven voluntary churn will not help either. The Subscription Events report is the primary tool that separates the two signals.

For a deeper look at the markets where voluntary churn is structurally elevated due to PPP gaps, see our post on why iOS subscription churn is higher in low-PPP markets.

Automating the analysis with the App Store Connect API

Downloading reports manually through the App Store Connect web interface is fine for a one-time audit. For ongoing pricing work — monitoring territory trends month-over-month, evaluating the revenue impact of a price change two weeks after you made it, or running a structured experiment across markets — you need a repeatable automated pipeline.

The App Store Connect API exposes a GET /v1/salesReports endpoint. The parameters that matter most:

Authentication requires a signed JWT using an API key with the Finance Manager role. A complete walkthrough of the JWT signing and token generation process is in our post on App Store Connect API authentication.

Once token generation is working, a minimal Python script to pull and parse a weekly sales summary by territory looks roughly like this:

import requests, gzip, io, csv
from collections import defaultdict

headers = {"Authorization": f"Bearer {jwt_token}"}
params = {
    "filter[frequency]": "WEEKLY",
    "filter[reportType]": "SALES",
    "filter[reportSubType]": "SUMMARY",
    "filter[vendorNumber]": "YOUR_VENDOR_NUMBER",
    "filter[reportDate]": "2026-05-10",
}
resp = requests.get(
    "https://api.appstoreconnect.apple.com/v1/salesReports",
    headers=headers,
    params=params,
)
content = gzip.decompress(resp.content)
reader = csv.DictReader(
    io.StringIO(content.decode("utf-8")), delimiter="\t"
)

by_territory = defaultdict(lambda: {"units": 0, "proceeds": 0.0})
for row in reader:
    cc = row["Country Code"]
    by_territory[cc]["units"] += int(row["Units"] or 0)
    by_territory[cc]["proceeds"] += float(row["Developer Proceeds"] or 0)

for cc, d in sorted(by_territory.items(), key=lambda x: -x[1]["proceeds"]):
    ypu = d["proceeds"] / d["units"] if d["units"] else 0
    print(f"{cc}: {d['units']} units | ${d['proceeds']:.2f} | ${ypu:.2f}/unit")

This produces a ranked list of territories by total proceeds, with yield-per-unit as a pricing health indicator for each market. Pipe the output into a spreadsheet for visualization, or feed it as a regular data input into your pricing review process.

For teams who want this analysis without building and maintaining the pipeline themselves, AppsOps's territory monitoring pulls Sales and Trends data automatically and surfaces pricing gaps across your active markets, including alerts when a territory's yield-per-unit ratio changes materially week-over-week.

From data to pricing decisions: a working framework

Sales and Trends data answers what is happening — it does not automatically prescribe a remedy. But combined with the churn signals from the Subscription Events report, the following patterns cover most scenarios you will encounter.

High volume, low yield-per-unit. Your price tier is likely misaligned with local currency expectations. The most direct intervention is testing a lower price tier for that territory. Apple's per-territory pricing lets you set specific prices independently; a single-territory price change is a contained experiment. For details on how to set this up systematically, see our guide to territory-specific pricing on AppsOps.

Low volume, acceptable yield-per-unit. Pricing is probably not the constraint. The lever here is localized metadata — App Store screenshots, description copy, and keyword optimization for that market's language and search behavior. Cutting prices to solve a discoverability problem is a revenue cost without a corresponding benefit.

High cancel rate, low billing retry rate. Voluntary churn. Price sensitivity is the likely driver, particularly in markets where your yield-per-unit is already below your portfolio average. Annual subscription pricing at a meaningful discount relative to monthly has been documented in RevenueCat's reporting to reduce churn substantially across most markets — and is worth testing before touching the base price tier.

High billing retry rate, persistent grace period events. Involuntary churn from payment failures. Reducing prices will not recover these subscribers; the constraint is payment method availability, not willingness to pay. Monitor which Apple-supported local payment methods are available in that territory and ensure your product page is not creating unnecessary friction in the purchase flow.

Running this diagnostic quarterly — or within two weeks of a significant exchange rate movement in a market that matters to your revenue mix — keeps your pricing calibrated as currency conditions shift. Exchange rate moves can flip a well-calibrated territory price into an outlier without any action on your part. Our post on how currency conversion fails for global iOS pricing covers this failure mode in detail.

Sources and further reading

Share this post

Ready to put this into practice?

appsops.store gives you PPP-adjusted pricing across all 175+ App Store territories, App Store Connect API automation, and 39-language localization — all from one dashboard.

Start free →

Related reading